Pass DartCompletionRequestImpl to DartCompletionManager.

We sometimes create it outside DartCompletionManager, and then call
and create it inside again.

Change-Id: Ifa5bd958437a5ea4e2bac65e7800183f915a9a07
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/217800
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 225a9fa..3a20010 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/element/element.dart' show LibraryElement;
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/micro/resolve_file.dart';
-import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:meta/meta.dart';
 
@@ -78,7 +77,10 @@
         offset,
         CompletionPerformance(),
       );
-      var dartdocDirectiveInfo = DartdocDirectiveInfo();
+
+      _dartCompletionRequest = await DartCompletionRequestImpl.from(
+        completionRequest,
+      );
 
       var suggestions = await performance.runAsync(
         'suggestions',
@@ -90,15 +92,14 @@
                 <IncludedSuggestionRelevanceTag>[];
 
             var manager = DartCompletionManager(
-              dartdocDirectiveInfo: dartdocDirectiveInfo,
               includedElementKinds: includedElementKinds,
               includedElementNames: includedElementNames,
               includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
             );
 
             return await manager.computeSuggestions(
+              _dartCompletionRequest,
               performance,
-              completionRequest,
               enableOverrideContributor: false,
               enableUriContributor: false,
             );
@@ -109,12 +110,6 @@
         },
       );
 
