diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index c0f9ae0..122bfc6 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -249,7 +249,7 @@
       }
       channel.sendResponse(Response.unknownRequest(request));
     }, (exception, stackTrace) {
-      AnalysisEngine.instance.instrumentationService.logException(
+      instrumentationService.logException(
         FatalException(
           'Failed to handle request: ${request.method}',
           exception,
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index 6ce204b..5589872 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -39,7 +39,6 @@
 import 'package:analyzer/src/dart/ast/element_locator.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
@@ -336,7 +335,7 @@
     return driver
         .getResult(path, sendCachedToStream: sendCachedToStream)
         .catchError((e, st) {
-      AnalysisEngine.instance.instrumentationService.logException(e, st);
+      instrumentationService.logException(e, st);
       return null;
     });
   }
@@ -351,7 +350,7 @@
         crashReportingAttachmentsBuilder.forExceptionResult(result);
 
     // TODO(39284): should this exception be silent?
-    AnalysisEngine.instance.instrumentationService.logException(
+    instrumentationService.logException(
       SilentException.wrapInMessage(message, result.exception),
       null,
       attachments,
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 94f48ef..ce8ab76 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -606,7 +606,7 @@
   /// On windows, the directory watcher may overflow, and we must recover.
   void _handleWatchInterruption(dynamic error, StackTrace stackTrace) {
     // We've handled the error, so we only have to log it.
-    AnalysisEngine.instance.instrumentationService
+    _instrumentationService
         .logError('Watcher error; refreshing contexts.\n$error\n$stackTrace');
     // TODO(mfairhurst): Optimize this, or perhaps be less complete.
     refresh();
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 6c26a54..c77e04a 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -153,17 +153,16 @@
   /// given [offset].
   YamlCompletionResults computeYamlSuggestions(String file, int offset) {
     var provider = server.resourceProvider;
-    if (file_paths.isAnalysisOptionsYaml(provider.pathContext, file)) {
+    var pathContext = provider.pathContext;
+    if (file_paths.isAnalysisOptionsYaml(pathContext, file)) {
       var generator = AnalysisOptionsGenerator(provider);
       return generator.getSuggestions(file, offset);
-    }
-    var fileName = provider.pathContext.basename(file);
-    if (fileName == AnalysisEngine.PUBSPEC_YAML_FILE) {
-      var generator = PubspecGenerator(provider);
-      return generator.getSuggestions(file, offset);
-    } else if (fileName == AnalysisEngine.FIX_DATA_FILE) {
+    } else if (file_paths.isFixDataYaml(pathContext, file)) {
       var generator = FixDataGenerator(provider);
       return generator.getSuggestions(file, offset);
+    } else if (file_paths.isPubspecYaml(pathContext, file)) {
+      var generator = PubspecGenerator(provider);
+      return generator.getSuggestions(file, offset);
     }
     return const YamlCompletionResults.empty();
   }
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
index a5d894f..74085faa 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
@@ -7,7 +7,6 @@
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/src/generated/engine.dart';
 
 void sendFlutterNotificationOutline(
     AnalysisServer server, ResolvedUnitResult resolvedUnit) {
@@ -28,8 +27,7 @@
   try {
     f();
   } catch (exception, stackTrace) {
-    AnalysisEngine.instance.instrumentationService.logException(
-        CaughtException.withMessage(
-            'Failed to send notification', exception, stackTrace));
+    server.instrumentationService.logException(CaughtException.withMessage(
+        'Failed to send notification', exception, stackTrace));
   }
 }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
index b84ae47..ea6f4c2 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -23,8 +23,8 @@
 import 'package:analysis_server/src/services/completion/yaml/yaml_completion_generator.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/source/line_info.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
 
@@ -97,7 +97,6 @@
     return offset.mapResult((offset) async {
       Future<ErrorOr<List<CompletionItem>>> serverResultsFuture;
       final pathContext = server.resourceProvider.pathContext;
-      final filename = pathContext.basename(path.result);
       final fileExtension = pathContext.extension(path.result);
 
       if (fileExtension == '.dart' && !unit.isError) {
@@ -111,16 +110,12 @@
         );
       } else if (fileExtension == '.yaml') {
         YamlCompletionGenerator generator;
-        switch (filename) {
-          case AnalysisEngine.PUBSPEC_YAML_FILE:
-            generator = PubspecGenerator(server.resourceProvider);
-            break;
-          case AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE:
-            generator = AnalysisOptionsGenerator(server.resourceProvider);
-            break;
-          case AnalysisEngine.FIX_DATA_FILE:
-            generator = FixDataGenerator(server.resourceProvider);
-            break;
+        if (file_paths.isAnalysisOptionsYaml(pathContext, path.result)) {
+          generator = AnalysisOptionsGenerator(server.resourceProvider);
+        } else if (file_paths.isFixDataYaml(pathContext, path.result)) {
+          generator = FixDataGenerator(server.resourceProvider);
+        } else if (file_paths.isPubspecYaml(pathContext, path.result)) {
+          generator = PubspecGenerator(server.resourceProvider);
         }
         if (generator != null) {
           serverResultsFuture = _getServerYamlItems(
diff --git a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
index 2f04089..d243989 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -42,7 +42,6 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
 import 'package:analyzer/src/dart/analysis/status.dart' as nd;
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
@@ -382,7 +381,7 @@
       false,
     ));
 
-    AnalysisEngine.instance.instrumentationService.logException(
+    instrumentationService.logException(
       FatalException(
         message,
         exception,
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index e6672f4..aa6443e 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/exception/exception.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 Future<void> scheduleImplementedNotification(
@@ -32,11 +31,10 @@
             file, computer.classes, computer.members);
         server.sendNotification(params.toNotification());
       } catch (exception, stackTrace) {
-        AnalysisEngine.instance.instrumentationService.logException(
-            CaughtException.withMessage(
-                'Failed to send analysis.implemented notification.',
-                exception,
-                stackTrace));
+        server.instrumentationService.logException(CaughtException.withMessage(
+            'Failed to send analysis.implemented notification.',
+            exception,
+            stackTrace));
       }
     }
   }
@@ -150,8 +148,7 @@
   try {
     f();
   } catch (exception, stackTrace) {
-    AnalysisEngine.instance.instrumentationService.logException(
-        CaughtException.withMessage(
-            'Failed to send notification', exception, stackTrace));
+    server.instrumentationService.logException(CaughtException.withMessage(
+        'Failed to send notification', exception, stackTrace));
   }
 }
diff --git a/pkg/analysis_server/test/edit/bulk_fixes_test.dart b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
index f22d513..6709373 100644
--- a/pkg/analysis_server/test/edit/bulk_fixes_test.dart
+++ b/pkg/analysis_server/test/edit/bulk_fixes_test.dart
@@ -7,7 +7,6 @@
 import 'package:analysis_server/protocol/protocol_generated.dart';
 import 'package:analysis_server/src/edit/edit_domain.dart';
 import 'package:analysis_server/src/services/linter/lint_names.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:linter/src/rules.dart';
 import 'package:meta/meta.dart';
@@ -93,14 +92,13 @@
 
     // Sub-project.
     var subprojectRoot = '$projectPath/test/data/subproject';
-    newFile('$subprojectRoot/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}',
-        content: '''
+    newOptionsFile(subprojectRoot, content: '''
 linter:
   rules:
     - annotate_overrides
 ''');
 
-    newFile('$subprojectRoot/${AnalysisEngine.PUBSPEC_YAML_FILE}', content: '''
+    newPubspecYamlFile(subprojectRoot, '''
 name: subproject
 ''');
 
@@ -118,14 +116,13 @@
 
   Future<void> test_annotateOverrides_subProject() async {
     var subprojectRoot = '$projectPath/test/data/subproject';
-    newFile('$subprojectRoot/${AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE}',
-        content: '''
+    newOptionsFile(subprojectRoot, content: '''
 linter:
   rules:
     - annotate_overrides
 ''');
 
-    newFile('$subprojectRoot/${AnalysisEngine.PUBSPEC_YAML_FILE}', content: '''
+    newPubspecYamlFile(subprojectRoot, '''
 name: subproject
 ''');
 
diff --git a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
index fc5ae08..0324041 100644
--- a/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/analysis_options_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -24,7 +24,7 @@
   }
 
   Future<void> test_option_warning_optionFile() async {
-    var options = sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+    var options = sourcePath(file_paths.analysisOptionsYaml);
     writeFile(options, '''
 linter:
   rules:
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index a7d5164..ffc3d8b 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -32,7 +32,7 @@
   }
 
   Future<void> test_simple_lint_optionsFile() async {
-    writeFile(sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE), '''
+    writeFile(sourcePath(file_paths.analysisOptionsYaml), '''
 linter:
   rules:
     - camel_case_types
diff --git a/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart b/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart
index 9b42331..4c4d82d 100644
--- a/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/bulk_fixes_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -29,7 +29,7 @@
   }
 
   Future<void> test_bulk_fix_override() async {
-    writeFile(sourcePath(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE), '''
+    writeFile(sourcePath(file_paths.analysisOptionsYaml), '''
 linter:
   rules:
     - annotate_overrides
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index 9e9cb06..6193114 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -5,10 +5,10 @@
 import 'dart:core';
 
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:source_span/source_span.dart';
 import 'package:yaml/yaml.dart';
@@ -22,7 +22,7 @@
   AnalysisOptionsProvider([this.sourceFactory]);
 
   /// Provide the options found in
-  /// [root]/[AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE].
+  /// [root]/[file_paths.analysisOptionsYaml].
   /// Recursively merge options referenced by an include directive
   /// and remove the include directive from the resulting options map.
   /// Return an empty options map if the file does not exist.
@@ -41,8 +41,7 @@
   /// then enclosing directories will be searched.
   File? getOptionsFile(Folder root) {
     for (var current in root.withAncestors) {
-      var name = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
-      var file = current.getChildAssumingFile(name);
+      var file = current.getChildAssumingFile(file_paths.analysisOptionsYaml);
       if (file.exists) {
         return file;
       }
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index b5e8a0a..0c6052a 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -28,6 +28,7 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/workspace/basic.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
 import 'package:analyzer/src/workspace/gn.dart';
@@ -356,8 +357,7 @@
 
     var folder = resourceProvider.getFolder(path);
     for (var current in folder.withAncestors) {
-      var name = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
-      var file = current.getChildAssumingFile(name);
+      var file = current.getChildAssumingFile(file_paths.analysisOptionsYaml);
       if (file.exists) {
         return file;
       }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index b05e502..f4749c5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/context/packages.dart';
 import 'package:analyzer/src/dart/analysis/context_root.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:glob/glob.dart';
@@ -23,18 +24,6 @@
 
 /// An implementation of a context locator.
 class ContextLocatorImpl implements ContextLocator {
-  /// The name of the analysis options file.
-  static const String ANALYSIS_OPTIONS_NAME = 'analysis_options.yaml';
-
-  /// The name of the `.dart_tool` directory.
-  static const String DOT_DART_TOOL_NAME = '.dart_tool';
-
-  /// The name of the packages file.
-  static const String PACKAGE_CONFIG_JSON_NAME = 'package_config.json';
-
-  /// The name of the packages file.
-  static const String DOT_PACKAGES_NAME = '.packages';
-
   /// The resource provider used to access the file system.
   final ResourceProvider resourceProvider;
 
@@ -112,7 +101,7 @@
       root.included.add(folder);
       root.excludedGlobs = _getExcludedGlobs(root);
       roots.add(root);
-      _createContextRootsIn(roots, folder, excludedFolders, root,
+      _createContextRootsIn(roots, {}, folder, excludedFolders, root,
           root.excludedGlobs, defaultOptionsFile, defaultPackagesFile);
     }
     Map<Folder, ContextRoot> rootMap = <Folder, ContextRoot>{};
@@ -151,6 +140,7 @@
   /// search for nested context roots.
   void _createContextRoots(
       List<ContextRoot> roots,
+      Set<String> visited,
       Folder folder,
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
@@ -192,8 +182,8 @@
       excludedGlobs = _getExcludedGlobs(root);
       root.excludedGlobs = excludedGlobs;
     }
-    _createContextRootsIn(roots, folder, excludedFolders, containingRoot,
-        excludedGlobs, optionsFile, packagesFile);
+    _createContextRootsIn(roots, visited, folder, excludedFolders,
+        containingRoot, excludedGlobs, optionsFile, packagesFile);
   }
 
   /// For each directory within the given [folder] that is neither in the list
@@ -204,6 +194,7 @@
   /// file will be used even if there is a local version of the file.
   void _createContextRootsIn(
       List<ContextRoot> roots,
+      Set<String> visited,
       Folder folder,
       List<Folder> excludedFolders,
       ContextRoot containingRoot,
@@ -223,6 +214,12 @@
       return false;
     }
 
+    // Stop infinite recursion via links.
+    var canonicalFolderPath = folder.resolveSymbolicLinksSync().path;
+    if (!visited.add(canonicalFolderPath)) {
+      return;
+    }
+
     //
     // Check each of the subdirectories to see whether a context root needs to
     // be added for it.
@@ -233,8 +230,8 @@
           if (isExcluded(child)) {
             containingRoot.excluded.add(child);
           } else {
-            _createContextRoots(roots, child, excludedFolders, containingRoot,
-                excludedGlobs, optionsFile, packagesFile);
+            _createContextRoots(roots, visited, child, excludedFolders,
+                containingRoot, excludedGlobs, optionsFile, packagesFile);
           }
         }
       }
@@ -348,19 +345,19 @@
   /// Return the analysis options file in the given [folder], or `null` if the
   /// folder does not contain an analysis options file.
   File? _getOptionsFile(Folder folder) =>
-      _getFile(folder, ANALYSIS_OPTIONS_NAME);
+      _getFile(folder, file_paths.analysisOptionsYaml);
 
   /// Return the packages file in the given [folder], or `null` if the folder
   /// does not contain a packages file.
   File? _getPackagesFile(Folder folder) {
     var file = folder
-        .getChildAssumingFolder(DOT_DART_TOOL_NAME)
-        .getChildAssumingFile(PACKAGE_CONFIG_JSON_NAME);
+        .getChildAssumingFolder(file_paths.dotDartTool)
+        .getChildAssumingFile(file_paths.packageConfigJson);
     if (file.exists) {
       return file;
     }
 
-    return _getFile(folder, DOT_PACKAGES_NAME);
+    return _getFile(folder, file_paths.dotPackages);
   }
 
   /// Add to the given lists of [folders] and [files] all of the resources in
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_root.dart b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
index 583fd5b..830e013 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_root.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_root.dart
@@ -56,13 +56,14 @@
 
   @override
   Iterable<String> analyzedFiles() sync* {
+    var visitedCanonicalPaths = <String>{};
     for (String path in includedPaths) {
       if (!_isExcluded(path)) {
         Resource resource = resourceProvider.getResource(path);
         if (resource is File) {
           yield path;
         } else if (resource is Folder) {
-          yield* _includedFilesInFolder(resource);
+          yield* _includedFilesInFolder(visitedCanonicalPaths, resource);
         } else {
           Type type = resource.runtimeType;
           throw StateError('Unknown resource at path "$path" ($type)');
@@ -78,14 +79,21 @@
 
   /// Return the absolute paths of all of the files that are included in the
   /// given [folder].
-  Iterable<String> _includedFilesInFolder(Folder folder) sync* {
+  Iterable<String> _includedFilesInFolder(
+    Set<String> visited,
+    Folder folder,
+  ) sync* {
     for (Resource resource in folder.getChildren()) {
       String path = resource.path;
       if (!_isExcluded(path)) {
         if (resource is File) {
           yield path;
         } else if (resource is Folder) {
-          yield* _includedFilesInFolder(resource);
+          var canonicalPath = resource.resolveSymbolicLinksSync().path;
+          if (visited.add(canonicalPath)) {
+            yield* _includedFilesInFolder(visited, resource);
+            visited.remove(canonicalPath);
+          }
         } else {
           Type type = resource.runtimeType;
           throw StateError('Unknown resource at path "$path" ($type)');
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index ef912afc..7fa0579 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -86,7 +86,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 127;
+  static const int DATA_VERSION = 128;
 
   /// The length of the list returned by [_computeDeclaredVariablesSignature].
   static const int _declaredVariablesSignatureLength = 4;
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index 7f59be6..b9658e1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -17,6 +17,10 @@
 }
 
 class _UnitApiSignatureComputer {
+  static const int _kindConstructorDeclaration = 1;
+  static const int _kindFieldDeclaration = 2;
+  static const int _kindMethodDeclaration = 3;
+
   final ApiSignature signature = ApiSignature();
 
   void addClassOrMixin(ClassOrMixinDeclaration node) {
@@ -28,12 +32,14 @@
     signature.addInt(node.members.length);
     for (var member in node.members) {
       if (member is ConstructorDeclaration) {
+        signature.addInt(_kindConstructorDeclaration);
         addTokens(member.beginToken, member.parameters.endToken);
         if (member.constKeyword != null) {
           addNodeList(member.initializers);
         }
         addNode(member.redirectedConstructor);
       } else if (member is FieldDeclaration) {
+        signature.addInt(_kindFieldDeclaration);
         var variableList = member.fields;
         addVariables(
           member,
@@ -41,6 +47,7 @@
           !member.isStatic && variableList.isFinal && hasConstConstructor,
         );
       } else if (member is MethodDeclaration) {
+        signature.addInt(_kindMethodDeclaration);
         addTokens(
           member.beginToken,
           (member.parameters ?? member.name).endToken,
@@ -48,7 +55,7 @@
         signature.addBool(member.body is EmptyFunctionBody);
         addFunctionBodyModifiers(member.body);
       } else {
-        addNode(member);
+        throw UnimplementedError('(${member.runtimeType}) $member');
       }
     }
 
diff --git a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
index 9e68e5b..79a9088 100644
--- a/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
+++ b/pkg/analyzer/lib/src/dart/micro/resolve_file.dart
@@ -22,8 +22,7 @@
 import 'package:analyzer/src/dart/micro/library_analyzer.dart';
 import 'package:analyzer/src/dart/micro/library_graph.dart';
 import 'package:analyzer/src/exception/exception.dart';
-import 'package:analyzer/src/generated/engine.dart'
-    show AnalysisEngine, AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/api_signature.dart';
 import 'package:analyzer/src/summary/format.dart';
@@ -33,6 +32,7 @@
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:analyzer/src/summary2/reference.dart';
 import 'package:analyzer/src/task/options.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer/src/workspace/workspace.dart';
 import 'package:yaml/yaml.dart';
@@ -487,8 +487,7 @@
 
   File? _findOptionsFile(Folder folder) {
     for (var current in folder.withAncestors) {
-      var name = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
-      var file = _getFile(current, name);
+      var file = _getFile(current, file_paths.analysisOptionsYaml);
       if (file != null) {
         return file;
       }
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 3848bf9..9a4d376 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -87,19 +87,6 @@
 /// The entry point for the functionality provided by the analysis engine. There
 /// is a single instance of this class.
 class AnalysisEngine {
-  /// The file name used for analysis options files.
-  static const String ANALYSIS_OPTIONS_YAML_FILE = 'analysis_options.yaml';
-
-  /// The file name used for the files containing the data for the data-driven
-  /// fixes.
-  static const String FIX_DATA_FILE = 'fix_data.yaml';
-
-  /// The file name used for pubspec files.
-  static const String PUBSPEC_YAML_FILE = 'pubspec.yaml';
-
-  /// The file name used for Android manifest files.
-  static const String ANDROID_MANIFEST_FILE = 'AndroidManifest.xml';
-
   /// The unique instance of this class.
   static final AnalysisEngine instance = AnalysisEngine._();
 
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index ecdfffd..36d2133 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_span/src/span.dart';
@@ -266,9 +267,7 @@
           _reportErrorForNode(reporter, pathValue(),
               PubspecWarningCode.PATH_DOES_NOT_EXIST, [pathEntry]);
         } else {
-          if (!packageFolder
-              .getChild(AnalysisEngine.PUBSPEC_YAML_FILE)
-              .exists) {
+          if (!packageFolder.getChild(file_paths.pubspecYaml).exists) {
             _reportErrorForNode(reporter, pathValue(),
                 PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST, [pathEntry]);
           }
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 06acfc4..6fba2c3 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -338,8 +338,15 @@
   void _findPackages() {
     var pathContext = _tracker._resourceProvider.pathContext;
     var pubPathPrefixToPathList = <String, List<String>>{};
+    var visitedFolderPaths = <String>{};
 
+    /// TODO(scheglov) Use analyzedFiles() ?
     void visitFolder(Folder folder) {
+      var canonicalFolderPath = folder.resolveSymbolicLinksSync().path;
+      if (!visitedFolderPaths.add(canonicalFolderPath)) {
+        return;
+      }
+
       var buildFile = folder.getChildAssumingFile('BUILD');
       var pubspecFile = folder.getChildAssumingFile('pubspec.yaml');
       if (buildFile.exists) {
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index bf332b0..ea5e130 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
-import 'package:analyzer/src/dart/analysis/context_locator.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 
 /// A mixin for test classes that adds a [ResourceProvider] and utility methods
@@ -62,12 +61,12 @@
   }
 
   File newOptionsFile(String directoryPath, {String content = ''}) {
-    String path = join(directoryPath, ContextLocatorImpl.ANALYSIS_OPTIONS_NAME);
+    String path = join(directoryPath, file_paths.analysisOptionsYaml);
     return newFile(path, content: content);
   }
 
   File newPackagesFile(String directoryPath) {
-    String path = join(directoryPath, ContextLocatorImpl.DOT_PACKAGES_NAME);
+    String path = join(directoryPath, file_paths.dotPackages);
     return newFile(path);
   }
 
diff --git a/pkg/analyzer/lib/src/util/file_paths.dart b/pkg/analyzer/lib/src/util/file_paths.dart
index 46e450f..2a6318c 100644
--- a/pkg/analyzer/lib/src/util/file_paths.dart
+++ b/pkg/analyzer/lib/src/util/file_paths.dart
@@ -13,12 +13,18 @@
 /// File name of Android manifest files.
 const String androidManifestXml = 'AndroidManifest.xml';
 
+/// The name of the `.dart_tool` directory.
+const String dotDartTool = '.dart_tool';
+
 /// File name of package spec files.
 const String dotPackages = '.packages';
 
 /// The name of the data file used to specify data-driven fixes.
 const String fixDataYaml = 'fix_data.yaml';
 
+/// The name of the package config files.
+const String packageConfigJson = 'package_config.json';
+
 /// File name of pubspec files.
 const String pubspecYaml = 'pubspec.yaml';
 
@@ -52,8 +58,8 @@
 bool isPackageConfigJson(p.Context pathContext, String path) {
   var components = pathContext.split(path);
   return components.length > 2 &&
-      components[components.length - 1] == 'package_config.json' &&
-      components[components.length - 2] == '.dart_tool';
+      components[components.length - 1] == packageConfigJson &&
+      components[components.length - 2] == dotDartTool;
 }
 
 /// Return `true` if [path] is a `pubspec.yaml` file.
diff --git a/pkg/analyzer/test/source/analysis_options_provider_test.dart b/pkg/analyzer/test/source/analysis_options_provider_test.dart
index f139239..ac4ea13 100644
--- a/pkg/analyzer/test/source/analysis_options_provider_test.dart
+++ b/pkg/analyzer/test/source/analysis_options_provider_test.dart
@@ -7,8 +7,8 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
-import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/yaml.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -105,7 +105,7 @@
 
   late final AnalysisOptionsProvider provider;
 
-  String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
+  String get analysisOptionsYaml => file_paths.analysisOptionsYaml;
 
   void setUp() {
     var rawProvider = MemoryResourceProvider();
@@ -118,12 +118,12 @@
 
   void test_getOptions_crawlUp_hasInFolder() {
     pathTranslator.newFolder('/foo/bar');
-    pathTranslator.newFile('/foo/$optionsFileName', r'''
+    pathTranslator.newFile('/foo/$analysisOptionsYaml', r'''
 analyzer:
   ignore:
     - foo
 ''');
-    pathTranslator.newFile('/foo/bar/$optionsFileName', r'''
+    pathTranslator.newFile('/foo/bar/$analysisOptionsYaml', r'''
 analyzer:
   ignore:
     - bar
@@ -139,12 +139,12 @@
 
   void test_getOptions_crawlUp_hasInParent() {
     pathTranslator.newFolder('/foo/bar/baz');
-    pathTranslator.newFile('/foo/$optionsFileName', r'''
+    pathTranslator.newFile('/foo/$analysisOptionsYaml', r'''
 analyzer:
   ignore:
     - foo
 ''');
-    pathTranslator.newFile('/foo/bar/$optionsFileName', r'''
+    pathTranslator.newFile('/foo/bar/$analysisOptionsYaml', r'''
 analyzer:
   ignore:
     - bar
@@ -165,7 +165,7 @@
   }
 
   void test_getOptions_empty() {
-    pathTranslator.newFile('/$optionsFileName', r'''#empty''');
+    pathTranslator.newFile('/$analysisOptionsYaml', r'''#empty''');
     YamlMap options = _getOptions('/');
     expect(options, isNotNull);
     expect(options, isEmpty);
@@ -178,7 +178,7 @@
     - ignoreme.dart
     - 'sdk_ext/**'
 ''');
-    pathTranslator.newFile('/$optionsFileName', r'''
+    pathTranslator.newFile('/$analysisOptionsYaml', r'''
 include: foo.include
 ''');
     YamlMap options = _getOptions('/');
@@ -196,7 +196,7 @@
   }
 
   void test_getOptions_include_missing() {
-    pathTranslator.newFile('/$optionsFileName', r'''
+    pathTranslator.newFile('/$analysisOptionsYaml', r'''
 include: /foo.include
 ''');
     YamlMap options = _getOptions('/');
@@ -204,13 +204,13 @@
   }
 
   void test_getOptions_invalid() {
-    pathTranslator.newFile('/$optionsFileName', r''':''');
+    pathTranslator.newFile('/$analysisOptionsYaml', r''':''');
     YamlMap options = _getOptions('/');
     expect(options, hasLength(1));
   }
 
   void test_getOptions_simple() {
-    pathTranslator.newFile('/$optionsFileName', r'''
+    pathTranslator.newFile('/$analysisOptionsYaml', r'''
 analyzer:
   ignore:
     - ignoreme.dart
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 7b4e4fa..d650f9c 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -103,8 +103,7 @@
     ];
 
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 linter:
   rules:
     - mock_lint_rule
@@ -128,8 +127,7 @@
     ];
 
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 linter:
   rules:
     - mock_lint_rule
@@ -153,8 +151,7 @@
     ];
 
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 linter:
   rules:
     - mock_lint_rule
@@ -176,8 +173,7 @@
     expected.lintRules = <LintRule>[];
 
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 ''');
 
     var options = _getAnalysisOptions(builder, path);
@@ -536,8 +532,7 @@
     builderOptions.defaultOptions = defaultOptions;
     AnalysisOptionsImpl expected = AnalysisOptionsImpl();
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 linter:
   rules:
     - non_existent_lint_rule
@@ -554,8 +549,7 @@
     AnalysisOptionsImpl expected = AnalysisOptionsImpl();
     expected.implicitDynamic = false;
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 analyzer:
   strong-mode:
     implicit-dynamic: false
@@ -609,8 +603,7 @@
   rules:
     - mock_lint_rule2
 ''');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 include: bar.yaml
 linter:
   rules:
@@ -623,8 +616,7 @@
 
   void test_getAnalysisOptions_invalid() {
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: ';');
+    newOptionsFile(path, content: ';');
 
     AnalysisOptions options = _getAnalysisOptions(builder, path);
     expect(options, isNotNull);
@@ -632,8 +624,7 @@
 
   void test_getAnalysisOptions_noDefault_noOverrides() {
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 linter:
   rules:
     - non_existent_lint_rule
@@ -647,8 +638,7 @@
     AnalysisOptionsImpl expected = AnalysisOptionsImpl();
     expected.implicitDynamic = false;
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    newOptionsFile(path, content: '''
 analyzer:
   strong-mode:
     implicit-dynamic: false
@@ -660,22 +650,21 @@
 
   void test_getAnalysisOptions_optionsPath() {
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath, content: '''
+    String filePath = newOptionsFile(path, content: '''
 linter:
   rules:
     - empty_constructor_bodies
-''');
+''').path;
 
     ContextRoot root =
         ContextRoot(path, [], pathContext: resourceProvider.pathContext);
     _getAnalysisOptions(builder, path, contextRoot: root);
-    expect(root.optionsFilePath, equals(filePath));
+    expect(root.optionsFilePath, filePath);
   }
 
   void test_getAnalysisOptions_sdkVersionConstraint() {
     var projectPath = convertPath('/test');
-    newFile(join(projectPath, AnalysisEngine.PUBSPEC_YAML_FILE), content: '''
+    newPubspecYamlFile(projectPath, '''
 environment:
   sdk: ^2.1.0
 ''');
@@ -704,9 +693,7 @@
   void test_getOptionsFile_inParentOfRoot_new() {
     String parentPath = convertPath('/some/directory');
     String path = join(parentPath, 'path');
-    String filePath =
-        join(parentPath, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath);
+    String filePath = newOptionsFile(path).path;
 
     var result = builder.getOptionsFile(path)!;
     expect(result, isNotNull);
@@ -715,8 +702,7 @@
 
   void test_getOptionsFile_inRoot_new() {
     String path = convertPath('/some/directory/path');
-    String filePath = join(path, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
-    newFile(filePath);
+    String filePath = newOptionsFile(path).path;
 
     var result = builder.getOptionsFile(path)!;
     expect(result, isNotNull);
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index 116c6f1..469a182 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/context_locator.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -41,6 +42,136 @@
     contextLocator = ContextLocatorImpl(resourceProvider: resourceProvider);
   }
 
+  void test_locateRoots_link_file_toOutOfRoot() {
+    Folder rootFolder = newFolder('/home/test');
+    newFile('/home/test/lib/a.dart');
+    newFile('/home/b.dart');
+    resourceProvider.newLink(
+      convertPath('/home/test/lib/c.dart'),
+      convertPath('/home/b.dart'),
+    );
+
+    List<ContextRoot> roots =
+        contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+    expect(roots, hasLength(1));
+
+    ContextRoot root = findRoot(roots, rootFolder);
+    expect(root.includedPaths, unorderedEquals([rootFolder.path]));
+    expect(root.excludedPaths, isEmpty);
+    expect(root.optionsFile, isNull);
+    expect(root.packagesFile, isNull);
+
+    _assertAnalyzedFiles(root, [
+      '/home/test/lib/a.dart',
+      '/home/test/lib/c.dart',
+    ]);
+  }
+
+  void test_locateRoots_link_file_toSiblingInRoot() {
+    Folder rootFolder = newFolder('/test');
+    newFile('/test/lib/a.dart');
+    resourceProvider.newLink(
+      convertPath('/test/lib/b.dart'),
+      convertPath('/test/lib/a.dart'),
+    );
+
+    List<ContextRoot> roots =
+        contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+    expect(roots, hasLength(1));
+
+    ContextRoot root = findRoot(roots, rootFolder);
+    expect(root.includedPaths, unorderedEquals([rootFolder.path]));
+    expect(root.excludedPaths, isEmpty);
+    expect(root.optionsFile, isNull);
+    expect(root.packagesFile, isNull);
+
+    _assertAnalyzedFiles(root, [
+      '/test/lib/a.dart',
+      '/test/lib/b.dart',
+    ]);
+  }
+
+  void test_locateRoots_link_folder_toParentInRoot() {
+    Folder rootFolder = newFolder('/test');
+    newFile('/test/lib/a.dart');
+    resourceProvider.newLink(
+      convertPath('/test/lib/foo'),
+      convertPath('/test/lib'),
+    );
+
+    List<ContextRoot> roots =
+        contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+    expect(roots, hasLength(1));
+
+    ContextRoot root = findRoot(roots, rootFolder);
+    expect(root.includedPaths, unorderedEquals([rootFolder.path]));
+    expect(root.excludedPaths, isEmpty);
+    expect(root.optionsFile, isNull);
+    expect(root.packagesFile, isNull);
+
+    _assertAnalyzedFiles(root, ['/test/lib/a.dart']);
+
+    _assertAnalyzed(root, [
+      '/test/lib/a.dart',
+      '/test/lib/foo/b.dart',
+    ]);
+  }
+
+  void test_locateRoots_link_folder_toParentOfRoot() {
+    Folder rootFolder = newFolder('/home/test');
+    newFile('/home/test/lib/a.dart');
+    newFile('/home/b.dart');
+    newFile('/home/other/c.dart');
+    resourceProvider.newLink(
+      convertPath('/home/test/lib/foo'),
+      convertPath('/home'),
+    );
+
+    List<ContextRoot> roots =
+        contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+    expect(roots, hasLength(1));
+
+    ContextRoot root = findRoot(roots, rootFolder);
+    expect(root.includedPaths, unorderedEquals([rootFolder.path]));
+    expect(root.excludedPaths, isEmpty);
+    expect(root.optionsFile, isNull);
+    expect(root.packagesFile, isNull);
+
+    // The set of analyzed files includes everything in `/home`,
+    // but does not repeat `/home/test/lib/a.dart` and does not cycle.
+    _assertAnalyzedFiles(root, [
+      '/home/test/lib/a.dart',
+      '/home/test/lib/foo/b.dart',
+      '/home/test/lib/foo/other/c.dart',
+    ]);
+  }
+
+  void test_locateRoots_link_folder_toSiblingInRoot() {
+    Folder rootFolder = newFolder('/test');
+    newFile('/test/lib/a.dart');
+    newFile('/test/lib/foo/b.dart');
+    resourceProvider.newLink(
+      convertPath('/test/lib/bar'),
+      convertPath('/test/lib/foo'),
+    );
+
+    List<ContextRoot> roots =
+        contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+    expect(roots, hasLength(1));
+
+    ContextRoot root = findRoot(roots, rootFolder);
+    expect(root.includedPaths, unorderedEquals([rootFolder.path]));
+    expect(root.excludedPaths, isEmpty);
+    expect(root.optionsFile, isNull);
+    expect(root.packagesFile, isNull);
+
+    _assertAnalyzedFiles(root, [
+      '/test/lib/a.dart',
+      '/test/lib/foo/b.dart',
+      '/test/lib/bar/b.dart',
+    ]);
+  }
+
   void test_locateRoots_multiple_dirAndNestedDir() {
     Folder outerRootFolder = newFolder('/test/outer');
     File outerOptionsFile = newOptionsFile('/test/outer');
@@ -573,9 +704,7 @@
 
   void test_locateRoots_options_withExclude_wholeFolder_includedOptions() {
     Folder rootFolder = newFolder('/test/root');
-    File optionsFile = newFile(
-        '/test/root/${ContextLocatorImpl.ANALYSIS_OPTIONS_NAME}',
-        content: '''
+    File optionsFile = newOptionsFile('/test/root', content: '''
 include: has_excludes.yaml
 ''');
     newFile('/test/root/has_excludes.yaml', content: '''
@@ -609,9 +738,7 @@
 
   void test_locateRoots_options_withExclude_wholeFolder_includedOptionsMerge() {
     Folder rootFolder = newFolder('/test/root');
-    File optionsFile = newFile(
-        '/test/root/${ContextLocatorImpl.ANALYSIS_OPTIONS_NAME}',
-        content: '''
+    File optionsFile = newOptionsFile('/test/root', content: '''
 include: has_excludes.yaml
 analyzer:
   exclude:
@@ -792,6 +919,12 @@
     }
   }
 
+  void _assertAnalyzedFiles(ContextRoot root, List<String> posixPathList) {
+    var analyzedFiles = root.analyzedFiles().toList();
+    var pathList = posixPathList.map(convertPath).toList();
+    expect(analyzedFiles, unorderedEquals(pathList));
+  }
+
   void _assertNotAnalyzed(ContextRoot root, List<String> posixPathList) {
     for (var posixPath in posixPathList) {
       var path = convertPath(posixPath);
@@ -802,8 +935,8 @@
   File _newPackageConfigFile(String directoryPath) {
     String path = join(
       directoryPath,
-      ContextLocatorImpl.DOT_DART_TOOL_NAME,
-      ContextLocatorImpl.PACKAGE_CONFIG_JSON_NAME,
+      file_paths.dotDartTool,
+      file_paths.packageConfigJson,
     );
     return newFile(path);
   }
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
index 72108e0..932abb8 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
@@ -22,6 +22,23 @@
     return driver.test.libraryContext.linkedCycles;
   }
 
+  test_change_factoryConstructor_moveStaticToken() async {
+    await resolveTestCode(r'''
+class A {
+  factory A();
+  static void foo<U>() {}
+}
+''');
+
+    driverFor(testFilePath).changeFile(testFilePath);
+    await resolveTestCode(r'''
+class A {
+  factory A() =
+  static void foo<U>() {}
+}
+''');
+  }
+
   test_change_field_staticFinal_hasConstConstructor_changeInitializer() async {
     useEmptyByteStore();
 
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index 6fdda84..cb996f9 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -242,6 +242,25 @@
 ''');
   }
 
+  /// The token `static` is moving from the field declaration to the factory
+  /// constructor (its redirected constructor), so semantically its meaning
+  /// changes. But we had a bug that we put `static` into the signature
+  /// at the same position, without any separator, so failed to see the
+  /// difference.
+  test_class_factoryConstructor_empty_to_eq() {
+    assertNotSameSignature(r'''
+class A {
+  factory A();
+  static void foo<U>() {}
+}
+''', r'''
+class A {
+  factory A() =
+  static void foo<U>() {}
+}
+''');
+  }
+
   test_class_field_final_add() {
     assertNotSameSignature(r'''
 class C {
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 019fe7b..6ba066f 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -211,10 +211,6 @@
     expect(library.id, id);
   }
 
-  @SkippedTest(
-    issue: 'https://github.com/dart-lang/sdk/issues/44501',
-    reason: 'Actually, with fixed ResourceProvider, this test cycles',
-  )
   test_getLibrary_exportViaRecursiveLink() async {
     resourceProvider.newLink(
       convertPath('/home/test/lib/foo'),
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 7452a90..1e65979 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -267,9 +267,9 @@
       }
 
       // Analyze the libraries.
+      var pathContext = resourceProvider.pathContext;
       for (var path in filesToAnalyze) {
-        var shortName = resourceProvider.pathContext.basename(path);
-        if (shortName == AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE) {
+        if (file_paths.isAnalysisOptionsYaml(pathContext, path)) {
           var file = resourceProvider.getFile(path);
           var content = file.readAsStringSync();
           var lineInfo = LineInfo.fromContent(content);
@@ -286,7 +286,7 @@
               allResult = allResult.max(severity);
             }
           }
-        } else if (shortName == AnalysisEngine.PUBSPEC_YAML_FILE) {
+        } else if (file_paths.isPubspecYaml(pathContext, path)) {
           var errors = <AnalysisError>[];
           try {
             var file = resourceProvider.getFile(path);
@@ -309,7 +309,7 @@
                 }
               }
               if (visitors.isNotEmpty) {
-                var sourceUri = resourceProvider.pathContext.toUri(path);
+                var sourceUri = pathContext.toUri(path);
                 var pubspecAst = Pubspec.parse(content,
                     sourceUrl: sourceUri, resourceProvider: resourceProvider);
                 var listener = RecordingErrorListener();
@@ -339,7 +339,7 @@
           } catch (exception) {
             // If the file cannot be analyzed, ignore it.
           }
-        } else if (shortName == AnalysisEngine.ANDROID_MANIFEST_FILE) {
+        } else if (file_paths.isAndroidManifestXml(pathContext, path)) {
           try {
             var file = resourceProvider.getFile(path);
             var content = file.readAsStringSync();
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 61ea617..249b959 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary2/package_bundle_format.dart';
+import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/sdk.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
 import 'package:analyzer_cli/src/driver.dart';
@@ -59,9 +60,9 @@
   }) async {
     filePath = _posixToPlatformPath(filePath);
 
-    var optionsFileName = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
-    var options =
-        _posixToPlatformPath('data/options_tests_project/' + optionsFileName);
+    var options = _posixToPlatformPath(
+      'data/options_tests_project/' + file_paths.analysisOptionsYaml,
+    );
 
     var args = <String>[];
     args.add('--build-mode');
@@ -804,7 +805,7 @@
 
 @reflectiveTest
 class LinterTest extends BaseTest {
-  String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
+  String get analysisOptionsYaml => file_paths.analysisOptionsYaml;
 
   Future<void> test_containsLintRuleEntry() async {
     var options = _parseOptions('''
@@ -882,7 +883,7 @@
 
   Future<void> test_pubspec_lintsInOptions_generatedLints() async {
     await drive('data/linter_project/pubspec.yaml',
-        options: 'data/linter_project/$optionsFileName');
+        options: 'data/linter_project/$analysisOptionsYaml');
     expect(bulletToDash(outSink), contains('lint - Sort pub dependencies'));
   }
 
@@ -891,17 +892,17 @@
 
   Future<void> _runLinter_defaultLints() async {
     await drive('data/linter_project/test_file.dart',
-        options: 'data/linter_project/$optionsFileName', args: ['--lints']);
+        options: 'data/linter_project/$analysisOptionsYaml', args: ['--lints']);
   }
 
   Future<void> _runLinter_lintsInOptions() async {
     await drive('data/linter_project/test_file.dart',
-        options: 'data/linter_project/$optionsFileName', args: ['--lints']);
+        options: 'data/linter_project/$analysisOptionsYaml', args: ['--lints']);
   }
 
   Future<void> _runLinter_noLintsFlag() async {
     await drive('data/no_lints_project/test_file.dart',
-        options: 'data/no_lints_project/$optionsFileName');
+        options: 'data/no_lints_project/$analysisOptionsYaml');
   }
 }
 
@@ -909,8 +910,7 @@
 class NonDartFilesTest extends BaseTest {
   Future<void> test_analysisOptionsYaml() async {
     await withTempDirAsync((tempDir) async {
-      var filePath =
-          path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+      var filePath = path.join(tempDir, file_paths.analysisOptionsYaml);
       File(filePath).writeAsStringSync('''
 analyzer:
   string-mode: true
@@ -926,15 +926,13 @@
 
   Future<void> test_manifestFileChecks() async {
     await withTempDirAsync((tempDir) async {
-      var filePath =
-          path.join(tempDir, AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
+      var filePath = path.join(tempDir, file_paths.analysisOptionsYaml);
       File(filePath).writeAsStringSync('''
 analyzer:
   optional-checks:
     chrome-os-manifest-checks: true
 ''');
-      var manifestPath =
-          path.join(tempDir, AnalysisEngine.ANDROID_MANIFEST_FILE);
+      var manifestPath = path.join(tempDir, file_paths.androidManifestXml);
       File(manifestPath).writeAsStringSync('''
 <manifest
     xmlns:android="http://schemas.android.com/apk/res/android">
@@ -953,7 +951,7 @@
 
   Future<void> test_pubspecYaml() async {
     await withTempDirAsync((tempDir) async {
-      var filePath = path.join(tempDir, AnalysisEngine.PUBSPEC_YAML_FILE);
+      var filePath = path.join(tempDir, file_paths.pubspecYaml);
       File(filePath).writeAsStringSync('''
 name: foo
 flutter:
@@ -972,7 +970,7 @@
 
 @reflectiveTest
 class OptionsTest extends BaseTest {
-  String get optionsFileName => AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
+  String get analysisOptionsYaml => file_paths.analysisOptionsYaml;
 
   List<ErrorProcessor> get processors => analysisOptions.errorProcessors;
 
@@ -981,7 +979,7 @@
 
   Future<void> test_analysisOptions_excludes() async {
     await drive('data/exclude_test_project',
-        options: 'data/exclude_test_project/$optionsFileName');
+        options: 'data/exclude_test_project/$analysisOptionsYaml');
     _expectUndefinedClassErrorsWithoutExclusions();
   }
 
@@ -990,7 +988,7 @@
     // The exclude is relative to the project, not/ the analyzed path, and it
     // has to then understand that.
     await drive('data/exclude_test_project',
-        options: 'data/exclude_test_project/$optionsFileName');
+        options: 'data/exclude_test_project/$analysisOptionsYaml');
     _expectUndefinedClassErrorsWithoutExclusions();
   }
 
@@ -1066,7 +1064,7 @@
   Future<void> test_withFlags_overrideFatalWarning() async {
     await drive('data/options_tests_project/test_file.dart',
         args: ['--fatal-warnings'],
-        options: 'data/options_tests_project/$optionsFileName');
+        options: 'data/options_tests_project/$analysisOptionsYaml');
 
     // missing_return: error
     var undefined_function = AnalysisError(
@@ -1082,7 +1080,7 @@
 
   Future<void> _driveBasic() async {
     await drive('data/options_tests_project/test_file.dart',
-        options: 'data/options_tests_project/$optionsFileName');
+        options: 'data/options_tests_project/$analysisOptionsYaml');
   }
 
   void _expectUndefinedClassErrorsWithoutExclusions() {
diff --git a/tools/VERSION b/tools/VERSION
index 147ceb0..846cd9c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 76
+PRERELEASE 77
 PRERELEASE_PATCH 0
\ No newline at end of file
