Elements. Migrate lib/src/lsp/completion_utils.dart

Change-Id: I76f97ace7ffdbe77c556a9e4f0030dbb4ff5faf8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400161
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analysis_server/analyzer_use_new_elements.txt b/pkg/analysis_server/analyzer_use_new_elements.txt
index c75e589..6342280 100644
--- a/pkg/analysis_server/analyzer_use_new_elements.txt
+++ b/pkg/analysis_server/analyzer_use_new_elements.txt
@@ -5,7 +5,6 @@
 lib/src/domains/analysis/occurrences_dart.dart
 lib/src/handler/legacy/edit_get_available_refactorings.dart
 lib/src/handler/legacy/search_find_element_references.dart
-lib/src/lsp/completion_utils.dart
 lib/src/lsp/handlers/handler_completion.dart
 lib/src/lsp/handlers/handler_completion_resolve.dart
 lib/src/lsp/handlers/handler_definition.dart
diff --git a/pkg/analysis_server/lib/src/lsp/completion_utils.dart b/pkg/analysis_server/lib/src/lsp/completion_utils.dart
index 9e78f1c..395c3c2 100644
--- a/pkg/analysis_server/lib/src/lsp/completion_utils.dart
+++ b/pkg/analysis_server/lib/src/lsp/completion_utils.dart
@@ -16,11 +16,9 @@
 import 'package:analysis_server/src/utilities/extensions/ast.dart';
 import 'package:analysis_server/src/utilities/extensions/element.dart';
 import 'package:analysis_server/src/utilities/extensions/string.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/source/line_info.dart' as server;
 import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:analyzer_plugin/src/utilities/client_uri_converter.dart';
 import 'package:analyzer_plugin/src/utilities/documentation.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
@@ -127,13 +125,14 @@
   // functions but they should not be included in the completions.
   var element =
       suggestion is ElementBasedSuggestion
-          ? (suggestion as ElementBasedSuggestion).element.asElement
+          ? (suggestion as ElementBasedSuggestion).element
           : null;
   var isCallable =
       element != null &&
-      (element is ConstructorElement ||
-          element is FunctionElement ||
-          element is MethodElement);
+      (element is ConstructorElement2 ||
+          element is LocalFunctionElement ||
+          element is TopLevelFunctionElement ||
+          element is MethodElement2);
   var isInvocation =
       (suggestion is ExecutableSuggestion &&
           suggestion.kind == server.CompletionSuggestionKind.INVOCATION) ||
@@ -191,7 +190,7 @@
   var colorPreviewHex =
       capabilities.completionItemKinds.contains(lsp.CompletionItemKind.Color) &&
               suggestion is ElementBasedSuggestion
-          ? server.getColorHexString(element)
+          ? server.getColorHexString2(element)
           : null;
 
   var completionKind =
@@ -382,7 +381,7 @@
 
   if (suggestion is ElementBasedSuggestion) {
     return _elementToCompletionItemKind(
-      (suggestion as ElementBasedSuggestion).element.asElement!,
+      (suggestion as ElementBasedSuggestion).element,
       supportedCompletionKinds,
     ).firstWhereOrNull(isSupported);
   }
@@ -430,30 +429,28 @@
   return getCompletionKind().firstWhereOrNull(isSupported);
 }
 
-/// Get the [lsp.CompletionItemKind] based on the [Element] for an [ElementBasedSuggestion].
+/// Get the [lsp.CompletionItemKind] based on the [Element2] for
+/// an [ElementBasedSuggestion].
 List<lsp.CompletionItemKind> _elementToCompletionItemKind(
-  Element element,
+  Element2 element,
   Set<lsp.CompletionItemKind> supportedCompletionKinds,
 ) {
-  if (element is ClassElement) {
+  if (element is ClassElement2) {
     return const [lsp.CompletionItemKind.Class];
   }
-  if (element is CompilationUnitElement) {
-    return const [lsp.CompletionItemKind.File, lsp.CompletionItemKind.Module];
-  }
-  if (element is ConstructorElement) {
+  if (element is ConstructorElement2) {
     return const [lsp.CompletionItemKind.Constructor];
   }
-  if (element is EnumElement) {
+  if (element is EnumElement2) {
     return const [lsp.CompletionItemKind.Enum];
   }
-  if (element is ExtensionElement) {
+  if (element is ExtensionElement2) {
     return const [lsp.CompletionItemKind.Method];
   }
-  if (element is ExtensionTypeElement) {
+  if (element is ExtensionTypeElement2) {
     return const [lsp.CompletionItemKind.Class];
   }
-  if (element is FieldElement) {
+  if (element is FieldElement2) {
     if (element.isEnumConstant) {
       return const [
         lsp.CompletionItemKind.EnumMember,
@@ -462,40 +459,43 @@
     }
     return const [lsp.CompletionItemKind.Field];
   }
-  if (element is FunctionElement) {
+  if (element is LocalFunctionElement) {
     return const [lsp.CompletionItemKind.Function];
   }
-  if (element is LabelElement) {
+  if (element is TopLevelFunctionElement) {
+    return const [lsp.CompletionItemKind.Function];
+  }
+  if (element is LabelElement2) {
     return const [lsp.CompletionItemKind.Text];
   }
-  if (element is LibraryElement) {
+  if (element is LibraryElement2) {
     return const [lsp.CompletionItemKind.Module];
   }
-  if (element is LocalVariableElement) {
+  if (element is LocalVariableElement2) {
     return const [lsp.CompletionItemKind.Variable];
   }
-  if (element is MethodElement) {
+  if (element is MethodElement2) {
     return const [lsp.CompletionItemKind.Method];
   }
-  if (element is MixinElement) {
+  if (element is MixinElement2) {
     return const [lsp.CompletionItemKind.Class];
   }
-  if (element is ParameterElement) {
+  if (element is FormalParameterElement) {
     return const [lsp.CompletionItemKind.Variable];
   }
-  if (element is PrefixElement) {
+  if (element is PrefixElement2) {
     return const [lsp.CompletionItemKind.Variable];
   }
-  if (element is PropertyAccessorElement) {
+  if (element is PropertyAccessorElement2) {
     return const [lsp.CompletionItemKind.Property];
   }
-  if (element is TopLevelVariableElement) {
+  if (element is TopLevelVariableElement2) {
     return const [lsp.CompletionItemKind.Variable];
   }
-  if (element is TypeAliasElement) {
+  if (element is TypeAliasElement2) {
     return const [lsp.CompletionItemKind.Class];
   }
-  if (element is TypeParameterElement) {
+  if (element is TypeParameterElement2) {
     return const [
       lsp.CompletionItemKind.TypeParameter,
       lsp.CompletionItemKind.Variable,
@@ -623,13 +623,11 @@
 
 /// If the [element] has a documentation comment, return it.
 _ElementDocumentation? _getDocsFromComputer(
-  Element element,
+  Element2 element,
   DartCompletionRequest request,
 ) {
-  var element2 = element.asElement2;
-  if (element2 == null) return null;
   var doc = request.documentationComputer.compute(
-    element2,
+    element,
     includeSummary: true,
   );
   if (doc is DocumentationWithSummary) {
@@ -647,7 +645,7 @@
   DartCompletionRequest request,
   DocumentationPreference includeDocumentation,
 ) {
-  var docs = _getDocsFromComputer(element.asElement!, request);
+  var docs = _getDocsFromComputer(element, request);
 
   var doc = removeDartDocDelimiters(docs?.full);
   var rawDoc =