Version 2.15.0-252.0.dev

Merge commit '873005502d9199587d5ef686d5341871d07100bc' into 'dev'
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 214d3f2..5051a51 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analysis_server/src/services/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/fuzzy_filter_sort.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
@@ -32,7 +30,7 @@
   final OperationPerformanceImpl _performanceRoot =
       OperationPerformanceImpl('<root>');
 
-  late DartCompletionRequestImpl _dartCompletionRequest;
+  late DartCompletionRequest _dartCompletionRequest;
 
   /// Paths of imported libraries for which suggestions were (re)computed
   /// during processing of this request. Does not include libraries that were
@@ -72,14 +70,9 @@
       var lineInfo = resolvedUnit.lineInfo;
       var offset = lineInfo.getOffsetOfLine(line) + column;
 
-      var completionRequest = CompletionRequestImpl(
-        resolvedUnit,
-        offset,
-        CompletionPerformance(),
-      );
-
-      _dartCompletionRequest = DartCompletionRequestImpl.from(
-        completionRequest,
+      _dartCompletionRequest = DartCompletionRequest.from(
+        resolvedUnit: resolvedUnit,
+        offset: offset,
       );
 
       var suggestions = await performance.runAsync(
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 69d0dec..9ae5561 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -13,7 +13,6 @@
 import 'package:analysis_server/src/domains/completion/available_suggestions.dart';
 import 'package:analysis_server/src/plugin/plugin_manager.dart';
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart';
@@ -51,7 +50,7 @@
       RecentBuffer<CompletionPerformance>(performanceListMaxLength);
 
   /// The current request being processed or `null` if none.
-  CompletionRequestImpl? _currentRequest;
+  DartCompletionRequest? _currentRequest;
 
   /// The identifiers of the latest `getSuggestionDetails` request.
   /// We use it to abort previous requests.
@@ -67,19 +66,19 @@
   /// result to the [controller], and close the controller stream once complete.
   Future<CompletionResult> computeSuggestions(
     OperationPerformanceImpl perf,
-    CompletionRequestImpl request,
+    DartCompletionRequest request,
     CompletionGetSuggestionsParams params,
     Set<ElementKind>? includedElementKinds,
     Set<String>? includedElementNames,
     List<IncludedSuggestionRelevanceTag>? includedSuggestionRelevanceTags,
   ) async {
+    var file = params.file;
+    var offset = params.offset;
     //
     // Allow plugins to start computing fixes.
     //
     Map<PluginInfo, Future<plugin.Response>>? pluginFutures;
     plugin.CompletionGetSuggestionsParams? requestParams;
-    var file = params.file;
-    var offset = params.offset;
     var driver = server.getAnalysisDriver(file);
     if (driver != null) {
       requestParams = plugin.CompletionGetSuggestionsParams(file, offset);
@@ -102,16 +101,9 @@
 
       var contributorTag = 'computeSuggestions - ${manager.runtimeType}';
       await perf.runAsync(contributorTag, (performance) async {
-        var dartRequest = DartCompletionRequestImpl.from(
-          request,
-          dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
-            request.result,
-          ),
-          documentationCache: server.getDocumentationCacheFor(request.result),
-        );
         try {
           suggestions.addAll(
-            await manager.computeSuggestions(dartRequest, performance),
+            await manager.computeSuggestions(request, performance),
           );
         } on AbortCompletion {
           suggestions.clear();
@@ -131,10 +123,7 @@
         var result =
             plugin.CompletionGetSuggestionsResult.fromResponse(response);
         if (result.results.isNotEmpty) {
-          if (suggestions.isEmpty) {
-            request.replacementOffset = result.replacementOffset;
-            request.replacementLength = result.replacementLength;
-          } else if (request.replacementOffset != result.replacementOffset &&
+          if (request.replacementOffset != result.replacementOffset &&
               request.replacementLength != result.replacementLength) {
             server.instrumentationService
                 .logError('Plugin completion-results dropped due to conflicting'
@@ -276,8 +265,8 @@
     });
   }
 
-  void ifMatchesRequestClear(CompletionRequest completionRequest) {
-    if (_currentRequest == completionRequest) {
+  void ifMatchesRequestClear(DartCompletionRequest request) {
+    if (_currentRequest == request) {
       _currentRequest = null;
     }
   }
@@ -349,8 +338,15 @@
             request.id, 'Completion is not enabled.'));
         return;
       }
-      var completionRequest =
-          CompletionRequestImpl(resolvedUnit, offset, performance);
+
+      var completionRequest = DartCompletionRequest.from(
+        resolvedUnit: resolvedUnit,
+        offset: offset,
+        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
+          resolvedUnit,
+        ),
+        documentationCache: server.getDocumentationCacheFor(resolvedUnit),
+      );
 
       var completionId = (_nextCompletionId++).toString();
 
@@ -455,9 +451,9 @@
     );
   }
 
-  void setNewRequest(CompletionRequestImpl completionRequest) {
+  void setNewRequest(DartCompletionRequest request) {
     _abortCurrentRequest();
-    _currentRequest = completionRequest;
+    _currentRequest = request;
   }
 
   /// Implement the 'completion.setSubscriptions' request.
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 346dc00..1f20a26 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -4,12 +4,11 @@
 
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestion, RuntimeCompletionExpression, SourceEdit;
-import 'package:analysis_server/src/services/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/file_system/overlay_file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 
 class RuntimeCompletionComputer {
@@ -70,21 +69,14 @@
       return RuntimeCompletionResult([], []);
     }
 
-    var request = CompletionRequestImpl(
-      targetResult,
-      targetOffset,
-      CompletionPerformance(),
+    var dartRequest = DartCompletionRequest.from(
+      resolvedUnit: targetResult,
+      offset: targetOffset,
     );
 
-    var dartRequest = DartCompletionRequestImpl.from(request);
-
-    var suggestions = await request.performance.runRequestOperation(
-      (performance) async {
-        return await DartCompletionManager().computeSuggestions(
-          dartRequest,
-          performance,
-        );
-      },
+    var suggestions = await DartCompletionManager().computeSuggestions(
+      dartRequest,
+      OperationPerformanceImpl('<root>'),
     );
 
     // Remove completions with synthetic import prefixes.
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 80aa6a3..0142b07 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -14,7 +14,6 @@
 import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/filtering/fuzzy_matcher.dart';
@@ -209,16 +208,13 @@
     server.performanceStats.completion.add(performance);
 
     return await performance.runRequestOperation((perf) async {
-      final completionRequest =
-          CompletionRequestImpl(unit, offset, performance);
-      final directiveInfo =
-          server.getDartdocDirectiveInfoFor(completionRequest.result);
-      final dartCompletionRequest = DartCompletionRequestImpl.from(
-        completionRequest,
-        dartdocDirectiveInfo: directiveInfo,
+      final completionRequest = DartCompletionRequest.from(
+        resolvedUnit: unit,
+        offset: offset,
+        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(unit),
         completionPreference: CompletionPreference.replace,
       );
-      final target = dartCompletionRequest.target;
+      final target = completionRequest.target;
 
       if (triggerCharacter != null) {
         if (!_triggerCharacterValid(offset, triggerCharacter, target)) {
@@ -243,7 +239,7 @@
         );
 
         final serverSuggestions = await contributor.computeSuggestions(
-          dartCompletionRequest,
+          completionRequest,
           perf,
         );
 
@@ -401,7 +397,7 @@
 
         // Perform fuzzy matching based on the identifier in front of the caret to
         // reduce the size of the payload.
-        final fuzzyPattern = dartCompletionRequest.targetPrefix;
+        final fuzzyPattern = completionRequest.targetPrefix;
         final fuzzyMatcher =
             FuzzyMatcher(fuzzyPattern, matchStyle: MatchStyle.TEXT);
 
diff --git a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
index 542af9c..ebfe36f 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/completion_core.dart
@@ -2,10 +2,6 @@
 // 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/dart/analysis/results.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source.dart';
-
 /// [AbortCompletion] is thrown when the current completion request
 /// should be aborted because either
 /// the source changed since the request was made, or
@@ -29,29 +25,3 @@
   insert,
   replace,
 }
-
-/// The information about a requested list of completions.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class CompletionRequest {
-  /// Return the offset within the source at which the completion is being
-  /// requested.
-  int get offset;
-
-  /// Return the resource provider associated with this request.
-  ResourceProvider get resourceProvider;
-
-  /// The analysis result for the file in which the completion is being
-  /// requested.
-  ResolvedUnitResult get result;
-
-  /// Return the source in which the completion is being requested.
-  Source get source;
-
-  /// Return the content of the [source] in which the completion is being
-  /// requested, or `null` if the content could not be accessed.
-  String? get sourceContents;
-
-  /// Throw [AbortCompletion] if the completion request has been aborted.
-  void checkAborted();
-}
diff --git a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
index 90c6495..69b06a8 100644
--- a/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
+++ b/pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart
@@ -2,17 +2,8 @@
 // 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:analysis_server/src/provisional/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
-import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
 
 export 'package:analyzer_plugin/utilities/completion/relevance.dart';
 
@@ -28,64 +19,3 @@
   /// given completion [request] have been added to the [builder].
   Future<void> computeSuggestions();
 }
-
-/// The information about a requested list of completions within a Dart file.
-///
-/// Clients may not extend, implement or mix-in this class.
-abstract class DartCompletionRequest extends CompletionRequest {
-  CompletionPreference get completionPreference;
-
-  /// Return the type imposed on the target's `containingNode` based on its
-  /// context, or `null` if the context does not impose any type.
-  DartType? get contextType;
-
-  /// Return the object used to resolve macros in Dartdoc comments.
-  DartdocDirectiveInfo get dartdocDirectiveInfo;
-
-  /// Return the expression to the right of the "dot" or "dot dot",
-  /// or `null` if this is not a "dot" completion (e.g. `foo.b`).
-  Expression? get dotTarget;
-
-  /// Return the object used to compute the values of the features used to
-  /// compute relevance scores for suggestions.
-  FeatureComputer get featureComputer;
-
-  /// Return the feature set that was used to analyze the compilation unit in
-  /// which suggestions are being made.
-  FeatureSet get featureSet;
-
-  /// Return `true` if free standing identifiers should be suggested
-  bool get includeIdentifiers;
-
-  /// Return `true` if the completion is occurring in a constant context.
-  bool get inConstantContext;
-
-  /// Return the library element which contains the unit in which the completion
-  /// is occurring.
-  LibraryElement get libraryElement;
-
-  /// Answer the [DartType] for Object in dart:core
-  DartType get objectType;
-
-  /// The [OpType] which describes which types of suggestions would fit the
-  /// request.
-  OpType get opType;
-
-  /// The source range that represents the region of text that should be
-  /// replaced when a suggestion is selected.
-  SourceRange get replacementRange;
-
-  /// Return the [SourceFactory] of the request.
-  SourceFactory get sourceFactory;
-
-  /// Return the completion target.  This determines what part of the parse tree
-  /// will receive the newly inserted text.
-  /// At a minimum, all declarations in the completion scope in [target.unit]
-  /// will be resolved if they can be resolved.
-  CompletionTarget get target;
-
-  /// Return prefix that already exists in the document for [target] or empty
-  /// string if unavailable. This can be used to filter the completion list to
-  /// items that already match the text to the left of the caret.
-  String get targetPrefix;
-}
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_core.dart b/pkg/analysis_server/lib/src/services/completion/completion_core.dart
deleted file mode 100644
index d6fe971..0000000
--- a/pkg/analysis_server/lib/src/services/completion/completion_core.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// 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:analysis_server/src/provisional/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-/// The information about a requested list of completions.
-class CompletionRequestImpl implements CompletionRequest {
-  @override
-  final ResolvedUnitResult result;
-
-  @override
-  final int offset;
-
-  /// The offset of the start of the text to be replaced.
-  /// This will be different than the [offset] used to request the completion
-  /// suggestions if there was a portion of an identifier before the original
-  /// [offset]. In particular, the [replacementOffset] will be the offset of the
-  /// beginning of said identifier.
-  int replacementOffset;
-
-  /// The length of the text to be replaced if the remainder of the identifier
-  /// containing the cursor is to be replaced when the suggestion is applied
-  /// (that is, the number of characters in the existing identifier).
-  /// This will be different than the [replacementOffset] - [offset]
-  /// if the [offset] is in the middle of an existing identifier.
-  int replacementLength;
-
-  bool _aborted = false;
-
-  final CompletionPerformance performance;
-
-  /// Initialize a newly created completion request based on the given
-  /// arguments.
-  CompletionRequestImpl(this.result, this.offset, this.performance)
-      : replacementOffset = offset,
-        replacementLength = 0;
-
-  @override
-  ResourceProvider get resourceProvider => result.session.resourceProvider;
-
-  @override
-  Source get source => result.unit.declaredElement!.source;
-
-  @override
-  String? get sourceContents => result.content;
-
-  /// Abort the current completion request.
-  void abort() {
-    _aborted = true;
-  }
-
-  @override
-  void checkAborted() {
-    if (_aborted) {
-      throw AbortCompletion();
-    }
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index 44f88c6..05e4e82 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/utilities/flutter.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
index 138c369..7acb058 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/combinator_contributor.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart'
     hide Element, ElementKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 6b3f53c..a26115a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -5,7 +5,6 @@
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/documentation_cache.dart';
@@ -85,12 +84,11 @@
                 includedSuggestionRelevanceTags == null));
 
   Future<List<CompletionSuggestion>> computeSuggestions(
-    DartCompletionRequestImpl dartRequest,
+    DartCompletionRequest request,
     OperationPerformanceImpl performance, {
     bool enableOverrideContributor = true,
     bool enableUriContributor = true,
   }) async {
-    final request = dartRequest.request;
     request.checkAborted();
     var pathContext = request.resourceProvider.pathContext;
     if (!file_paths.isDart(pathContext, request.result.path)) {
@@ -98,45 +96,40 @@
     }
 
     // Don't suggest in comments.
-    if (dartRequest.target.isCommentText) {
+    if (request.target.isCommentText) {
       return const <CompletionSuggestion>[];
     }
 
     request.checkAborted();
 
-    var replacementRange = dartRequest.replacementRange;
-    (request as CompletionRequestImpl)
-      ..replacementOffset = replacementRange.offset
-      ..replacementLength = replacementRange.length;
-
     // Request Dart specific completions from each contributor
-    var builder = SuggestionBuilder(dartRequest, listener: listener);
+    var builder = SuggestionBuilder(request, listener: listener);
     var contributors = <DartCompletionContributor>[
-      ArgListContributor(dartRequest, builder),
-      CombinatorContributor(dartRequest, builder),
-      ExtensionMemberContributor(dartRequest, builder),
-      FieldFormalContributor(dartRequest, builder),
-      KeywordContributor(dartRequest, builder),
-      LabelContributor(dartRequest, builder),
-      LibraryMemberContributor(dartRequest, builder),
-      LibraryPrefixContributor(dartRequest, builder),
-      LocalLibraryContributor(dartRequest, builder),
-      LocalReferenceContributor(dartRequest, builder),
-      NamedConstructorContributor(dartRequest, builder),
-      if (enableOverrideContributor) OverrideContributor(dartRequest, builder),
-      RedirectingContributor(dartRequest, builder),
-      StaticMemberContributor(dartRequest, builder),
-      TypeMemberContributor(dartRequest, builder),
-      if (enableUriContributor) UriContributor(dartRequest, builder),
-      VariableNameContributor(dartRequest, builder),
+      ArgListContributor(request, builder),
+      CombinatorContributor(request, builder),
+      ExtensionMemberContributor(request, builder),
+      FieldFormalContributor(request, builder),
+      KeywordContributor(request, builder),
+      LabelContributor(request, builder),
+      LibraryMemberContributor(request, builder),
+      LibraryPrefixContributor(request, builder),
+      LocalLibraryContributor(request, builder),
+      LocalReferenceContributor(request, builder),
+      NamedConstructorContributor(request, builder),
+      if (enableOverrideContributor) OverrideContributor(request, builder),
+      RedirectingContributor(request, builder),
+      StaticMemberContributor(request, builder),
+      TypeMemberContributor(request, builder),
+      if (enableUriContributor) UriContributor(request, builder),
+      VariableNameContributor(request, builder),
     ];
 
     if (includedElementKinds != null) {
-      _addIncludedElementKinds(dartRequest);
-      _addIncludedSuggestionRelevanceTags(dartRequest);
+      _addIncludedElementKinds(request);
+      _addIncludedSuggestionRelevanceTags(request);
     } else {
       contributors.add(
-        ImportedReferenceContributor(dartRequest, builder),
+        ImportedReferenceContributor(request, builder),
       );
     }
 
@@ -159,7 +152,7 @@
     return builder.suggestions.toList();
   }
 
-  void _addIncludedElementKinds(DartCompletionRequestImpl request) {
+  void _addIncludedElementKinds(DartCompletionRequest request) {
     var opType = request.opType;
 
     if (!opType.includeIdentifiers) return;
@@ -192,7 +185,7 @@
     }
   }
 
-  void _addIncludedSuggestionRelevanceTags(DartCompletionRequestImpl request) {
+  void _addIncludedSuggestionRelevanceTags(DartCompletionRequest request) {
     final includedSuggestionRelevanceTags =
         this.includedSuggestionRelevanceTags!;
     var location = request.opType.completionLocation;
@@ -243,45 +236,54 @@
 }
 
 /// The information about a requested list of completions within a Dart file.
-class DartCompletionRequestImpl implements DartCompletionRequest {
-  @override
+class DartCompletionRequest {
   final CompletionPreference completionPreference;
 
-  @override
+  /// Return the type imposed on the target's `containingNode` based on its
+  /// context, or `null` if the context does not impose any type.
   final DartType? contextType;
 
-  @override
+  /// Return the object used to resolve macros in Dartdoc comments.
   final DartdocDirectiveInfo dartdocDirectiveInfo;
 
   final DocumentationCache? documentationCache;
 
-  @override
+  /// Return the expression to the right of the "dot" or "dot dot",
+  /// or `null` if this is not a "dot" completion (e.g. `foo.b`).
   final Expression? dotTarget;
 
-  @override
+  /// Return the object used to compute the values of the features used to
+  /// compute relevance scores for suggestions.
   final FeatureComputer featureComputer;
 
-  @override
+  /// Return the offset within the source at which the completion is being
+  /// requested.
   final int offset;
 
-  @override
+  /// The [OpType] which describes which types of suggestions would fit the
+  /// request.
   final OpType opType;
 
-  @override
+  /// The source range that represents the region of text that should be
+  /// replaced when a suggestion is selected.
   final SourceRange replacementRange;
 
-  final CompletionRequest request;
-
-  @override
+  /// The analysis result for the file in which the completion is being
+  /// requested.
   final ResolvedUnitResult result;
 
-  @override
+  /// Return the source in which the completion is being requested.
   final Source source;
 
-  @override
+  /// Return the completion target.  This determines what part of the parse tree
+  /// will receive the newly inserted text.
+  /// At a minimum, all declarations in the completion scope in [target.unit]
+  /// will be resolved if they can be resolved.
   final CompletionTarget target;
 
-  DartCompletionRequestImpl._({
+  bool _aborted = false;
+
+  DartCompletionRequest._({
     required this.completionPreference,
     required this.contextType,
     required this.dartdocDirectiveInfo,
@@ -291,45 +293,65 @@
     required this.offset,
     required this.opType,
     required this.replacementRange,
-    required this.request,
     required this.result,
     required this.source,
     required this.target,
   });
 
-  @override
+  /// Return the feature set that was used to analyze the compilation unit in
+  /// which suggestions are being made.
   FeatureSet get featureSet => libraryElement.featureSet;
 
-  @override
+  /// Return `true` if free standing identifiers should be suggested
   bool get includeIdentifiers {
     return opType.includeIdentifiers;
   }
 
-  @override
+  /// Return `true` if the completion is occurring in a constant context.
   bool get inConstantContext {
     var entity = target.entity;
     return entity is Expression && entity.inConstantContext;
   }
 
-  @override
+  /// Return the library element which contains the unit in which the completion
+  /// is occurring.
   LibraryElement get libraryElement => result.libraryElement;
 
-  @override
+  /// Answer the [DartType] for Object in dart:core
   DartType get objectType => libraryElement.typeProvider.objectType;
 
-  @override
+  /// The length of the text to be replaced if the remainder of the identifier
+  /// containing the cursor is to be replaced when the suggestion is applied
+  /// (that is, the number of characters in the existing identifier).
+  /// This will be different than the [replacementOffset] - [offset]
+  /// if the [offset] is in the middle of an existing identifier.
+  /// TODO(scheglov) Switch to [replacementRange].
+  int get replacementLength => replacementRange.length;
+
+  /// The offset of the start of the text to be replaced.
+  /// This will be different than the [offset] used to request the completion
+  /// suggestions if there was a portion of an identifier before the original
+  /// [offset]. In particular, the [replacementOffset] will be the offset of the
+  /// beginning of said identifier.
+  /// TODO(scheglov) Switch to [replacementRange].
+  int get replacementOffset => replacementRange.offset;
+
+  /// Return the resource provider associated with this request.
   ResourceProvider get resourceProvider => result.session.resourceProvider;
 
-  @override
+  /// Return the content of the [source] in which the completion is being
+  /// requested, or `null` if the content could not be accessed.
   String? get sourceContents => result.content;
 
-  @override
+  /// Return the [SourceFactory] of the request.
   SourceFactory get sourceFactory {
     var context = result.session.analysisContext as DriverBasedAnalysisContext;
     return context.driver.sourceFactory;
   }
 
-  @override
+  /// Return prefix that already exists in the document for [target] or empty
+  /// string if unavailable. This can be used to filter the completion list to
+  /// items that already match the text to the left of the caret.
   String get targetPrefix {
     var entity = target.entity;
 
@@ -355,32 +377,32 @@
     return '';
   }
 
-  /// Throw [AbortCompletion] if the completion request has been aborted.
-  @override
-  void checkAborted() {
-    request.checkAborted();
+  /// Abort the current completion request.
+  void abort() {
+    _aborted = true;
   }
 
-  /// Return a newly created completion request based on the given [request].
-  /// This method will throw [AbortCompletion] if the completion request has
-  /// been aborted.
-  static DartCompletionRequestImpl from(
-    CompletionRequest request, {
+  /// Throw [AbortCompletion] if the completion request has been aborted.
+  void checkAborted() {
+    if (_aborted) {
+      throw AbortCompletion();
+    }
+  }
+
+  /// Return a newly created completion request in [resolvedUnit] at [offset].
+  static DartCompletionRequest from({
+    required ResolvedUnitResult resolvedUnit,
+    required int offset,
     DartdocDirectiveInfo? dartdocDirectiveInfo,
     CompletionPreference completionPreference = CompletionPreference.insert,
     DocumentationCache? documentationCache,
   }) {
-    request.checkAborted();
-
-    var result = request.result;
-    var offset = request.offset;
-
-    var target = CompletionTarget.forOffset(result.unit, offset);
+    var target = CompletionTarget.forOffset(resolvedUnit.unit, offset);
     var dotTarget = _dotTarget(target);
 
     var featureComputer = FeatureComputer(
-      result.typeSystem,
-      result.typeProvider,
+      resolvedUnit.typeSystem,
+      resolvedUnit.typeProvider,
     );
 
     var contextType = featureComputer.computeContextType(
@@ -393,7 +415,7 @@
       opType.includeVoidReturnSuggestions = true;
     }
 
-    return DartCompletionRequestImpl._(
+    return DartCompletionRequest._(
       completionPreference: completionPreference,
       contextType: contextType,
       dartdocDirectiveInfo: dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
@@ -403,9 +425,8 @@
       offset: offset,
       opType: opType,
       replacementRange: target.computeReplacementRange(offset),
-      request: request,
-      result: request.result,
-      source: request.source,
+      result: resolvedUnit,
+      source: resolvedUnit.unit.declaredElement!.source,
       target: target,
     );
   }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index 58e3b83..9b6634c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/utilities/extensions/element.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
index d073956..daa7ef1 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
index eb2bd03..3277593 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
     show SuggestionBuilder;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index a32f625..864f1f9 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -56,10 +56,8 @@
 
   @override
   void visitArgumentList(ArgumentList node) {
-    if (request is DartCompletionRequestImpl) {
-      if (request.opType.includeOnlyNamedArgumentSuggestions) {
-        return;
-      }
+    if (request.opType.includeOnlyNamedArgumentSuggestions) {
+      return;
     }
     final entity = this.entity;
     if (entity == node.rightParenthesis) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
index c3d8f57..9933db4 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
@@ -4,7 +4,7 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
-    show DartCompletionRequestImpl;
+    show DartCompletionRequest;
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/src/utilities/visitors/local_declaration_visitor.dart'
@@ -21,7 +21,7 @@
 
   @override
   Future<void> computeSuggestions() async {
-    var optype = (request as DartCompletionRequestImpl).opType;
+    var optype = request.opType;
 
     // Collect suggestions from the specific child [AstNode] that contains
     // the completion offset and all of its parents recursively.
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 0b49e0f..5654e30 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
index 5fad45d..09900cf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 
 /// A contributor that produces suggestions based on the prefixes defined on
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index e0b113d..734a36e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
     show SuggestionBuilder;
 import 'package:analyzer/dart/element/element.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index dd5d733..ca8280c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index 41fa61c..51853fe 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/utilities/extensions/completion_request.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index 0e62f8e..72174fe 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
index 4fd743a..faea364 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index 9aa546b..ec104fa 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/utilities/extensions/completion_request.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index fd83310..8783ddd 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -1177,15 +1177,12 @@
   /// If the [element] has a documentation comment, fill the [suggestion]'s
   /// documentation fields.
   void _setDocumentation(CompletionSuggestion suggestion, Element element) {
-    final request = this.request;
-    if (request is DartCompletionRequestImpl) {
-      var documentationCache = request.documentationCache;
-      var data = documentationCache?.dataFor(element);
-      if (data != null) {
-        suggestion.docComplete = data.full;
-        suggestion.docSummary = data.summary;
-        return;
-      }
+    var documentationCache = request.documentationCache;
+    var data = documentationCache?.dataFor(element);
+    if (data != null) {
+      suggestion.docComplete = data.full;
+      suggestion.docSummary = data.summary;
+      return;
     }
     var doc = DartUnitHoverComputer.computeDocumentation(
         request.dartdocDirectiveInfo, element,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index f15812e..66b7f47 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -5,6 +5,7 @@
 import 'dart:collection';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
index cbb8337..703acf8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/uri_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 4a4c7d5..19d86b0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -5,7 +5,7 @@
 /// A collection of utility methods used by completion contributors.
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestion, Location;
-import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index 97b2249..1de638f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/correction/name_suggestion.dart';
 import 'package:analyzer/dart/ast/ast.dart';
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart b/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart
index f0af690..85066d4 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/completion_request.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:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index 8dfaa60..690b251 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
index e41e5a2..3099fcf 100644
--- a/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/combinator_contributor_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 6bfb885..b1d9045 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -5,10 +5,9 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart'
-    show DartCompletionRequestImpl;
+    show DartCompletionRequest;
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.dart';
 import 'package:analyzer/dart/analysis/results.dart';
@@ -531,14 +530,12 @@
 
   Future computeSuggestions({int times = 200}) async {
     result = await session.getResolvedUnit(testFile) as ResolvedUnitResult;
-    var baseRequest = CompletionRequestImpl(
-        result, completionOffset, CompletionPerformance());
-
-    return await baseRequest.performance.runRequestOperation(
+    return await CompletionPerformance().runRequestOperation(
       (performance) async {
         // Build the request
-        var request = DartCompletionRequestImpl.from(
-          baseRequest,
+        var request = DartCompletionRequest.from(
+          resolvedUnit: result,
+          offset: completionOffset,
           dartdocDirectiveInfo: dartdocInfo,
         );
 
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
index 3924da2..882d459 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_manager_test.dart
@@ -5,8 +5,6 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -52,13 +50,12 @@
     await resolveFile('$testPackageLibPath/b.dart');
 
     // Build the request
-    var baseRequest = CompletionRequestImpl(
-        await session.getResolvedUnit(testFile) as ResolvedUnitResult,
-        completionOffset,
-        CompletionPerformance());
-    await baseRequest.performance.runRequestOperation((performance) async {
-      request = DartCompletionRequestImpl.from(baseRequest);
-    });
+    var resolvedUnit =
+        await session.getResolvedUnit(testFile) as ResolvedUnitResult;
+    request = DartCompletionRequest.from(
+      resolvedUnit: resolvedUnit,
+      offset: completionOffset,
+    );
 
     var directives = request.target.unit.directives;
 
diff --git a/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
index 4e72a0e..d8f81bb 100644
--- a/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/extension_member_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
index f38df45..ff209f1 100644
--- a/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/field_formal_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/field_formal_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index b1cfe12..6f277c3 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 1d96cae..585012d 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/keyword_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/analysis/features.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
index ad09ba3..2d6d5f5 100644
--- a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/label_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
index d4a3f76..5c1db88 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_member_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/library_member_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
index 96ecfce..aa2e6a2 100644
--- a/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/library_prefix_contributor_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/library_prefix_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
index d5cfe06..3a6fa56 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 25888ec..6e7253d 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/local_reference_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
index 87db577..a671eeb 100644
--- a/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/named_constructor_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/named_constructor_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
index 3178bc4..e8eff71 100644
--- a/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/override_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/override_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
index 919e175..e4bc0d3 100644
--- a/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/static_member_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/static_member_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index 8633ece..c7f9a18 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/dart/type_member_contributor.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
index f2e442c..92e87d3 100644
--- a/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/uri_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart';
 import 'package:analyzer/file_system/memory_file_system.dart';
diff --git a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
index 97bac2b..63f698f 100644
--- a/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/variable_name_contributor_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/dart/variable_name_contributor.dart';
 import 'package:test/test.dart';
diff --git a/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart b/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
index 64130c8..009797d 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/suggestion_builder_test.dart
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analysis_server/src/services/completion/completion_core.dart';
-import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:test/test.dart';
@@ -29,8 +27,9 @@
   }
 
   Future<CompletionSuggestion> forTopLevelFunction(String functionName) async {
-    var request = DartCompletionRequestImpl.from(
-      CompletionRequestImpl(testAnalysisResult, 0, CompletionPerformance()),
+    var request = DartCompletionRequest.from(
+      resolvedUnit: testAnalysisResult,
+      offset: 0,
     );
     var builder = SuggestionBuilder(request);
     builder.suggestTopLevelFunction(findElement.topFunction('f'));
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 921a82f..25770fe 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.dart
@@ -2,7 +2,6 @@
 // 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:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/utilities/null_string_sink.dart';
@@ -99,9 +98,11 @@
           }
 
           timer.start();
-          var request = CompletionRequestImpl(result, offset, statistics);
-          var dartRequest = DartCompletionRequestImpl.from(request);
-          var suggestions = await request.performance.runRequestOperation(
+          var dartRequest = DartCompletionRequest.from(
+            resolvedUnit: result,
+            offset: offset,
+          );
+          var suggestions = await statistics.runRequestOperation(
             (performance) async {
               return await contributor.computeSuggestions(
                 dartRequest,
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 4746652..fe1e019 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -10,7 +10,6 @@
 import 'package:analysis_server/src/domains/completion/available_suggestions.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
-import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analysis_server/src/services/completion/dart/documentation_cache.dart';
@@ -718,7 +717,7 @@
   }
 
   int forEachExpectedCompletion(
-      CompletionRequestImpl request,
+      DartCompletionRequest request,
       MetricsSuggestionListener listener,
       ExpectedCompletion expectedCompletion,
       String? completionLocation,
@@ -1200,20 +1199,12 @@
   Future<List<protocol.CompletionSuggestion>> _computeCompletionSuggestions(
       MetricsSuggestionListener listener,
       OperationPerformanceImpl performance,
-      CompletionRequestImpl request,
-      DartdocDirectiveInfo dartdocDirectiveInfo,
-      DocumentationCache? documentationCache,
+      DartCompletionRequest dartRequest,
       [DeclarationsTracker? declarationsTracker,
       protocol.CompletionAvailableSuggestionsParams?
           availableSuggestionsParams]) async {
     List<protocol.CompletionSuggestion> suggestions;
 
-    var dartRequest = DartCompletionRequestImpl.from(
-      request,
-      dartdocDirectiveInfo: dartdocDirectiveInfo,
-      documentationCache: documentationCache,
-    );
-
     if (declarationsTracker == null) {
       // available suggestions == false
       suggestions = await DartCompletionManager(
@@ -1233,7 +1224,7 @@
         listener: listener,
       ).computeSuggestions(dartRequest, performance);
 
-      computeIncludedSetList(declarationsTracker, request.result,
+      computeIncludedSetList(declarationsTracker, dartRequest.result,
           includedSuggestionSetList, includedElementNames);
 
       var includedSuggestionSetMap = {
@@ -1375,27 +1366,21 @@
             {required MetricsSuggestionListener listener,
             required CompletionMetrics metrics}) async {
           var stopwatch = Stopwatch()..start();
-          var request = CompletionRequestImpl(
-            resolvedUnitResult,
-            expectedCompletion.offset,
-            CompletionPerformance(),
+          var request = DartCompletionRequest.from(
+            resolvedUnit: resolvedUnitResult,
+            offset: expectedCompletion.offset,
+            documentationCache: documentationCache,
           );
 
           late OpType opType;
           late List<protocol.CompletionSuggestion> suggestions;
-          await request.performance.runRequestOperation(
+          await CompletionPerformance().runRequestOperation(
             (performance) async {
-              var dartRequest = DartCompletionRequestImpl.from(
-                request,
-                documentationCache: documentationCache,
-              );
-              opType = OpType.forCompletion(dartRequest.target, request.offset);
+              opType = OpType.forCompletion(request.target, request.offset);
               suggestions = await _computeCompletionSuggestions(
                 listener,
                 performance,
                 request,
-                dartdocDirectiveInfo,
-                documentationCache,
                 metrics.availableSuggestions ? declarationsTracker : null,
                 metrics.availableSuggestions
                     ? availableSuggestionsParams
@@ -1719,7 +1704,7 @@
 class CompletionResult {
   final Place place;
 
-  final CompletionRequestImpl? request;
+  final DartCompletionRequest? request;
 
   final SuggestionData actualSuggestion;
 
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index f0dc96e..d672ae5 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,6 +1,7 @@
 ## 2.8.0-dev
 * Deprecations and renames for `getXyz` methods in `AnalysisDriver`.
 * Removed uppercase named constants from `double` in mock SDK.
+* Deprecated `path` and `uri` from `AnalysisResult`.
 
 ## 2.7.0
 * Updated `ConstructorElement.displayName` to either `Class` or `Class.constructor`.
diff --git a/pkg/analyzer/lib/dart/analysis/results.dart b/pkg/analyzer/lib/dart/analysis/results.dart
index 6bf41b7..a6f1df5 100644
--- a/pkg/analyzer/lib/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/dart/analysis/results.dart
@@ -16,6 +16,7 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class AnalysisResult {
   /// The absolute and normalized path of the file that was analyzed.
+  @Deprecated('Use FileResult.path instead')
   String get path;
 
   /// Return the session used to compute this result.
@@ -26,6 +27,7 @@
   ResultState get state;
 
   /// The absolute URI of the file that was analyzed.
+  @Deprecated('Use FileResult.uri instead')
   Uri get uri;
 }
 
@@ -83,6 +85,14 @@
 
   /// Information about lines in the content.
   LineInfo get lineInfo;
+
+  /// The absolute and normalized path of the file that was analyzed.
+  @override
+  String get path;
+
+  /// The absolute URI of the file that was analyzed.
+  @override
+  Uri get uri;
 }
 
 /// The type of [InvalidResult] returned when the given file path is invalid,
diff --git a/pkg/analyzer/lib/src/dart/analysis/results.dart b/pkg/analyzer/lib/src/dart/analysis/results.dart
index 5f03c26..4856a55 100644
--- a/pkg/analyzer/lib/src/dart/analysis/results.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/results.dart
@@ -16,9 +16,11 @@
   @override
   final AnalysisSession session;
 
+  @Deprecated('Use FileResult.path instead')
   @override
   final String path;
 
+  @Deprecated('Use FileResult.uri instead')
   @override
   final Uri uri;
 
@@ -62,9 +64,19 @@
       AnalysisSession session, String path, Uri uri, this.lineInfo, this.isPart)
       : super(session, path, uri);
 
+  @override
+  // TODO(scheglov) Convert into a field.
+  // ignore: deprecated_member_use_from_same_package, unnecessary_overrides
+  String get path => super.path;
+
   @Deprecated('Check for specific Result subtypes instead')
   @override
   ResultState get state => ResultState.VALID;
+
+  @override
+  // TODO(scheglov) Convert into a field.
+  // ignore: deprecated_member_use_from_same_package, unnecessary_overrides
+  Uri get uri => super.uri;
 }
 
 class LibraryElementResultImpl implements LibraryElementResult {
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 8ab312a..de37c97 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -1570,7 +1570,6 @@
     var uri = Uri.parse('package:test/test.dart');
     var result = driver.getParsedLibraryByUri(uri);
     result as ParsedLibraryResult;
-    expect(result.uri, uri);
     expect(result.units, hasLength(1));
     expect(result.units[0].uri, uri);
     expect(result.units[0].path, testFile);
@@ -1621,7 +1620,6 @@
     var uri = Uri.parse('package:test/test.dart');
     var result = await driver.getResolvedLibraryByUri(uri);
     result as ResolvedLibraryResult;
-    expect(result.uri, uri);
     expect(result.element.source.fullName, testFile);
     expect(result.units, hasLength(1));
     expect(result.units[0].uri, uri);
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index d9f6f0f..9512475 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -228,8 +228,6 @@
 
     var parsedLibrary = session.getParsedLibraryValid(testPath);
     expect(parsedLibrary.session, session);
-    expect(parsedLibrary.path, testPath);
-    expect(parsedLibrary.uri, Uri.parse('package:test/test.dart'));
 
     expect(parsedLibrary.units, hasLength(1));
     {
@@ -365,8 +363,6 @@
     newFile(c, content: cContent);
 
     var parsedLibrary = session.getParsedLibraryValid(a);
-    expect(parsedLibrary.path, a);
-    expect(parsedLibrary.uri, Uri.parse('package:test/a.dart'));
     expect(parsedLibrary.units, hasLength(3));
 
     {
@@ -401,9 +397,14 @@
 
     var parsedLibrary = session.getParsedLibraryByElementValid(element);
     expect(parsedLibrary.session, session);
-    expect(parsedLibrary.path, testPath);
-    expect(parsedLibrary.uri, Uri.parse('package:test/test.dart'));
     expect(parsedLibrary.units, hasLength(1));
+
+    {
+      var unit = parsedLibrary.units[0];
+      expect(unit.path, testPath);
+      expect(unit.uri, Uri.parse('package:test/test.dart'));
+      expect(unit.unit, isNotNull);
+    }
   }
 
   test_getParsedLibraryByElement_differentSession() async {
@@ -460,8 +461,6 @@
 
     var resolvedLibrary = await session.getResolvedLibraryValid(a);
     expect(resolvedLibrary.session, session);
-    expect(resolvedLibrary.path, a);
-    expect(resolvedLibrary.uri, Uri.parse('package:test/a.dart'));
 
     var typeProvider = resolvedLibrary.typeProvider;
     expect(typeProvider.intType.element.name, 'int');
@@ -586,9 +585,9 @@
 
     var result = await session.getResolvedLibraryByElementValid(element);
     expect(result.session, session);
-    expect(result.path, testPath);
-    expect(result.uri, Uri.parse('package:test/test.dart'));
     expect(result.units, hasLength(1));
+    expect(result.units[0].path, testPath);
+    expect(result.units[0].uri, Uri.parse('package:test/test.dart'));
     expect(result.units[0].unit.declaredElement, isNotNull);
   }
 
diff --git a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
index 52f968e..83bc4af 100644
--- a/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
+++ b/pkg/analyzer/test/src/dart/micro/simple_file_resolver_test.dart
@@ -1166,8 +1166,9 @@
 ''');
 
     var result = fileResolver.resolveLibrary(path: aPath);
-    expect(result.path, aPath);
     expect(result.units.length, 2);
+    expect(result.units[0].path, aPath);
+    expect(result.units[0].uri, Uri.parse('package:dart.test/a.dart'));
   }
 
   test_reuse_compatibleOptions() async {
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 9dc9bd9..6e68327 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1395,16 +1395,26 @@
     void emitSignature(String name, List<js_ast.Property> elements) {
       if (elements.isEmpty) return;
 
+      js_ast.Statement setSignature;
       if (!name.startsWith('Static')) {
         var proto = c == _coreTypes.objectClass
             ? js.call('Object.create(null)')
             : runtimeCall('get${name}s(#.__proto__)', [className]);
         elements.insert(0, js_ast.Property(propertyName('__proto__'), proto));
+        setSignature = runtimeStatement('set${name}Signature(#, () => #)', [
+          className,
+          js_ast.ObjectInitializer(elements, multiline: elements.length > 1)
+        ]);
+      } else {
+        // TODO(40273) Only tagging with the names of static members until the
+        // debugger consumes signature information from symbol files.
+        setSignature = runtimeStatement('set${name}Signature(#, () => #)', [
+          className,
+          js_ast.ArrayInitializer(elements.map((e) => e.name).toList())
+        ]);
       }
-      body.add(runtimeStatement('set${name}Signature(#, () => #)', [
-        className,
-        js_ast.ObjectInitializer(elements, multiline: elements.length > 1)
-      ]));
+
+      body.add(setSignature);
     }
 
     var extMethods = _classProperties.extensionMethods;
@@ -1416,6 +1426,8 @@
     var staticSetters = <js_ast.Property>[];
     var instanceSetters = <js_ast.Property>[];
     List<js_ast.Property> getSignatureList(Procedure p) {
+      // TODO(40273) Skip for all statics when the debugger consumes signature
+      // information from symbol files.
       if (p.isStatic) {
         if (p.isGetter) {
           return staticGetters;
@@ -1437,9 +1449,14 @@
 
     var classProcedures = c.procedures.where((p) => !p.isAbstract).toList();
     for (var member in classProcedures) {
-      // Static getters/setters/methods cannot be called with dynamic dispatch,
-      // nor can they be torn off.
-      if (member.isStatic) continue;
+      // Static getters/setters cannot be called with dynamic dispatch or torn
+      // off. Static methods can't be called with dynamic dispatch and are
+      // tagged with a type when torn off. Most are implicitly const and
+      // canonicalized. Static signatures are only used by the debugger and are
+      // not needed for runtime correctness.
+      // TODO(40273) Skip for all statics when the debugger consumes signature
+      // information from symbol files.
+      if (isTearOffLowering(member)) continue;
 
       var name = member.name.text;
       var reifiedType = _memberRuntimeType(member, c) as FunctionType;
@@ -1478,6 +1495,8 @@
     }
 
     emitSignature('Method', instanceMethods);
+    // TODO(40273) Skip for all statics when the debugger consumes signature
+    // information from symbol files.
     emitSignature('StaticMethod', staticMethods);
     emitSignature('Getter', instanceGetters);
     emitSignature('Setter', instanceSetters);
@@ -1491,16 +1510,19 @@
 
     var classFields = c.fields.toList();
     for (var field in classFields) {
-      // Only instance fields need to be saved for dynamic dispatch.
-      var isStatic = field.isStatic;
-      if (isStatic) continue;
-
+      // Static fields cannot be called with dynamic dispatch or torn off. The
+      // signatures are only used by the debugger and are not needed for runtime
+      // correctness.
       var memberName = _declareMemberName(field);
       var fieldSig = _emitFieldSignature(field, c);
-      (isStatic ? staticFields : instanceFields)
+      // TODO(40273) Skip static fields when the debugger consumes signature
+      // information from symbol files.
+      (field.isStatic ? staticFields : instanceFields)
           .add(js_ast.Property(memberName, fieldSig));
     }
     emitSignature('Field', instanceFields);
+    // TODO(40273) Skip for all statics when the debugger consumes signature
+    // information from symbol files.
     emitSignature('StaticField', staticFields);
 
     // Add static property dart._runtimeType to Object.
@@ -2525,6 +2547,9 @@
       var exportName = _jsExportName(member);
       if (exportName != null) return propertyName(exportName);
     }
+    if (member is Procedure && member.isFactory) {
+      return _constructorName(member.name.text);
+    }
     switch (name) {
       // Reserved for the compiler to do `x as T`.
       case 'as':
diff --git a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
index 1f9e933..467e012 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
@@ -924,23 +924,9 @@
     // implemented interfaces, and methods.
     var ret = LinkedHashSet<NameValuePair>();
 
-    var staticProperties = Set<NameValuePair>();
-    var staticMethods = Set<NameValuePair>();
-    // Static fields and properties.
-    addPropertiesFromSignature(
-        dart.getStaticFields(type), staticProperties, type, false);
-    addPropertiesFromSignature(
-        dart.getStaticGetters(type), staticProperties, type, false);
-    // static methods.
-    addPropertiesFromSignature(
-        dart.getStaticMethods(type), staticMethods, type, false);
-
-    if (staticProperties.isNotEmpty || staticMethods.isNotEmpty) {
-      ret
-        ..add(NameValuePair(value: '[[Static members]]', hideName: true))
-        ..addAll(sortProperties(staticProperties))
-        ..addAll(sortProperties(staticMethods));
-    }
+    // Static fields, getters, setters, and methods signatures were removed
+    // from the runtime representation because they are not needed. At this
+    // time there is no intention to support them in this custom formatter.
 
     // instance methods.
     var instanceMethods = Set<NameValuePair>();
diff --git a/tools/VERSION b/tools/VERSION
index bd85cf6..b11192f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 251
+PRERELEASE 252
 PRERELEASE_PATCH 0
\ No newline at end of file