[analysis_server] Handle annotations + default to new protocol for completion metrics tool

Change-Id: I57c8f077ccc853ae7ece44c776e16e0f30401a66
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/325820
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index c737b84..bde790c 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -11,7 +11,6 @@
 import 'dart:math' as math;
 
 import 'package:_fe_analyzer_shared/src/base/syntactic_entity.dart';
-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/dart/completion_manager.dart';
@@ -44,8 +43,6 @@
         VariableElement;
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/dart/analysis/byte_store.dart';
-import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
 import 'package:args/args.dart';
@@ -312,13 +309,6 @@
   /// The name associated with this set of metrics.
   final String name;
 
-  /// A flag indicating whether available suggestions should be enabled for this
-  /// run.
-  final bool availableSuggestions;
-
-  /// A flag indicating whether the new protocol should be used for this run.
-  final bool useNewProtocol;
-
   /// The function to be executed when this metrics collector is enabled.
   final void Function()? enableFunction;
 
@@ -394,18 +384,12 @@
 
   final Map<CompletionGroup, List<CompletionResult>> worstResults = {};
 
-  CompletionMetrics(this.name,
-      {required this.availableSuggestions,
-      this.useNewProtocol = false,
-      this.enableFunction,
-      this.disableFunction})
-      : assert(!(availableSuggestions && useNewProtocol)),
-        userTag = UserTag(name);
+  CompletionMetrics(this.name, {this.enableFunction, this.disableFunction})
+      : userTag = UserTag(name);
 
   /// Return an instance extracted from the decoded JSON [map].
   factory CompletionMetrics.fromJson(Map<String, dynamic> map) {
-    var metrics = CompletionMetrics(map['name'] as String,
-        availableSuggestions: map['availableSuggestions'] as bool);
+    var metrics = CompletionMetrics(map['name'] as String);
     metrics.completionCounter
         .fromJson(map['completionCounter'] as Map<String, dynamic>);
     metrics.completionMissedTokenCounter
@@ -555,7 +539,6 @@
   Map<String, dynamic> toJson() {
     return {
       'name': name,
-      'availableSuggestions': availableSuggestions,
       'completionCounter': completionCounter.toJson(),
       'completionMissedTokenCounter': completionMissedTokenCounter.toJson(),
       'completionKindCounter': completionKindCounter.toJson(),
@@ -731,10 +714,6 @@
   /// A list of the metrics to be computed.
   final List<CompletionMetrics> targetMetrics = [];
 
-  DeclarationsTracker? _declarationsTracker;
-
-  protocol.CompletionAvailableSuggestionsParams? _availableSuggestionsParams;
-
   CompletionQualityMetricsComputer(
       super.rootPath, CompletionMetricsQualityOptions super.options);
 
@@ -771,7 +750,7 @@
   }
 
   /// Compare the metrics when each feature is used in isolation.
-  void compareIndividualFeatures({bool availableSuggestions = false}) {
+  void compareIndividualFeatures() {
     var featureNames = FeatureComputer.featureNames;
     var featureCount = featureNames.length;
     for (var i = 0; i < featureCount; i++) {
@@ -779,7 +758,6 @@
       weights[i] = 1.00;
       targetMetrics.add(CompletionMetrics(
         featureNames[i],
-        availableSuggestions: availableSuggestions,
         enableFunction: () {
           FeatureComputer.featureWeights = weights;
         },
@@ -792,13 +770,11 @@
   }
 
   /// Compare the relevance [tables] to the default relevance tables.
-  void compareRelevanceTables(List<RelevanceTables> tables,
-      {bool availableSuggestions = false}) {
+  void compareRelevanceTables(List<RelevanceTables> tables) {
     assert(tables.isNotEmpty);
     for (var tablePair in tables) {
       targetMetrics.add(CompletionMetrics(
         tablePair.name,
-        availableSuggestions: availableSuggestions,
         enableFunction: () {
           elementKindRelevance = tablePair.elementKindRelevance;
           keywordRelevance = tablePair.keywordRelevance;
@@ -816,22 +792,16 @@
     // To compare two or more changes to completions, add a `CompletionMetrics`
     // object with enable and disable functions to the list of `targetMetrics`.
     targetMetrics.add(CompletionMetrics('shipping',
-        availableSuggestions: true,
-        enableFunction: null,
-        disableFunction: null));
+        enableFunction: null, disableFunction: null));
 
     // To compare two or more relevance tables, uncomment the line below and
     // add the `RelevanceTables` to the list. The default relevance tables
     // should not be included in the list.
-//    compareRelevanceTables([], availableSuggestions: false);
+//    compareRelevanceTables([]);
 
     // To compare the relative benefit from each of the features, uncomment the
     // line below.
-//    compareIndividualFeatures(availableSuggestions: false);
-
-    // To compare the new protocol to the old, uncomment the lines below.
-//    targetMetrics.add(CompletionMetrics('new protocol',
-//        availableSuggestions: false, useNewProtocol: true));
+//    compareIndividualFeatures();
 
     await super.computeMetrics();
   }
@@ -860,9 +830,7 @@
         listener,
         OperationPerformanceImpl('<root>'),
         request,
-        metrics.availableSuggestions ? _declarationsTracker : null,
-        metrics.availableSuggestions ? _availableSuggestionsParams : null,
-        metrics.useNewProtocol ? NotImportedSuggestions() : null,
+        NotImportedSuggestions(),
       );
       stopwatch.stop();
 
@@ -1414,21 +1382,7 @@
   }
 
   @override
-  void setupForResolution(AnalysisContext context) {
-    if (targetMetrics.any((metrics) => metrics.availableSuggestions)) {
-      var declarationsTracker = DeclarationsTracker(
-          MemoryByteStore(), PhysicalResourceProvider.INSTANCE);
-      declarationsTracker.addContext(context);
-      while (declarationsTracker.hasWork) {
-        declarationsTracker.doWork();
-      }
-
-      // Have the [AvailableDeclarationsSet] computed to use later.
-      _availableSuggestionsParams = createCompletionAvailableSuggestions(
-          declarationsTracker.allLibraries.toList(), []);
-      _declarationsTracker = declarationsTracker;
-    }
-  }
+  void setupForResolution(AnalysisContext context) {}
 
   int _computeCharsBeforeTop(ExpectedCompletion target,
       List<protocol.CompletionSuggestion> suggestions,
@@ -1455,92 +1409,22 @@
       MetricsSuggestionListener listener,
       OperationPerformanceImpl performance,
       DartCompletionRequest dartRequest,
-      [DeclarationsTracker? declarationsTracker,
-      protocol.CompletionAvailableSuggestionsParams? availableSuggestionsParams,
-      NotImportedSuggestions? notImportedSuggestions]) async {
+      NotImportedSuggestions notImportedSuggestions) async {
     List<protocol.CompletionSuggestion> suggestions;
 
     var budget = CompletionBudget(Duration(seconds: 30));
-    if (declarationsTracker == null) {
-      // available suggestions == false
-      var serverSuggestions = await DartCompletionManager(
-        budget: budget,
-        listener: listener,
-        notImportedSuggestions: notImportedSuggestions,
-      ).computeSuggestions(
-        dartRequest,
-        performance,
-        useFilter: true,
-      );
-      suggestions = serverSuggestions.map((serverSuggestion) {
-        return serverSuggestion.build();
-      }).toList();
-    } else {
-      // available suggestions == true
-      var includedElementKinds = <protocol.ElementKind>{};
-      var includedElementNames = <String>{};
-      var includedSuggestionRelevanceTagList =
-          <protocol.IncludedSuggestionRelevanceTag>[];
-      var includedSuggestionSetList = <protocol.IncludedSuggestionSet>[];
-      var serverSuggestions = await DartCompletionManager(
-        budget: budget,
-        includedElementKinds: includedElementKinds,
-        includedElementNames: includedElementNames,
-        includedSuggestionRelevanceTags: includedSuggestionRelevanceTagList,
-        listener: listener,
-      ).computeSuggestions(
-        dartRequest,
-        performance,
-        useFilter: true,
-      );
-      suggestions = serverSuggestions.map((serverSuggestion) {
-        return serverSuggestion.build();
-      }).toList();
-
-      computeIncludedSetList(declarationsTracker, dartRequest,
-          includedSuggestionSetList, includedElementNames);
-
-      var includedSuggestionSetMap = {
-        for (var includedSuggestionSet in includedSuggestionSetList)
-          includedSuggestionSet.id: includedSuggestionSet,
-      };
-
-      var includedSuggestionRelevanceTagMap = {
-        for (var includedSuggestionRelevanceTag
-            in includedSuggestionRelevanceTagList)
-          includedSuggestionRelevanceTag.tag:
-              includedSuggestionRelevanceTag.relevanceBoost,
-      };
-
-      for (var availableSuggestionSet
-          in availableSuggestionsParams!.changedLibraries!) {
-        var id = availableSuggestionSet.id;
-        for (var availableSuggestion in availableSuggestionSet.items) {
-          // Exclude available suggestions where this element kind doesn't match
-          // an element kind in includedElementKinds.
-          var elementKind = availableSuggestion.element.kind;
-          if (includedElementKinds.contains(elementKind)) {
-            if (includedSuggestionSetMap.containsKey(id)) {
-              var relevance = includedSuggestionSetMap[id]!.relevance;
-
-              // Search for any matching relevance tags to apply any boosts
-              if (includedSuggestionRelevanceTagList.isNotEmpty &&
-                  availableSuggestion.relevanceTags != null &&
-                  availableSuggestion.relevanceTags!.isNotEmpty) {
-                for (var tag in availableSuggestion.relevanceTags!) {
-                  if (includedSuggestionRelevanceTagMap.containsKey(tag)) {
-                    // apply the boost
-                    relevance += includedSuggestionRelevanceTagMap[tag]!;
-                  }
-                }
-              }
-              suggestions
-                  .add(availableSuggestion.toCompletionSuggestion(relevance));
-            }
-          }
-        }
-      }
-    }
+    var serverSuggestions = await DartCompletionManager(
+      budget: budget,
+      listener: listener,
+      notImportedSuggestions: notImportedSuggestions,
+    ).computeSuggestions(
+      dartRequest,
+      performance,
+      useFilter: true,
+    );
+    suggestions = serverSuggestions.map((serverSuggestion) {
+      return serverSuggestion.build();
+    }).toList();
 
     // Note that some routes sort suggestions before responding differently.
     // The Cider and legacy handlers use [fuzzyFilterSort], which does not match
@@ -2030,18 +1914,3 @@
       '${(this * 100).toStringAsFixed(fractionDigits)}%'
           .padLeft(4 + fractionDigits);
 }
-
-extension AvailableSuggestionsExtension on protocol.AvailableSuggestion {
-  // TODO(jwren) I am not sure if we want CompletionSuggestionKind.INVOCATION in
-  // call cases here, to iterate I need to figure out why this algorithm is
-  // taking so much time.
-  protocol.CompletionSuggestion toCompletionSuggestion(int relevance) =>
-      protocol.CompletionSuggestion(
-          protocol.CompletionSuggestionKind.INVOCATION,
-          relevance,
-          label,
-          label.length,
-          0,
-          element.isDeprecated,
-          false);
-}
diff --git a/pkg/analysis_server/tool/code_completion/visitors.dart b/pkg/analysis_server/tool/code_completion/visitors.dart
index edf164d..af4a5f3 100644
--- a/pkg/analysis_server/tool/code_completion/visitors.dart
+++ b/pkg/analysis_server/tool/code_completion/visitors.dart
@@ -672,6 +672,14 @@
             // }
           }
         }
+
+        // A class reference followed by parens in an annotation is a
+        // constructor reference.
+        if (elementKind == protocol.ElementKind.CLASS &&
+            node.thisOrAncestorOfType<Annotation>() != null &&
+            node.endToken.next?.type == TokenType.OPEN_PAREN) {
+          elementKind = protocol.ElementKind.CONSTRUCTOR;
+        }
       }
       safelyRecordEntity(node, elementKind: elementKind);
     }