-      _dartCompletionRequest = await DartCompletionRequestImpl.from(
-        performance,
-        completionRequest,
-        dartdocDirectiveInfo,
-      );
-
       performance.run('imports', (performance) {
         if (_dartCompletionRequest.includeIdentifiers) {
           _logger.run('Add imported suggestions', () {
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
index 9a00f2d..bef8ea5 100644
--- a/pkg/analysis_server/lib/src/domain_completion.dart
+++ b/pkg/analysis_server/lib/src/domain_completion.dart
@@ -95,9 +95,6 @@
     const COMPUTE_SUGGESTIONS_TAG = 'computeSuggestions';
     await perf.runAsync(COMPUTE_SUGGESTIONS_TAG, (perf) async {
       var manager = DartCompletionManager(
-        dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
-          request.result,
-        ),
         includedElementKinds: includedElementKinds,
         includedElementNames: includedElementNames,
         includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
@@ -105,11 +102,16 @@
 
       var contributorTag = 'computeSuggestions - ${manager.runtimeType}';
       await perf.runAsync(contributorTag, (performance) async {
+        var dartRequest = await DartCompletionRequestImpl.from(
+          request,
+          dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(
+            request.result,
+          ),
+          documentationCache: server.getDocumentationCacheFor(request.result),
+        );
         try {
           suggestions.addAll(
-            await manager.computeSuggestions(performance, request,
-                documentationCache:
-                    server.getDocumentationCacheFor(request.result)),
+            await manager.computeSuggestions(dartRequest, performance),
           );
         } on AbortCompletion {
           suggestions.clear();
diff --git a/pkg/analysis_server/lib/src/domains/execution/completion.dart b/pkg/analysis_server/lib/src/domains/execution/completion.dart
index 7162de9..01ab4cf 100644
--- a/pkg/analysis_server/lib/src/domains/execution/completion.dart
+++ b/pkg/analysis_server/lib/src/domains/execution/completion.dart
@@ -70,20 +70,19 @@
       return RuntimeCompletionResult([], []);
     }
 
-    var contributor = DartCompletionManager(
-        // dartdocDirectiveInfo: server.getDartdocDirectiveInfoFor(targetResult)
-        );
     var request = CompletionRequestImpl(
       targetResult,
       targetOffset,
       CompletionPerformance(),
     );
 
+    var dartRequest = await DartCompletionRequestImpl.from(request);
+
     var suggestions = await request.performance.runRequestOperation(
       (performance) async {
-        return await contributor.computeSuggestions(
+        return await DartCompletionManager().computeSuggestions(
+          dartRequest,
           performance,
-          request,
         );
       },
     );
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 2ab3d5d..c93b316 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -214,7 +214,10 @@
       final directiveInfo =
           server.getDartdocDirectiveInfoFor(completionRequest.result);
       final dartCompletionRequest = await DartCompletionRequestImpl.from(
-          perf, completionRequest, directiveInfo);
+        completionRequest,
+        dartdocDirectiveInfo: directiveInfo,
+        completionPreference: CompletionPreference.replace,
+      );
       final target = dartCompletionRequest.target;
 
       if (triggerCharacter != null) {
@@ -234,16 +237,14 @@
 
       try {
         var contributor = DartCompletionManager(
-          dartdocDirectiveInfo: directiveInfo,
           includedElementKinds: includedElementKinds,
           includedElementNames: includedElementNames,
           includedSuggestionRelevanceTags: includedSuggestionRelevanceTags,
         );
 
         final serverSuggestions = await contributor.computeSuggestions(
+          dartCompletionRequest,
           perf,
-          completionRequest,
-          completionPreference: CompletionPreference.replace,
         );
 
         final insertLength = _computeInsertLength(
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 f8298ff..039cd5d 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
@@ -6,7 +6,6 @@
 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/completion_performance.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';
@@ -49,9 +48,6 @@
 /// [DartCompletionManager] determines if a completion request is Dart specific
 /// and forwards those requests to all [DartCompletionContributor]s.
 class DartCompletionManager {
-  /// The object used to resolve macros in Dartdoc comments.
-  final DartdocDirectiveInfo? dartdocDirectiveInfo;
-
   /// If not `null`, then instead of using [ImportedReferenceContributor],
   /// fill this set with kinds of elements that are applicable at the
   /// completion location, so should be suggested from available suggestion
@@ -77,8 +73,7 @@
   /// [includedSuggestionRelevanceTags] must either all be `null` or must all be
   /// non-`null`.
   DartCompletionManager(
-      {this.dartdocDirectiveInfo,
-      this.includedElementKinds,
+      {this.includedElementKinds,
       this.includedElementNames,
       this.includedSuggestionRelevanceTags,
       this.listener})
@@ -90,27 +85,18 @@
                 includedSuggestionRelevanceTags == null));
 
   Future<List<CompletionSuggestion>> computeSuggestions(
-    OperationPerformanceImpl performance,
-    CompletionRequest request, {
+    DartCompletionRequestImpl dartRequest,
+    OperationPerformanceImpl performance, {
     bool enableOverrideContributor = true,
     bool enableUriContributor = true,
-    CompletionPreference? completionPreference,
-    DocumentationCache? documentationCache,
   }) async {
+    final request = dartRequest.request;
     request.checkAborted();
     var pathContext = request.resourceProvider.pathContext;
     if (!file_paths.isDart(pathContext, request.result.path)) {
       return const <CompletionSuggestion>[];
     }
 
-    var dartRequest = await DartCompletionRequestImpl.from(
-      performance,
-      request,
-      dartdocDirectiveInfo,
-      completionPreference: completionPreference,
-      documentationCache: documentationCache,
-    );
-
     // Don't suggest in comments.
     if (dartRequest.target.isCommentText) {
       return const <CompletionSuggestion>[];
@@ -258,6 +244,8 @@
 
 /// The information about a requested list of completions within a Dart file.
 class DartCompletionRequestImpl implements DartCompletionRequest {
+  final CompletionRequest request;
+
   @override
   final ResolvedUnitResult result;
 
@@ -298,8 +286,6 @@
 
   final CompletionRequest _originalRequest;
 
-  final CompletionPerformance performance;
-
   SourceRange? _replacementRange;
 
   @override
@@ -308,6 +294,7 @@
   final DocumentationCache? documentationCache;
 
   DartCompletionRequestImpl._(
+      this.request,
       this.result,
       this.resourceProvider,
       this.objectType,
@@ -317,7 +304,6 @@
       CompilationUnit unit,
       this.dartdocDirectiveInfo,
       this._originalRequest,
-      this.performance,
       {CompletionPreference? completionPreference,
       this.documentationCache})
       : featureComputer =
@@ -447,39 +433,34 @@
     }
   }
 
-  /// Return a [Future] that completes with a newly created completion request
-  /// based on the given [request]. This method will throw [AbortCompletion]
-  /// if the completion request has been aborted.
+  /// Return a newly created completion request based on the given [request].
+  /// This method will throw [AbortCompletion] if the completion request has
+  /// been aborted.
   static Future<DartCompletionRequestImpl> from(
-      OperationPerformanceImpl performance,
-      CompletionRequest request,
-      DartdocDirectiveInfo? dartdocDirectiveInfo,
-      {CompletionPreference? completionPreference,
-      DocumentationCache? documentationCache}) async {
+    CompletionRequest request, {
+    DartdocDirectiveInfo? dartdocDirectiveInfo,
+    CompletionPreference? completionPreference,
+    DocumentationCache? documentationCache,
+  }) async {
     request.checkAborted();
 
-    return performance.run(
-      'build DartCompletionRequest',
-      (_) {
-        var unit = request.result.unit;
-        var libSource = unit.declaredElement!.library.source;
-        var objectType = request.result.typeProvider.objectType;
+    var unit = request.result.unit;
+    var libSource = unit.declaredElement!.library.source;
+    var objectType = request.result.typeProvider.objectType;
 
-        return DartCompletionRequestImpl._(
-          request.result,
-          request.resourceProvider,
-          objectType,
-          libSource,
-          request.source,
-          request.offset,
-          unit,
-          dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
-          request,
-          (request as CompletionRequestImpl).performance,
-          completionPreference: completionPreference,
-          documentationCache: documentationCache,
-        );
-      },
+    return DartCompletionRequestImpl._(
+      request,
+      request.result,
+      request.resourceProvider,
+      objectType,
+      libSource,
+      request.source,
+      request.offset,
+      unit,
+      dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
+      request,
+      completionPreference: completionPreference,
+      documentationCache: documentationCache,
     );
   }
 }
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 8545220..35f317f 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
@@ -538,7 +538,9 @@
       (performance) async {
         // Build the request
         var request = await DartCompletionRequestImpl.from(
-            performance, baseRequest, dartdocInfo);
+          baseRequest,
+          dartdocDirectiveInfo: dartdocInfo,
+        );
 
         var range = request.target.computeReplacementRange(request.offset);
         replacementOffset = range.offset;
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 38fb1ef..9e8f9e7 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
@@ -12,7 +12,6 @@
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -59,8 +58,7 @@
         CompletionPerformance());
     await baseRequest.performance.runRequestOperation((performance) async {
       var requestCompleter = Completer<DartCompletionRequest>();
-      DartCompletionRequestImpl.from(
-              performance, baseRequest, DartdocDirectiveInfo())
+      DartCompletionRequestImpl.from(baseRequest)
           .then((DartCompletionRequest request) {
         requestCompleter.complete(request);
       });
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 4cc60a3..1bd5992 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
@@ -7,8 +7,6 @@
 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:analyzer/src/dartdoc/dartdoc_directive_info.dart';
-import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -32,9 +30,8 @@
 
   Future<CompletionSuggestion> forTopLevelFunction(String functionName) async {
     var request = await DartCompletionRequestImpl.from(
-        OperationPerformanceImpl(''),
-        CompletionRequestImpl(testAnalysisResult, 0, CompletionPerformance()),
-        DartdocDirectiveInfo());
+      CompletionRequestImpl(testAnalysisResult, 0, CompletionPerformance()),
+    );
     var builder = SuggestionBuilder(request);
     builder.suggestTopLevelFunction(findElement.topFunction('f'));
     var suggestions = builder.suggestions.toList();
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 16d1e81..dcb36a9 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.dart
@@ -100,11 +100,12 @@
 
           timer.start();
           var request = CompletionRequestImpl(result, offset, statistics);
+          var dartRequest = await DartCompletionRequestImpl.from(request);
           var suggestions = await request.performance.runRequestOperation(
             (performance) async {
               return await contributor.computeSuggestions(
+                dartRequest,
                 performance,
-                request,
               );
             },
           );
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 4522ce8..6b4dd8a 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -1208,13 +1208,17 @@
           availableSuggestionsParams]) async {
     List<protocol.CompletionSuggestion> suggestions;
 
+    var dartRequest = await DartCompletionRequestImpl.from(
+      request,
+      dartdocDirectiveInfo: dartdocDirectiveInfo,
+      documentationCache: documentationCache,
+    );
+
     if (declarationsTracker == null) {
       // available suggestions == false
       suggestions = await DartCompletionManager(
-        dartdocDirectiveInfo: dartdocDirectiveInfo,
         listener: listener,
-      ).computeSuggestions(performance, request,
-          documentationCache: documentationCache);
+      ).computeSuggestions(dartRequest, performance);
     } else {
       // available suggestions == true
       var includedElementKinds = <protocol.ElementKind>{};
@@ -1223,13 +1227,11 @@
           <protocol.IncludedSuggestionRelevanceTag>[];
       var includedSuggestionSetList = <protocol.IncludedSuggestionSet>[];
       suggestions = await DartCompletionManager(
-        dartdocDirectiveInfo: dartdocDirectiveInfo,
         includedElementKinds: includedElementKinds,
         includedElementNames: includedElementNames,
         includedSuggestionRelevanceTags: includedSuggestionRelevanceTagList,
         listener: listener,
-      ).computeSuggestions(performance, request,
-          documentationCache: documentationCache);
+      ).computeSuggestions(dartRequest, performance);
 
       computeIncludedSetList(declarationsTracker, request.result,
           includedSuggestionSetList, includedElementNames);
@@ -1378,14 +1380,15 @@
             expectedCompletion.offset,
             CompletionPerformance(),
           );
-          var directiveInfo = DartdocDirectiveInfo();
 
           late OpType opType;
           late List<protocol.CompletionSuggestion> suggestions;
           await request.performance.runRequestOperation(
             (performance) async {
               var dartRequest = await DartCompletionRequestImpl.from(
-                  performance, request, directiveInfo);
+                request,
+                documentationCache: documentationCache,
+              );
               opType = OpType.forCompletion(dartRequest.target, request.offset);
               suggestions = await _computeCompletionSuggestions(
                 listener,