[Completion] Move the legacy completion handler to using SuggestionCollector.

As discussed, test results have changed to

- include all suggestions containing the prefix instead of starting with the prefix
- suggestion kind is now 'prefix' instead of 'library'


Change-Id: Ica5fe62eaf8d4d0741af112810977f122457759f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439345
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Keerti Parthasarathy <keertip@google.com>
diff --git a/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestions2.dart b/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestions2.dart
index d8ab4f2..e237c6b 100644
--- a/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestions2.dart
+++ b/pkg/analysis_server/lib/src/handler/legacy/completion_get_suggestions2.dart
@@ -4,15 +4,15 @@
 
 import 'dart:async';
 
-import 'package:analysis_server/protocol/protocol.dart';
-import 'package:analysis_server/protocol/protocol_generated.dart';
+import 'package:analysis_server/src/handler/legacy/completion_utils.dart';
 import 'package:analysis_server/src/handler/legacy/legacy_handler.dart';
 import 'package:analysis_server/src/legacy_analysis_server.dart';
+import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/provisional/completion/completion_core.dart';
 import 'package:analysis_server/src/request_handler_mixin.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
+import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.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/suggestion_builder.dart';
 import 'package:analysis_server/src/services/completion/yaml/analysis_options_generator.dart';
 import 'package:analysis_server/src/services/completion/yaml/fix_data_generator.dart';
@@ -39,6 +39,36 @@
   /// automatically called when a client listens to the stream returned by
   /// 'results'. Subclasses should override this method, append at least one
   /// result to the controller, and close the controller stream once complete.
+  Future<List<CandidateSuggestion>> computeFinalSuggestions({
+    required CompletionBudget budget,
+    required OperationPerformanceImpl performance,
+    required DartCompletionRequest request,
+    required int maxSuggestions,
+    NotImportedSuggestions? notImportedSuggestions,
+    required bool useFilter,
+    required DartCompletionManager manager,
+  }) async {
+    //
+    // Compute completions generated by server.
+    //
+    return await performance.runAsync('computeSuggestions', (
+      performance,
+    ) async {
+      var collector = await manager.computeFinalizedCandidateSuggestions(
+        request: request,
+        performance: performance,
+        maxSuggestions: maxSuggestions,
+      );
+      return collector.suggestions;
+    });
+  }
+
+  /// Computes completion results for [request] and append them to the stream.
+  ///
+  /// Clients should not call this method directly as it is
+  /// automatically called when a client listens to the stream returned by
+  /// 'results'. Subclasses should override this method, append at least one
+  /// result to the controller, and close the controller stream once complete.
   Future<List<CompletionSuggestionBuilder>> computeSuggestions({
     required CompletionBudget budget,
     required OperationPerformanceImpl performance,
@@ -193,9 +223,15 @@
       setNewRequest(completionRequest);
 
       var notImportedSuggestions = NotImportedSuggestions();
-      var suggestionBuilders = <CompletionSuggestionBuilder>[];
+      var candidateSuggestions = <CandidateSuggestion>[];
+      var suggestions = <CompletionSuggestion>[];
+      var manager = DartCompletionManager(
+        budget: budget,
+        notImportedSuggestions: notImportedSuggestions,
+      );
       try {
-        suggestionBuilders = await computeSuggestions(
+        candidateSuggestions = await computeFinalSuggestions(
+          manager: manager,
           budget: budget,
           performance: performance,
           request: completionRequest,
@@ -213,27 +249,26 @@
           ).toResponse(request.id, clientUriConverter: server.uriConverter),
         );
       }
+      // Keep track of whether the set of results was truncated (because
+      // budget was exhausted).
+      bool isIncomplete =
+          (manager.notImportedSuggestions?.isIncomplete ?? false) ||
+          manager.isTruncated;
 
-      performance.run('filter', (performance) {
-        performance.getDataInt('count').add(suggestionBuilders.length);
-        suggestionBuilders = fuzzyFilterSort(
-          pattern: completionRequest.targetPrefix,
-          suggestions: suggestionBuilders,
-        );
-        performance.getDataInt('matchCount').add(suggestionBuilders.length);
-      });
-
-      var lengthRestricted =
-          suggestionBuilders.take(params.maxResults).toList();
-      completionPerformance.computedSuggestionCount = suggestionBuilders.length;
       completionPerformance.transmittedSuggestionCount =
-          lengthRestricted.length;
+          candidateSuggestions.length;
 
-      var suggestions = lengthRestricted.map((e) => e.build()).toList();
-
-      var isIncomplete =
-          notImportedSuggestions.isIncomplete ||
-          lengthRestricted.length < suggestionBuilders.length;
+      await performance.run('mapSuggestions', (performance) async {
+        for (var candidate in candidateSuggestions) {
+          var item = await candidateToCompletionSuggestion(
+            candidate,
+            completionRequest,
+          );
+          if (item != null) {
+            suggestions.add(item);
+          }
+        }
+      });
 
       performance.run('sendResponse', (_) {
         sendResult(
diff --git a/pkg/analysis_server/lib/src/handler/legacy/completion_utils.dart b/pkg/analysis_server/lib/src/handler/legacy/completion_utils.dart
new file mode 100644
index 0000000..913b5ef
--- /dev/null
+++ b/pkg/analysis_server/lib/src/handler/legacy/completion_utils.dart
@@ -0,0 +1,774 @@
+// Copyright (c) 2025, 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/lsp/completion_utils.dart'
+    show createTypedSuggestionData;
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart/dart_completion_suggestion.dart';
+import 'package:analysis_server/src/services/completion/dart/utilities.dart';
+import 'package:analysis_server/src/utilities/extensions/ast.dart';
+import 'package:analysis_server/src/utilities/extensions/element.dart';
+import 'package:analyzer/dart/element/element.dart' as e;
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+import 'package:analyzer_plugin/utilities/completion/relevance.dart';
+
+/// Converts a [CandidateSuggestion] into a [CompletionSuggestion] object.
+Future<CompletionSuggestion?> candidateToCompletionSuggestion(
+  CandidateSuggestion candidate,
+  DartCompletionRequest request,
+) async {
+  bool? isNotImportedLibrary;
+  var requiredImports = <Uri>[];
+  String? libraryUriStr;
+
+  if (candidate is ImportableSuggestion) {
+    var importData = candidate.importData;
+    if (importData != null) {
+      var uri = importData.libraryUri;
+      if (importData.isNotImported) {
+        isNotImportedLibrary = true;
+        requiredImports = [uri];
+      }
+      libraryUriStr = uri.toString();
+    }
+  }
+
+  switch (candidate) {
+    case TypedSuggestion():
+      var data = await createTypedSuggestionData(candidate, request);
+      requiredImports = data?.imports.toList() ?? requiredImports;
+      var kind =
+          request.target.isFunctionalArgument()
+              ? CompletionSuggestionKind.IDENTIFIER
+              : null;
+      candidate.data = data;
+
+      return switch (candidate) {
+        FieldSuggestion() => _getDartCompletionSuggestion(
+          candidate.element,
+          candidate.completion,
+          candidate.relevanceScore,
+          CompletionSuggestionKind.IDENTIFIER,
+          request,
+          isNotImportedLibrary,
+          libraryUriStr,
+          requiredImports,
+          displayString: data?.displayText,
+        ),
+
+        GetterSuggestion() => _getDartCompletionSuggestion(
+          candidate.element,
+          candidate.completion,
+          candidate.relevanceScore,
+          CompletionSuggestionKind.IDENTIFIER,
+          request,
+          isNotImportedLibrary,
+          libraryUriStr,
+          requiredImports,
+          displayString: data?.displayText,
+        ),
+
+        SetStateMethodSuggestion() => DartCompletionSuggestion(
+          candidate.kind,
+          candidate.relevanceScore,
+          candidate.completion,
+          candidate.selectionOffset,
+          0,
+          false,
+          false,
+          displayText: data?.displayText ?? candidate.displayText,
+        ),
+
+        MethodSuggestion(kind: var suggestionKind) =>
+        // TODO(brianwilkerson): Correctly set the kind of suggestion in cases
+        //  where `isFunctionalArgument` would return `true` so we can stop
+        //  using the `request.target`.
+        _getDartCompletionSuggestion(
+          candidate.element,
+          candidate.completion,
+          candidate.relevanceScore,
+          kind ?? suggestionKind,
+          request,
+          isNotImportedLibrary,
+          libraryUriStr,
+          requiredImports,
+          displayString: data?.displayText,
+        ),
+        RecordFieldSuggestion() => DartCompletionSuggestion(
+          CompletionSuggestionKind.IDENTIFIER,
+          candidate.relevanceScore,
+          candidate.completion,
+          candidate.completion.length,
+          0,
+          false,
+          false,
+          returnType: candidate.field.type.getDisplayString(),
+          displayText: data?.displayText ?? candidate.name,
+        ),
+
+        // This is a workaround because mixins can't be `sealed`.
+        TypedSuggestionCompletionMixin() => null,
+      };
+
+    case ClassSuggestion():
+      return _getInterfaceSuggestion(
+        candidate,
+        candidate.element,
+        request,
+        libraryUriStr,
+        isNotImportedLibrary,
+        requiredImports,
+      );
+    case ClosureSuggestion():
+      return DartCompletionSuggestion(
+        CompletionSuggestionKind.INVOCATION,
+        candidate.relevanceScore,
+        candidate.completion,
+        candidate.selectionOffset,
+        0,
+        false,
+        false,
+        displayText: candidate.displayText,
+      );
+    case ConstructorSuggestion():
+      var completion = candidate.completion;
+      if (completion.isEmpty) {
+        return null;
+      }
+      return _getConstructorSuggestion(
+        candidate,
+        request,
+        libraryUriStr,
+        isNotImportedLibrary,
+        requiredImports,
+      );
+    case EnumConstantSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case EnumSuggestion():
+      return _getInterfaceSuggestion(
+        candidate,
+        candidate.element,
+        request,
+        libraryUriStr,
+        isNotImportedLibrary,
+        requiredImports,
+      );
+    case ExtensionSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        candidate.kind,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case ExtensionTypeSuggestion():
+      return _getInterfaceSuggestion(
+        candidate,
+        candidate.element,
+        request,
+        libraryUriStr,
+        isNotImportedLibrary,
+        requiredImports,
+      );
+    case FormalParameterSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case FunctionCall():
+      return CompletionSuggestion(
+        CompletionSuggestionKind.INVOCATION,
+        candidate.relevanceScore,
+        e.MethodElement.CALL_METHOD_NAME,
+        e.MethodElement.CALL_METHOD_NAME.length,
+        0,
+        false,
+        false,
+        displayText: candidate.completion,
+        element: _getElementForFunctionCall(),
+        returnType: 'void',
+        parameterNames: [],
+        parameterTypes: [],
+        requiredParameterCount: 0,
+        hasNamedParameters: false,
+      );
+    case IdentifierSuggestion():
+      return CompletionSuggestion(
+        CompletionSuggestionKind.IDENTIFIER,
+        candidate.relevanceScore,
+        candidate.completion,
+        candidate.selectionOffset,
+        0,
+        false,
+        false,
+      );
+    case ImportPrefixSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+
+    case KeywordSuggestion():
+      return CompletionSuggestion(
+        CompletionSuggestionKind.KEYWORD,
+        candidate.relevanceScore,
+        candidate.completion,
+        candidate.selectionOffset,
+        0,
+        false,
+        false,
+      );
+    case LabelSuggestion():
+      var completion = candidate.label.label.name;
+      var suggestion = CompletionSuggestion(
+        CompletionSuggestionKind.IDENTIFIER,
+        candidate.relevanceScore,
+        completion,
+        completion.length,
+        0,
+        false,
+        false,
+      );
+      suggestion.element = createLocalElement(
+        request.source,
+        ElementKind.LABEL,
+        candidate.label.label,
+      );
+      return suggestion;
+    case LoadLibraryFunctionSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        candidate.kind,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+
+    case LocalFunctionSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        candidate.kind,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+
+    case LocalVariableSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case MixinSuggestion():
+      return _getInterfaceSuggestion(
+        candidate,
+        candidate.element,
+        request,
+        libraryUriStr,
+        isNotImportedLibrary,
+        requiredImports,
+      );
+    case NamedArgumentSuggestion():
+      return _getNamedArgumentSuggestion(candidate, request);
+    case NameSuggestion():
+      var name = candidate.completion;
+      return CompletionSuggestion(
+        CompletionSuggestionKind.IDENTIFIER,
+        candidate.relevanceScore,
+        name,
+        name.length,
+        0,
+        false,
+        false,
+      );
+    case OverrideSuggestion():
+      return await _getOverrideSuggestion(candidate, request);
+    case RecordLiteralNamedFieldSuggestion():
+      var field = candidate.field;
+      return CompletionSuggestion(
+        CompletionSuggestionKind.NAMED_ARGUMENT,
+        Relevance.requiredNamedArgument,
+        candidate.completion,
+        candidate.selectionOffset,
+        0,
+        false,
+        false,
+        parameterName: field.name,
+        parameterType: field.type.getDisplayString(),
+      );
+    case SetterSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case StaticFieldSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case SuperParameterSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case TopLevelFunctionSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        candidate.kind,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case TopLevelGetterSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case TopLevelSetterSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case TopLevelVariableSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case TypeAliasSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case TypeParameterSuggestion():
+      return _getDartCompletionSuggestion(
+        candidate.element,
+        candidate.completion,
+        candidate.relevanceScore,
+        CompletionSuggestionKind.IDENTIFIER,
+        request,
+        isNotImportedLibrary,
+        libraryUriStr,
+        requiredImports,
+      );
+    case UriSuggestion():
+      var uri = candidate.uriStr;
+      return CompletionSuggestion(
+        CompletionSuggestionKind.IMPORT,
+        candidate.relevanceScore,
+        uri,
+        uri.length,
+        0,
+        false,
+        false,
+      );
+  }
+}
+
+_ParameterData _createParameterData(e.Element element) {
+  List<String>? parameterNames;
+  List<String>? parameterTypes;
+  int? requiredParameterCount;
+  bool? hasNamedParameters;
+  CompletionDefaultArgumentList? defaultArgumentList;
+  if (element is e.ExecutableElement && element is! e.PropertyAccessorElement) {
+    parameterNames =
+        element.formalParameters.map((parameter) {
+          return parameter.displayName;
+        }).toList();
+    parameterTypes =
+        element.formalParameters.map((e.FormalParameterElement parameter) {
+          return parameter.type.getDisplayString();
+        }).toList();
+
+    var requiredParameters = element.formalParameters.where(
+      (e.FormalParameterElement param) => param.isRequiredPositional,
+    );
+    requiredParameterCount = requiredParameters.length;
+
+    var namedParameters = element.formalParameters.where(
+      (e.FormalParameterElement param) => param.isNamed,
+    );
+    hasNamedParameters = namedParameters.isNotEmpty;
+
+    defaultArgumentList = computeCompletionDefaultArgumentList(
+      element,
+      requiredParameters,
+      namedParameters,
+    );
+  }
+  return _ParameterData(
+    parameterNames,
+    parameterTypes,
+    requiredParameterCount,
+    hasNamedParameters,
+    defaultArgumentList,
+  );
+}
+
+CompletionSuggestion? _getConstructorSuggestion(
+  ConstructorSuggestion candidate,
+  DartCompletionRequest request,
+  String? libraryUriStr,
+  bool? isNotImported,
+  List<Uri> requiredImports,
+) {
+  var hasClassName = candidate.hasClassName;
+  var prefix = candidate.prefix;
+  var completion = candidate.completion;
+  // If the class name is already in the text, then we don't support
+  // prepending a prefix.
+  assert(!hasClassName || prefix == null);
+  if (prefix != null) {
+    completion = '$prefix.$completion';
+  }
+
+  var constructor = candidate.element;
+
+  var suggestedElement = convertElement(constructor);
+  var parameterData = _createParameterData(constructor);
+
+  var suggestion = DartCompletionSuggestion(
+    candidate.kind,
+    candidate.relevanceScore,
+    completion,
+    completion.length /*selectionOffset*/,
+    0 /*selectionLength*/,
+    constructor.hasOrInheritsDeprecated,
+    false /*isPotential*/,
+    element: suggestedElement,
+    declaringType: _getDeclaringType(constructor),
+    returnType: getReturnTypeString(constructor),
+    requiredParameterCount: parameterData.requiredParameterCount,
+    hasNamedParameters: parameterData.hasNamedParameters,
+    parameterNames: parameterData.parameterNames,
+    parameterTypes: parameterData.parameterTypes,
+    defaultArgumentListString: parameterData.defaultArgumentList?.text,
+    defaultArgumentListTextRanges: parameterData.defaultArgumentList?.ranges,
+    libraryUri: libraryUriStr,
+    isNotImported: isNotImported,
+    requiredImports: requiredImports,
+    colorHex: getColorHexString(constructor),
+  );
+  _setDocumentation(suggestion, constructor, request);
+  return suggestion;
+}
+
+DartCompletionSuggestion _getDartCompletionSuggestion(
+  e.Element element,
+  String completion,
+  int relevance,
+  CompletionSuggestionKind kind,
+  DartCompletionRequest request,
+  bool? isNotImported,
+  String? libraryUriStr,
+  List<Uri> requiredImports, {
+  String? displayString,
+}) {
+  var suggestedElement = convertElement(element);
+  _ParameterData? parameterData;
+  if (element is e.ExecutableElement && element is! e.PropertyAccessorElement) {
+    parameterData = _createParameterData(element);
+  }
+
+  var suggestion = DartCompletionSuggestion(
+    kind,
+    relevance,
+    completion,
+    completion.length /*selectionOffset*/,
+    0 /*selectionLength*/,
+    element.hasOrInheritsDeprecated,
+    false /*isPotential*/,
+    element: suggestedElement,
+    declaringType: _getDeclaringType(element),
+    returnType: getReturnTypeString(element),
+    requiredParameterCount: parameterData?.requiredParameterCount,
+    hasNamedParameters: parameterData?.hasNamedParameters,
+    parameterNames: parameterData?.parameterNames,
+    parameterTypes: parameterData?.parameterTypes,
+    defaultArgumentListString: parameterData?.defaultArgumentList?.text,
+    defaultArgumentListTextRanges: parameterData?.defaultArgumentList?.ranges,
+    libraryUri: libraryUriStr,
+    isNotImported: isNotImported,
+    requiredImports: requiredImports,
+    colorHex: getColorHexString(element),
+    displayText: displayString,
+  );
+  _setDocumentation(suggestion, element, request);
+  return suggestion;
+}
+
+String? _getDeclaringType(e.Element element) {
+  String? declaringType;
+  if (element is! e.FormalParameterElement) {
+    var enclosingElement = element.enclosingElement;
+
+    if (enclosingElement is e.InterfaceElement) {
+      declaringType = enclosingElement.displayName;
+    }
+  }
+  return declaringType;
+}
+
+Element _getElementForFunctionCall() {
+  return Element(
+    ElementKind.METHOD,
+    e.MethodElement.CALL_METHOD_NAME,
+    Element.makeFlags(),
+    parameters: '()',
+    returnType: 'void',
+  );
+}
+
+CompletionSuggestion _getInterfaceSuggestion(
+  CandidateSuggestion candidate,
+  e.Element interfaceElement,
+  DartCompletionRequest request,
+  String? libraryUriStr,
+  bool? isNotImported,
+  List<Uri> requiredImports,
+) {
+  var suggestedElement = convertElement(interfaceElement);
+  var completion = candidate.completion;
+  var suggestion = DartCompletionSuggestion(
+    CompletionSuggestionKind.IDENTIFIER,
+    candidate.relevanceScore,
+    completion,
+    completion.length /*selectionOffset*/,
+    0 /*selectionLength*/,
+    interfaceElement.hasOrInheritsDeprecated,
+    false /*isPotential*/,
+    element: suggestedElement,
+    declaringType: _getDeclaringType(interfaceElement),
+    returnType: getReturnTypeString(interfaceElement),
+    libraryUri: libraryUriStr,
+    isNotImported: isNotImported,
+    requiredImports: requiredImports,
+    colorHex: getColorHexString(interfaceElement),
+  );
+
+  _setDocumentation(suggestion, interfaceElement, request);
+  return suggestion;
+}
+
+CompletionSuggestion _getNamedArgumentSuggestion(
+  NamedArgumentSuggestion candidate,
+  DartCompletionRequest request,
+) {
+  var parameter = candidate.parameter;
+  var name = parameter.name;
+  var type = parameter.type.getDisplayString();
+
+  var suggestion = DartCompletionSuggestion(
+    CompletionSuggestionKind.NAMED_ARGUMENT,
+    candidate.relevanceScore,
+    candidate.completion,
+    candidate.selectionOffset,
+    0,
+    false,
+    false,
+    parameterName: name,
+    parameterType: type,
+    replacementLength: candidate.replacementLength,
+    element: convertElement(parameter),
+  );
+
+  _setDocumentation(suggestion, parameter, request);
+  return suggestion;
+}
+
+/// Add a suggestion to replace the `targetId` with an override of the given
+/// [element]. If [invokeSuper] is `true`, then the override will contain an
+/// invocation of an overridden member.
+Future<CompletionSuggestion?> _getOverrideSuggestion(
+  OverrideSuggestion candidate,
+  DartCompletionRequest request,
+) async {
+  var displayTextBuffer = StringBuffer();
+  var overrideImports = <Uri>{};
+  var builder = ChangeBuilder(session: request.analysisSession);
+  var replacementRange = candidate.replacementRange;
+  var element = candidate.element;
+
+  await builder.addDartFileEdit(request.path, createEditsForImports: false, (
+    builder,
+  ) {
+    builder.addReplacement(replacementRange, (builder) {
+      builder.writeOverride(
+        element,
+        displayTextBuffer: displayTextBuffer,
+        invokeSuper: candidate.shouldInvokeSuper,
+      );
+    });
+    overrideImports.addAll(builder.requiredImports);
+  });
+
+  var fileEdits = builder.sourceChange.edits;
+  if (fileEdits.length != 1) {
+    return null;
+  }
+
+  var sourceEdits = fileEdits[0].edits;
+  if (sourceEdits.length != 1) {
+    return null;
+  }
+
+  var replacement = sourceEdits[0].replacement;
+  var completion = replacement.trim();
+  var overrideAnnotation = '@override';
+  if (request.target.containingNode.hasOverride &&
+      completion.startsWith(overrideAnnotation)) {
+    completion = completion.substring(overrideAnnotation.length).trim();
+  }
+  if (candidate.skipAt && completion.startsWith(overrideAnnotation)) {
+    completion = completion.substring('@'.length);
+  }
+  if (completion.isEmpty) {
+    return null;
+  }
+
+  var selectionRange = builder.selectionRange;
+  if (selectionRange == null) {
+    return null;
+  }
+  var offsetDelta = replacementRange.offset + replacement.indexOf(completion);
+
+  var displayText = displayTextBuffer.toString();
+  if (displayText.isEmpty) {
+    return null;
+  }
+
+  if (candidate.skipAt) {
+    displayText = 'override $displayText';
+  }
+
+  var suggestion = DartCompletionSuggestion(
+    CompletionSuggestionKind.OVERRIDE,
+    candidate.relevanceScore,
+    completion,
+    selectionRange.offset - offsetDelta,
+    selectionRange.length,
+    element.metadata.hasDeprecated,
+    false,
+    displayText: displayText,
+    requiredImports: overrideImports.toList(),
+  );
+  suggestion.element = convertElement(element);
+  return suggestion;
+}
+
+/// If the [element] has a documentation comment, fill the [suggestion]'s
+/// documentation fields.
+void _setDocumentation(
+  CompletionSuggestion suggestion,
+  e.Element element,
+  DartCompletionRequest request,
+) {
+  var doc = request.documentationComputer.compute(
+    element,
+    includeSummary: true,
+  );
+  if (doc is DocumentationWithSummary) {
+    suggestion.docComplete = doc.full;
+    suggestion.docSummary = doc.summary;
+  }
+}
+
+class _ParameterData {
+  List<String>? parameterNames;
+  List<String>? parameterTypes;
+  int? requiredParameterCount;
+  bool? hasNamedParameters;
+  CompletionDefaultArgumentList? defaultArgumentList;
+
+  _ParameterData(
+    this.parameterNames,
+    this.parameterTypes,
+    this.requiredParameterCount,
+    this.hasNamedParameters,
+    this.defaultArgumentList,
+  );
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/visibility_tracker.dart b/pkg/analysis_server/lib/src/services/completion/dart/visibility_tracker.dart
index eca3029..7d543b1 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/visibility_tracker.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/visibility_tracker.dart
@@ -2,6 +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 'dart:collection';
+
 import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart';
 import 'package:analyzer/dart/element/element.dart';
 
@@ -11,6 +13,7 @@
 class VisibilityTracker {
   /// The set of known previously declared names.
   final Set<String> _declaredNames = {};
+  final _notImportedNames = HashMap<String, List<String>>();
 
   /// Whether the name of the [element] is visible at the completion location.
   ///
@@ -31,8 +34,22 @@
     var prefix = importData?.prefix;
     var qualifiedName = prefix != null ? '$prefix.$name' : name;
 
+    // Track names from non imported libraries so as to allow multiple
+    // suggestions with same name from differnet libraries.
     if (isNotImported) {
-      return !_declaredNames.contains(qualifiedName);
+      if (_declaredNames.contains(qualifiedName)) {
+        return false;
+      }
+      var libraryUri = importData!.libraryUri.toString();
+      var notImportedList = _notImportedNames.putIfAbsent(
+        name,
+        () => <String>[],
+      );
+      if (notImportedList.isEmpty || !notImportedList.contains(libraryUri)) {
+        notImportedList.add(libraryUri);
+        return true;
+      }
+      return false;
     }
     return _declaredNames.add(qualifiedName);
   }
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index cbcefe7..7c2e8f0 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -2025,16 +2025,16 @@
 replacement
   left: 4
 suggestions
-  foo02
-    kind: topLevelVariable
-    isNotImported: null
-    libraryUri: null
-    relevance: 558
   foo01
     kind: topLevelVariable
     isNotImported: null
     libraryUri: null
     relevance: 510
+  foo02
+    kind: topLevelVariable
+    isNotImported: null
+    libraryUri: null
+    relevance: 558
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_printer.dart b/pkg/analysis_server/test/services/completion/dart/completion_printer.dart
index 0b2f673..38ae6bc 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_printer.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_printer.dart
@@ -117,6 +117,8 @@
         return 'mixin';
       } else if (elementKind == ElementKind.PARAMETER) {
         return 'parameter';
+      } else if (elementKind == ElementKind.PREFIX) {
+        return 'prefix';
       } else if (elementKind == ElementKind.SETTER) {
         return 'setter';
       } else if (elementKind == ElementKind.TOP_LEVEL_VARIABLE) {
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_test.dart
index 837974e..35ec023 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_test.dart
@@ -3409,6 +3409,12 @@
     kind: localVariable
   switch
     kind: keyword
+  assert
+    kind: keyword
+  const
+    kind: keyword
+  false
+    kind: keyword
 ''');
   }
 
@@ -4091,6 +4097,8 @@
     kind: localVariable
   null
     kind: keyword
+  const
+    kind: keyword
 ''');
   }
 
@@ -4390,12 +4398,22 @@
 replacement
   left: 1
 suggestions
+  final
+    kind: keyword
   Arrays
     kind: class
+  var
+    kind: keyword
   Arrays
     kind: constructorInvocation
   assert
     kind: keyword
+  dynamic
+    kind: keyword
+  false
+    kind: keyword
+  late
+    kind: keyword
 ''');
   }
 
@@ -4521,6 +4539,7 @@
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'dynamic'.
   Future<void> test_commentSnippets011_1() async {
     allowedIdentifiers = {'Map'};
     await computeSuggestions('''
@@ -4532,9 +4551,12 @@
 suggestions
   Map
     kind: class
+  dynamic
+    kind: keyword
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'dynamic'.
   Future<void> test_commentSnippets012_1() async {
     allowedIdentifiers = {'Map'};
     await computeSuggestions('''
@@ -4547,6 +4569,8 @@
 suggestions
   Map
     kind: class
+  dynamic
+    kind: keyword
 ''');
   }
 
@@ -4702,6 +4726,8 @@
 replacement
   left: 1
 suggestions
+  if
+    kind: keyword
   final
     kind: keyword
   f
@@ -5140,6 +5166,7 @@
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'covariant'.
   Future<void> test_commentSnippets030_1() async {
     allowedIdentifiers = {'T'};
     await computeSuggestions('''
@@ -5149,8 +5176,24 @@
 replacement
   left: 1
 suggestions
+  static
+    kind: keyword
+  const
+    kind: keyword
+  set
+    kind: keyword
+  factory
+    kind: keyword
   T
     kind: typeParameter
+  covariant
+    kind: keyword
+  get
+    kind: keyword
+  late
+    kind: keyword
+  operator
+    kind: keyword
 ''');
   }
 
@@ -5165,6 +5208,8 @@
 suggestions
   T
     kind: typeParameter
+  covariant
+    kind: keyword
 ''');
   }
 
@@ -5179,6 +5224,8 @@
 suggestions
   T
     kind: typeParameter
+  covariant
+    kind: keyword
 ''');
   }
 
@@ -5573,7 +5620,7 @@
   left: 2
 suggestions
   json
-    kind: library
+    kind: prefix
   json.JsonCodec
     kind: constructorInvocation
   json.JsonDecoder
@@ -5595,13 +5642,13 @@
   right: 1
 suggestions
   json
-    kind: library
+    kind: prefix
   json.JsonCodec
     kind: constructorInvocation
   json.JsonDecoder
     kind: constructorInvocation
   jxx
-    kind: library
+    kind: prefix
   jxx.JsonCodec
     kind: constructorInvocation
   jxx.JsonDecoder
@@ -5622,13 +5669,13 @@
   right: 2
 suggestions
   json
-    kind: library
+    kind: prefix
   json.JsonCodec
     kind: constructorInvocation
   json.JsonDecoder
     kind: constructorInvocation
   jxx
-    kind: library
+    kind: prefix
   jxx.JsonCodec
     kind: constructorInvocation
   jxx.JsonDecoder
@@ -5649,7 +5696,7 @@
   left: 2
 suggestions
   json
-    kind: library
+    kind: prefix
   json.JsonCodec
     kind: constructorInvocation
   json.JsonDecoder
@@ -5676,7 +5723,6 @@
   const xdr.a(1, 2, 3);
 }
 ''');
-    // TODO(brianwilkerson): We ought to be suggesting 'xdr.a' and 'xdr.b'.
     assertResponse(r'''
 replacement
   left: 1
@@ -5686,6 +5732,10 @@
     kind: constructorInvocation
   xdr
     kind: constructorInvocation
+  xdr.a
+    kind: constructorInvocation
+  xdr.b
+    kind: constructorInvocation
 ''');
   }
 
@@ -5704,7 +5754,6 @@
   const x^dr.a(1, 2, 3);
 }
 ''');
-    // TODO(brianwilkerson): We ought to be suggesting 'xdr.a' and 'xdr.b'.
     assertResponse(r'''
 replacement
   left: 1
@@ -5714,6 +5763,10 @@
     kind: constructorInvocation
   xdr
     kind: constructorInvocation
+  xdr.a
+    kind: constructorInvocation
+  xdr.b
+    kind: constructorInvocation
 ''');
   }
 
@@ -6879,6 +6932,8 @@
 suggestions
   File
     kind: constructorInvocation
+  File.fromPath
+    kind: constructorInvocation
   FileMode
     kind: constructorInvocation
   FileMode._internal
@@ -7631,13 +7686,14 @@
 void f() {
 }
 ''');
-    // TODO(brianwilkerson): We should be suggesting the named constructor here.
     assertResponse(r'''
 replacement
   left: 3
 suggestions
   AAA
     kind: constructorInvocation
+  AAA.nnn
+    kind: constructorInvocation
 ''');
   }
 
@@ -7861,6 +7917,8 @@
 replacement
   left: 1
 suggestions
+  cos
+    kind: function
   sin
     kind: function
   sqrt
@@ -8533,6 +8591,10 @@
 suggestions
   i
     kind: localVariable
+  switch
+    kind: keyword
+  this
+    kind: keyword
 ''');
   }
 
@@ -8547,6 +8609,10 @@
 suggestions
   i
     kind: localVariable
+  this
+    kind: keyword
+  switch
+    kind: keyword
 ''');
   }
 
@@ -8744,6 +8810,10 @@
     kind: topLevelVariable
   this
     kind: keyword
+  const
+    kind: keyword
+  switch
+    kind: keyword
 ''');
   }
 
@@ -8762,6 +8832,10 @@
     kind: topLevelVariable
   this
     kind: keyword
+  const
+    kind: keyword
+  switch
+    kind: keyword
 ''');
   }
 
@@ -9034,6 +9108,8 @@
     selection: 68 24
   String
     kind: class
+  abstract
+    kind: keyword
 ''');
   }
 
@@ -9736,8 +9812,14 @@
 replacement
   left: 1
 suggestions
+  Collection
+    kind: class
   List
     kind: class
+  final
+    kind: keyword
+  external
+    kind: keyword
   late
     kind: keyword
 ''');
@@ -9752,12 +9834,32 @@
 replacement
   left: 1
 suggestions
+  @override
+  // TODO: implement hashCode
+  int get hashCode => super.hashCode;
+    kind: override
+    selection: 62 14
+  @override
+  noSuchMethod(Invocation invocation) {
+    // TODO: implement noSuchMethod
+    return super.noSuchMethod(invocation);
+  }
+    kind: override
+    selection: 90 38
   Collection
     kind: class
+  static
+    kind: keyword
   const
     kind: keyword
+  factory
+    kind: keyword
+  abstract
+    kind: keyword
   covariant
     kind: keyword
+  dynamic
+    kind: keyword
 ''');
   }
 
@@ -10080,6 +10182,8 @@
 suggestions
   num
     kind: class
+  dynamic
+    kind: keyword
 ''');
   }
 
@@ -10166,8 +10270,16 @@
 replacement
   left: 1
 suggestions
+  final
+    kind: keyword
   num
     kind: class
+  const
+    kind: keyword
+  dynamic
+    kind: keyword
+  external
+    kind: keyword
 ''');
   }
 
@@ -10747,8 +10859,12 @@
 replacement
   left: 1
 suggestions
+  false
+    kind: keyword
   l1t
     kind: topLevelVariable
+  null
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/constructor_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/constructor_test.dart
index c3816a6..f8053dc 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/constructor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/constructor_test.dart
@@ -115,6 +115,34 @@
 ''');
   }
 
+  Future<void> test_noPrefix() async {
+    newFile('$testPackageLibPath/a.dart', '''
+class A0 {
+  A0.f0();
+  A0.b0();
+  factory A0(String s){
+    return A0.f0();
+  }
+}
+''');
+    await computeSuggestions('''
+import 'a.dart';
+
+void f() {
+  new ^;
+}
+''');
+    assertResponse(r'''
+suggestions
+  A0
+    kind: constructorInvocation
+  A0.b0
+    kind: constructorInvocation
+  A0.f0
+    kind: constructorInvocation
+''');
+  }
+
   Future<void> test_sealed_library() async {
     newFile('$testPackageLibPath/a.dart', '''
 sealed class S0 {}
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
index 504155e..1924110 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/enum_test.dart
@@ -399,7 +399,7 @@
   left: 2
 suggestions
   p0
-    kind: library
+    kind: prefix
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/imported_reference_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/imported_reference_test.dart
index 5817856..51cc834 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/imported_reference_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/imported_reference_test.dart
@@ -544,6 +544,8 @@
 suggestions
   int
     kind: class
+  int.fromEnvironment
+    kind: constructorInvocation
 ''');
   }
 
@@ -785,7 +787,7 @@
   Z0
     kind: constructorInvocation
   g0
-    kind: library
+    kind: prefix
   g0.G0
     kind: constructorInvocation
   D1
@@ -880,7 +882,7 @@
   g0.G
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1000,7 +1002,7 @@
   Z0
     kind: class
   g0
-    kind: library
+    kind: prefix
   G0
     kind: class
 ''');
@@ -1094,7 +1096,7 @@
   g0.G
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1715,7 +1717,7 @@
     kind: class
     deprecated: true
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1774,7 +1776,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1800,7 +1802,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1822,7 +1824,7 @@
   left: 1
 suggestions
   S2
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1848,7 +1850,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1874,7 +1876,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -3686,7 +3688,7 @@
   B0
     kind: constructorInvocation
   m0
-    kind: library
+    kind: prefix
   m0.Point
     kind: constructorInvocation
   m0.Random
@@ -4225,6 +4227,12 @@
 suggestions
   S0
     kind: localVariable
+  String.fromCharCode
+    kind: constructorInvocation
+  String.fromCharCodes
+    kind: constructorInvocation
+  String.fromEnvironment
+    kind: constructorInvocation
   String
     kind: class
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/library_member_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/library_member_test.dart
index 00c202d..cfc82c4 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/library_member_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/library_member_test.dart
@@ -450,6 +450,14 @@
 suggestions
   Future
     kind: constructorInvocation
+  Future.delayed
+    kind: constructorInvocation
+  Future.error
+    kind: constructorInvocation
+  Future.microtask
+    kind: constructorInvocation
+  Future.value
+    kind: constructorInvocation
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/library_prefix_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/library_prefix_test.dart
index ddd9fca..0c471f5 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/library_prefix_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/library_prefix_test.dart
@@ -109,7 +109,7 @@
   _T6
     kind: topLevelVariable
   g0
-    kind: library
+    kind: prefix
   g0.G
     kind: constructorInvocation
   D1
@@ -168,7 +168,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -190,7 +190,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -213,7 +213,7 @@
   left: 1
 suggestions
   S0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -235,7 +235,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -257,7 +257,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -278,7 +278,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -313,13 +313,13 @@
     assertResponse(r'''
 suggestions
   m0
-    kind: library
+    kind: prefix
   m0.Point
     kind: constructorInvocation
   m0.Random
     kind: constructorInvocation
   t0
-    kind: library
+    kind: prefix
   t0.A
     kind: constructorInvocation
   t0.B
@@ -371,13 +371,13 @@
     assertResponse(r'''
 suggestions
   m0
-    kind: library
+    kind: prefix
   m0.Point
     kind: constructorInvocation
   m0.Random
     kind: constructorInvocation
   t0
-    kind: library
+    kind: prefix
   t0.A
     kind: constructorInvocation
   t0.B
@@ -445,7 +445,7 @@
   left: 1
 suggestions
   j0
-    kind: library
+    kind: prefix
   j0.JsonCodec
     kind: constructorInvocation
   j0.JsonDecoder
@@ -519,7 +519,7 @@
     assertResponse(r'''
 suggestions
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -589,7 +589,7 @@
     assertResponse(r'''
 suggestions
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/local_reference_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/local_reference_test.dart
index fbd9681..11ebac9 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/local_reference_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/local_reference_test.dart
@@ -1017,7 +1017,7 @@
   Z0
     kind: constructorInvocation
   g0
-    kind: library
+    kind: prefix
   g0.G0
     kind: constructorInvocation
   D1
@@ -1115,7 +1115,7 @@
   g0.G0
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1230,7 +1230,7 @@
   g0.G0
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1321,7 +1321,7 @@
   g0.G0
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -2067,7 +2067,7 @@
     kind: class
     deprecated: true
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -2092,7 +2092,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -2118,7 +2118,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -2140,7 +2140,7 @@
   left: 1
 suggestions
   S2
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -2166,7 +2166,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -2192,7 +2192,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -2884,12 +2884,12 @@
 ''');
     assertResponse(r'''
 suggestions
+  E0
+    kind: enum
   E0.one
     kind: enumConstant
   E0.two
     kind: enumConstant
-  E0
-    kind: enum
   F0
     kind: enum
 ''');
@@ -3220,7 +3220,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -6095,7 +6095,7 @@
   M0
     kind: mixin
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -6861,6 +6861,8 @@
 replacement
   left: 1
 suggestions
+  _a0
+    kind: localVariable
   a0
     kind: localVariable
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/type_member_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/type_member_test.dart
index 49e22da..ae3c91b 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/type_member_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/type_member_test.dart
@@ -618,7 +618,7 @@
   Z0
     kind: constructorInvocation
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -692,7 +692,7 @@
   Z0
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -788,7 +788,7 @@
   Z0
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -862,7 +862,7 @@
   Z0
     kind: class
   g0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1375,7 +1375,7 @@
     kind: class
     deprecated: true
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1400,7 +1400,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1426,7 +1426,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1448,7 +1448,7 @@
   left: 1
 suggestions
   S2
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1474,7 +1474,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -1500,7 +1500,7 @@
   x0.B
     kind: class
   x0
-    kind: library
+    kind: prefix
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/uri_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/uri_test.dart
index c19779a..b2bbece 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/uri_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/uri_test.dart
@@ -454,6 +454,8 @@
     kind: import
   dart:typed_data
     kind: import
+  package:test/test.dart
+    kind: import
   dart:core
     kind: import
 ''');
@@ -493,6 +495,8 @@
     kind: import
   dart:typed_data
     kind: import
+  package:test/test.dart
+    kind: import
   dart:core
     kind: import
 ''');
@@ -647,6 +651,8 @@
     kind: import
   package:test/
     kind: import
+  package:test/test.dart
+    kind: import
 ''');
   }
 
@@ -664,6 +670,8 @@
     kind: import
   package:test/
     kind: import
+  package:test/test.dart
+    kind: import
 ''');
   }
 
@@ -692,14 +700,26 @@
 replacement
   left: 1
 suggestions
+  dart:js_interop
+    kind: import
+  dart:typed_data
+    kind: import
   package:
     kind: import
   package:bar/
     kind: import
+  package:bar/bar.dart
+    kind: import
   package:foo/
     kind: import
+  package:foo/baz/
+    kind: import
+  package:foo/foo.dart
+    kind: import
   package:test/
     kind: import
+  package:test/test.dart
+    kind: import
 ''');
   }
 
@@ -813,12 +833,18 @@
 replacement
   left: 1
 suggestions
+  dart:js_interop
+    kind: import
+  dart:typed_data
+    kind: import
   package:
     kind: import
   package:bar/
     kind: import
   package:test/
     kind: import
+  package:test/test.dart
+    kind: import
 ''');
   }
 
@@ -847,14 +873,26 @@
 replacement
   left: 1
 suggestions
+  dart:js_interop
+    kind: import
+  dart:typed_data
+    kind: import
   package:
     kind: import
   package:bar/
     kind: import
+  package:bar/bar.dart
+    kind: import
   package:foo/
     kind: import
+  package:foo/baz/
+    kind: import
+  package:foo/foo.dart
+    kind: import
   package:test/
     kind: import
+  package:test/test.dart
+    kind: import
 ''');
   }
 
@@ -1054,6 +1092,8 @@
     kind: import
   dart:typed_data
     kind: import
+  package:test/test.dart
+    kind: import
   dart:core
     kind: import
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/variable_name_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/variable_name_test.dart
index 4d715d9..82683de 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/variable_name_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/variable_name_test.dart
@@ -69,6 +69,14 @@
 suggestions
   abstractCrazyNonsenseClassName
     kind: identifier
+  className
+    kind: identifier
+  crazyNonsenseClassName
+    kind: identifier
+  name
+    kind: identifier
+  nonsenseClassName
+    kind: identifier
 ''');
   }
 
@@ -106,6 +114,14 @@
 suggestions
   abstractCrazyNonsenseClassName
     kind: identifier
+  className
+    kind: identifier
+  crazyNonsenseClassName
+    kind: identifier
+  name
+    kind: identifier
+  nonsenseClassName
+    kind: identifier
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/wildcard_variables_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/wildcard_variables_test.dart
index 4b69af2..f6122a4 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/wildcard_variables_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/wildcard_variables_test.dart
@@ -223,7 +223,7 @@
   __.ES
     kind: extensionInvocation
   __
-    kind: library
+    kind: prefix
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/argument_list_test.dart b/pkg/analysis_server/test/services/completion/dart/location/argument_list_test.dart
index b9e6716..5167e7c 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/argument_list_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/argument_list_test.dart
@@ -46,6 +46,8 @@
 replacement
   left: 1
 suggestions
+  const
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -229,6 +231,8 @@
 replacement
   left: 1
 suggestions
+  const
+    kind: keyword
   null
     kind: keyword
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/location/assignment_expression_test.dart b/pkg/analysis_server/test/services/completion/dart/location/assignment_expression_test.dart
index 96a1893..7309d4d 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/assignment_expression_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/assignment_expression_test.dart
@@ -46,6 +46,8 @@
 replacement
   left: 1
 suggestions
+  const
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -78,6 +80,8 @@
 replacement
   left: 1
 suggestions
+  const
+    kind: keyword
   null
     kind: keyword
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/location/block_test.dart b/pkg/analysis_server/test/services/completion/dart/location/block_test.dart
index d108f6a..ae2df16 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/block_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/block_test.dart
@@ -200,8 +200,20 @@
 suggestions
   return
     kind: keyword
+  var
+    kind: keyword
+  throw
+    kind: keyword
+  for
+    kind: keyword
+  try
+    kind: keyword
+  assert
+    kind: keyword
   rethrow
     kind: keyword
+  true
+    kind: keyword
 ''');
   }
 }
@@ -655,8 +667,20 @@
 suggestions
   e01
     kind: parameter
+  return
+    kind: keyword
+  assert
+    kind: keyword
   else
     kind: keyword
+  false
+    kind: keyword
+  late
+    kind: keyword
+  true
+    kind: keyword
+  while
+    kind: keyword
 ''');
   }
 
@@ -807,6 +831,14 @@
 replacement
   left: 1
 suggestions
+  return
+    kind: keyword
+  final
+    kind: keyword
+  const
+    kind: keyword
+  dynamic
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -936,6 +968,14 @@
 replacement
   left: 1
 suggestions
+  return
+    kind: keyword
+  final
+    kind: keyword
+  const
+    kind: keyword
+  dynamic
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -965,6 +1005,8 @@
 suggestions
   wrapper
     kind: functionInvocation
+  switch
+    kind: keyword
 ''');
   }
 
@@ -1023,6 +1065,14 @@
 replacement
   left: 1
 suggestions
+  return
+    kind: keyword
+  final
+    kind: keyword
+  const
+    kind: keyword
+  dynamic
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -1586,6 +1636,9 @@
   m0
     kind: getter
     declaringType: A
+  dynamic
+    kind: keyword
+    declaringType: null
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/case_clause_test.dart b/pkg/analysis_server/test/services/completion/dart/location/case_clause_test.dart
index c40fd36..006e9dc 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/case_clause_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/case_clause_test.dart
@@ -155,6 +155,8 @@
 replacement
   left: 1
 suggestions
+  myValue
+    kind: identifier
   value
     kind: identifier
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/location/cast_pattern_test.dart b/pkg/analysis_server/test/services/completion/dart/location/cast_pattern_test.dart
index 662c970..57b671f 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/cast_pattern_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/cast_pattern_test.dart
@@ -85,6 +85,8 @@
     kind: class
   A02
     kind: class
+  dynamic
+    kind: keyword
 ''');
   }
 
@@ -108,6 +110,8 @@
     kind: class
   A02
     kind: class
+  dynamic
+    kind: keyword
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart b/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart
index e29716f..b0ad64d 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/class_body_test.dart
@@ -285,6 +285,8 @@
 replacement
   left: 1
 suggestions
+  void
+    kind: keyword
   dynamic
     kind: keyword
 ''');
@@ -414,6 +416,8 @@
 suggestions
   Object
     kind: class
+  void
+    kind: keyword
 ''', where: context.where);
       },
     );
@@ -536,10 +540,15 @@
   Future<void> test_sx() async {
     _printKeywordsOrClass(sampleClassName: 'String');
 
-    await _checkContainers(
+    await _checkClassMixin(
       line: 's^',
       validator: (context) {
-        var keywords = {Keyword.SET, Keyword.STATIC};
+        var keywords = {
+          Keyword.ABSTRACT,
+          Keyword.CONST,
+          Keyword.SET,
+          Keyword.STATIC,
+        };
 
         assertResponse('''
 replacement
@@ -553,7 +562,27 @@
     );
   }
 
-  Future<void> _checkContainers({
+  Future<void> test_sx2() async {
+    _printKeywordsOrClass(sampleClassName: 'String');
+
+    await _checkContainers(
+      line: 's^',
+      validator: (context) {
+        var keywords = {Keyword.CONST, Keyword.SET, Keyword.STATIC};
+
+        assertResponse('''
+replacement
+  left: 1
+suggestions
+  String
+    kind: class
+${keywords.asKeywordSuggestions}
+''', where: context.where);
+      },
+    );
+  }
+
+  Future<void> _checkClassMixin({
     required String line,
     required void Function(_Context context) validator,
   }) async {
@@ -566,6 +595,21 @@
 ''');
       validator(_Context(isClass: true));
     }
+    // mixin
+    {
+      await computeSuggestions('''
+mixin M {
+  $line
+}
+''');
+      validator(_Context(isMixin: true));
+    }
+  }
+
+  Future<void> _checkContainers({
+    required String line,
+    required void Function(_Context context) validator,
+  }) async {
     // enum
     {
       await computeSuggestions('''
@@ -594,15 +638,6 @@
 ''');
       validator(_Context(isExtensionType: true));
     }
-    // mixin
-    {
-      await computeSuggestions('''
-mixin M {
-  $line
-}
-''');
-      validator(_Context(isMixin: true));
-    }
   }
 
   void _printKeywordsOrClass({String sampleClassName = 'Object'}) {
diff --git a/pkg/analysis_server/test/services/completion/dart/location/class_declaration_test.dart b/pkg/analysis_server/test/services/completion/dart/location/class_declaration_test.dart
index 7761a00..71a3f5f 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/class_declaration_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/class_declaration_test.dart
@@ -49,6 +49,8 @@
 suggestions
   implements
     kind: keyword
+  with
+    kind: keyword
 ''');
   }
 
@@ -62,6 +64,8 @@
 suggestions
   implements
     kind: keyword
+  with
+    kind: keyword
 ''');
   }
 
@@ -163,6 +167,8 @@
 suggestions
   extends
     kind: keyword
+  implements
+    kind: keyword
 ''');
   }
 
@@ -176,6 +182,8 @@
 suggestions
   extends
     kind: keyword
+  implements
+    kind: keyword
 ''');
   }
 
@@ -189,6 +197,8 @@
 suggestions
   extends
     kind: keyword
+  implements
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/compilation_unit_member_test.dart b/pkg/analysis_server/test/services/completion/dart/location/compilation_unit_member_test.dart
index e7b3db4..069d9d6 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/compilation_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/compilation_unit_member_test.dart
@@ -37,6 +37,7 @@
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'library'.
   Future<void> test_afterAbstract_base_prefix() async {
     await computeSuggestions('''
 abstract b^
@@ -45,8 +46,12 @@
 replacement
   left: 1
 suggestions
+  abstract
+    kind: keyword
   base
     kind: keyword
+  library
+    kind: keyword
 ''');
   }
 
@@ -380,8 +385,14 @@
     kind: keyword
   const
     kind: keyword
+  abstract
+    kind: keyword
   covariant
     kind: keyword
+  dynamic
+    kind: keyword
+  interface
+    kind: keyword
 ''');
   }
 
@@ -447,12 +458,18 @@
 replacement
   left: 1
 suggestions
+  abstract
+    kind: keyword
   class
     kind: keyword
   const
     kind: keyword
   covariant
     kind: keyword
+  dynamic
+    kind: keyword
+  interface
+    kind: keyword
 ''');
   }
 
@@ -669,8 +686,12 @@
 replacement
   left: 1
 suggestions
+  abstract
+    kind: keyword
   base
     kind: keyword
+  library
+    kind: keyword
 ''');
   }
 
@@ -840,8 +861,12 @@
 replacement
   left: 1
 suggestions
+  abstract
+    kind: keyword
   base
     kind: keyword
+  library
+    kind: keyword
 ''');
   }
 
@@ -855,9 +880,17 @@
 suggestions
   final
     kind: keyword
+  interface
+    kind: keyword
+  part of '';
+    kind: keyword
+    selection: 9
+  typedef
+    kind: keyword
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'covariant'.
   Future<void> test_beforeMixin_prefix_interface() async {
     await computeSuggestions('''
 i^ mixin M {}
@@ -869,8 +902,22 @@
   import '';
     kind: keyword
     selection: 8
+  covariant
+    kind: keyword
+  dynamic
+    kind: keyword
+  extension
+    kind: keyword
+  final
+    kind: keyword
   interface
     kind: keyword
+  library
+    kind: keyword
+  mixin
+    kind: keyword
+  void
+    kind: keyword
 ''');
   }
 
@@ -882,6 +929,16 @@
 replacement
   left: 1
 suggestions
+  abstract
+    kind: keyword
+  base
+    kind: keyword
+  class
+    kind: keyword
+  const
+    kind: keyword
+  extension
+    kind: keyword
   sealed
     kind: keyword
 ''');
@@ -1000,9 +1057,17 @@
 suggestions
   final
     kind: keyword
+  interface
+    kind: keyword
+  part of '';
+    kind: keyword
+    selection: 9
+  typedef
+    kind: keyword
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'covariant'.
   Future<void> test_interface_prefix() async {
     await computeSuggestions('''
 i^
@@ -1014,8 +1079,22 @@
   import '';
     kind: keyword
     selection: 8
+  covariant
+    kind: keyword
+  dynamic
+    kind: keyword
+  extension
+    kind: keyword
+  final
+    kind: keyword
   interface
     kind: keyword
+  library
+    kind: keyword
+  mixin
+    kind: keyword
+  void
+    kind: keyword
 ''');
   }
 
@@ -1027,6 +1106,13 @@
 replacement
   left: 1
 suggestions
+  import '';
+    kind: keyword
+    selection: 8
+  dynamic
+    kind: keyword
+  enum
+    kind: keyword
   mixin
     kind: keyword
 ''');
@@ -1040,6 +1126,16 @@
 replacement
   left: 1
 suggestions
+  abstract
+    kind: keyword
+  base
+    kind: keyword
+  class
+    kind: keyword
+  const
+    kind: keyword
+  extension
+    kind: keyword
   sealed
     kind: keyword
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart b/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart
index e444707..f918828 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart
@@ -26,6 +26,8 @@
 suggestions
   MyClass1
     kind: class
+  MyClass1.new
+    kind: constructor
 ''');
   }
 
@@ -135,6 +137,8 @@
 suggestions
   MyExtensionType
     kind: extensionType
+  MyExtensionType.new
+    kind: constructor
 ''');
   }
 
@@ -255,7 +259,7 @@
   left: 3
 suggestions
   async
-    kind: library
+    kind: prefix
 ''');
   }
 
@@ -273,6 +277,8 @@
 suggestions
   MyClass1
     kind: class
+  MyClass1.new
+    kind: constructor
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/extension_body_test.dart b/pkg/analysis_server/test/services/completion/dart/location/extension_body_test.dart
index 70b9e36..f6d886b 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/extension_body_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/extension_body_test.dart
@@ -154,8 +154,18 @@
 suggestions
   aaa
     kind: parameter
+  final
+    kind: keyword
+  var
+    kind: keyword
   assert
     kind: keyword
+  dynamic
+    kind: keyword
+  false
+    kind: keyword
+  late
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/extension_type_declaration_test.dart b/pkg/analysis_server/test/services/completion/dart/location/extension_type_declaration_test.dart
index 92547aa..18d6a93 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/extension_type_declaration_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/extension_type_declaration_test.dart
@@ -81,6 +81,8 @@
 suggestions
   E0
     kind: extensionType
+  E0
+    kind: constructorInvocation
 ''');
   }
 
@@ -98,6 +100,8 @@
 suggestions
   E0
     kind: extensionType
+  E0
+    kind: constructorInvocation
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/field_declaration_test.dart b/pkg/analysis_server/test/services/completion/dart/location/field_declaration_test.dart
index 0e2e40d..8784793 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/field_declaration_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/field_declaration_test.dart
@@ -30,6 +30,8 @@
 suggestions
   const
     kind: keyword
+  dynamic
+    kind: keyword
 ''');
   }
 
@@ -115,6 +117,8 @@
 replacement
   left: 1
 suggestions
+  const
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -138,6 +142,8 @@
 suggestions
   const
     kind: keyword
+  dynamic
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/for_statement_test.dart b/pkg/analysis_server/test/services/completion/dart/location/for_statement_test.dart
index 1446775..87576ba 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/for_statement_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/for_statement_test.dart
@@ -28,6 +28,8 @@
 replacement
   left: 1
 suggestions
+  switch
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/function_declaration_test.dart b/pkg/analysis_server/test/services/completion/dart/location/function_declaration_test.dart
index fd868e3..54869b3 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/function_declaration_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/function_declaration_test.dart
@@ -46,6 +46,7 @@
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'covariant'.
   Future<void> test_afterRightParen_beforeEnd_partial() async {
     await computeSuggestions('''
 void f()a^
@@ -54,12 +55,32 @@
 replacement
   left: 1
 suggestions
+  class
+    kind: keyword
+  final
+    kind: keyword
   abstract
     kind: keyword
   async
     kind: keyword
   async*
     kind: keyword
+  base
+    kind: keyword
+  covariant
+    kind: keyword
+  dynamic
+    kind: keyword
+  external
+    kind: keyword
+  interface
+    kind: keyword
+  late
+    kind: keyword
+  sealed
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
@@ -101,10 +122,16 @@
 replacement
   left: 1
 suggestions
+  final
+    kind: keyword
   async
     kind: keyword
   async*
     kind: keyword
+  external
+    kind: keyword
+  late
+    kind: keyword
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/location/if_element_test.dart b/pkg/analysis_server/test/services/completion/dart/location/if_element_test.dart
index 029c176..29aa0c5 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/if_element_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/if_element_test.dart
@@ -30,6 +30,10 @@
 replacement
   left: 1
 suggestions
+  false
+    kind: keyword
+  true
+    kind: keyword
 ''');
   }
 
@@ -66,6 +70,10 @@
 replacement
   left: 1
 suggestions
+  false
+    kind: keyword
+  true
+    kind: keyword
   else
     kind: keyword
 ''');
@@ -131,6 +139,10 @@
 replacement
   left: 1
 suggestions
+  false
+    kind: keyword
+  true
+    kind: keyword
   else
     kind: keyword
 ''');
@@ -254,6 +266,10 @@
 replacement
   left: 1
 suggestions
+  false
+    kind: keyword
+  true
+    kind: keyword
   else
     kind: keyword
 ''');
@@ -275,6 +291,10 @@
 replacement
   left: 1
 suggestions
+  false
+    kind: keyword
+  true
+    kind: keyword
   else
     kind: keyword
 ''');
@@ -296,6 +316,10 @@
 replacement
   left: 1
 suggestions
+  false
+    kind: keyword
+  true
+    kind: keyword
   else
     kind: keyword
 ''');
@@ -368,6 +392,8 @@
 suggestions
   const
     kind: keyword
+  switch
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/if_statement_test.dart b/pkg/analysis_server/test/services/completion/dart/location/if_statement_test.dart
index 20aeba1..6dd17a7 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/if_statement_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/if_statement_test.dart
@@ -35,12 +35,12 @@
 ''');
     assertResponse(r'''
 suggestions
-  c01
-    kind: topLevelVariable
   A1
     kind: class
   A1.named
     kind: constructor
+  c01
+    kind: topLevelVariable
   const
     kind: keyword
   false
@@ -75,21 +75,26 @@
 int B04() => 0;
 ''');
 
-    // TODO(scheglov): This is wrong.
     assertResponse(r'''
 replacement
   left: 1
 suggestions
-  A02
-    kind: topLevelVariable
   A01
     kind: class
   A01
     kind: constructorInvocation
+  A02
+    kind: topLevelVariable
   A03
     kind: topLevelVariable
   A04
     kind: functionInvocation
+  false
+    kind: keyword
+  final
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
@@ -167,6 +172,8 @@
 suggestions
   null
     kind: keyword
+  const
+    kind: keyword
 ''');
   }
 
@@ -203,6 +210,8 @@
 suggestions
   null
     kind: keyword
+  const
+    kind: keyword
 ''');
   }
 
@@ -244,6 +253,18 @@
 suggestions
   return
     kind: keyword
+  throw
+    kind: keyword
+  assert
+    kind: keyword
+  for
+    kind: keyword
+  true
+    kind: keyword
+  try
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
@@ -257,6 +278,20 @@
 suggestions
   return
     kind: keyword
+  throw
+    kind: keyword
+  assert
+    kind: keyword
+  for
+    kind: keyword
+  super
+    kind: keyword
+  true
+    kind: keyword
+  try
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
@@ -551,8 +586,20 @@
 replacement
   left: 1
 suggestions
+  return
+    kind: keyword
+  assert
+    kind: keyword
   else
     kind: keyword
+  false
+    kind: keyword
+  late
+    kind: keyword
+  true
+    kind: keyword
+  while
+    kind: keyword
 ''');
   }
 
@@ -589,6 +636,8 @@
 suggestions
   const
     kind: keyword
+  switch
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/import_directive_test.dart b/pkg/analysis_server/test/services/completion/dart/location/import_directive_test.dart
index 42e2820..d53cc88 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/import_directive_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/import_directive_test.dart
@@ -233,6 +233,8 @@
 suggestions
   deferred as
     kind: keyword
+  hide
+    kind: keyword
 ''');
   }
 
@@ -262,6 +264,8 @@
 suggestions
   deferred as
     kind: keyword
+  hide
+    kind: keyword
 ''');
   }
 
@@ -307,6 +311,8 @@
 suggestions
   deferred as
     kind: keyword
+  hide
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/list_pattern_test.dart b/pkg/analysis_server/test/services/completion/dart/location/list_pattern_test.dart
index 9cb65a8..4db9e36 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/list_pattern_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/list_pattern_test.dart
@@ -31,10 +31,10 @@
 ''');
     assertResponse(r'''
 suggestions
-  c01
-    kind: topLevelVariable
   c11
     kind: localVariable
+  c01
+    kind: topLevelVariable
   false
     kind: keyword
   null
@@ -64,10 +64,10 @@
 ''');
     assertResponse(r'''
 suggestions
-  c01
-    kind: topLevelVariable
   c11
     kind: localVariable
+  c01
+    kind: topLevelVariable
   false
     kind: keyword
   null
@@ -97,10 +97,10 @@
 ''');
     assertResponse(r'''
 suggestions
-  c01
-    kind: topLevelVariable
   c11
     kind: localVariable
+  c01
+    kind: topLevelVariable
   false
     kind: keyword
   null
@@ -130,10 +130,10 @@
 ''');
     assertResponse(r'''
 suggestions
-  c01
-    kind: topLevelVariable
   c11
     kind: localVariable
+  c01
+    kind: topLevelVariable
   false
     kind: keyword
   null
diff --git a/pkg/analysis_server/test/services/completion/dart/location/method_declaration_test.dart b/pkg/analysis_server/test/services/completion/dart/location/method_declaration_test.dart
index 0947481..ca55918 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/method_declaration_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/method_declaration_test.dart
@@ -59,6 +59,8 @@
 replacement
   left: 1
 suggestions
+  void
+    kind: keyword
   dynamic
     kind: keyword
 ''');
@@ -323,6 +325,7 @@
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'covariant'.
   Future<void> test_afterParameterList_beforeField_partial_a() async {
     await computeSuggestions('''
 class A { foo() a^ Foo foo;}
@@ -331,12 +334,24 @@
 replacement
   left: 1
 suggestions
+  final
+    kind: keyword
+  static
+    kind: keyword
   abstract
     kind: keyword
   async
     kind: keyword
   async*
     kind: keyword
+  covariant
+    kind: keyword
+  external
+    kind: keyword
+  late
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
@@ -346,6 +361,36 @@
 ''');
     assertResponse(r'''
 suggestions
+  final
+    kind: keyword
+  static
+    kind: keyword
+  void
+    kind: keyword
+  const
+    kind: keyword
+  set
+    kind: keyword
+  factory
+    kind: keyword
+  async
+    kind: keyword
+  async*
+    kind: keyword
+  covariant
+    kind: keyword
+  dynamic
+    kind: keyword
+  get
+    kind: keyword
+  late
+    kind: keyword
+  operator
+    kind: keyword
+  sync*
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/named_type_test.dart b/pkg/analysis_server/test/services/completion/dart/location/named_type_test.dart
index 223afe9..dcc2ea4 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/named_type_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/named_type_test.dart
@@ -26,6 +26,8 @@
 replacement
   left: 1
 suggestions
+  void
+    kind: keyword
   dynamic
     kind: keyword
 ''');
@@ -39,6 +41,14 @@
 replacement
   left: 1
 suggestions
+  return
+    kind: keyword
+  final
+    kind: keyword
+  const
+    kind: keyword
+  dynamic
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -55,6 +65,8 @@
 suggestions
   void
     kind: keyword
+  covariant
+    kind: keyword
 ''');
   }
 
@@ -68,6 +80,8 @@
 suggestions
   void
     kind: keyword
+  covariant
+    kind: keyword
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/location/parameter_list_test.dart b/pkg/analysis_server/test/services/completion/dart/location/parameter_list_test.dart
index 70fe98d..225d920 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/parameter_list_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/parameter_list_test.dart
@@ -93,6 +93,8 @@
 suggestions
   this
     kind: keyword
+  covariant
+    kind: keyword
 ''');
   }
 
@@ -161,11 +163,14 @@
 suggestions
   String
     kind: class
+  this
+    kind: keyword
   super
     kind: keyword
 ''');
   }
 
+  // TODO(keertip): Do not suggest 'covariant'.
   Future<void> test_afterType() async {
     allowedIdentifiers = {'T'};
     await computeSuggestions('''
@@ -177,6 +182,8 @@
 suggestions
   T
     kind: typeParameter
+  covariant
+    kind: keyword
 ''');
   }
 
@@ -367,7 +374,7 @@
 
   Future<void> test_afterLeftParen_beforeRightParen_partial() async {
     await computeSuggestions('''
-class A { foo(t^) {}}
+class A { foo(s^) {}}
 ''');
     assertResponse(r'''
 replacement
diff --git a/pkg/analysis_server/test/services/completion/dart/location/pattern_assignment_test.dart b/pkg/analysis_server/test/services/completion/dart/location/pattern_assignment_test.dart
index 1d4129f..57c2c09 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/pattern_assignment_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/pattern_assignment_test.dart
@@ -54,6 +54,8 @@
 suggestions
   r01
     kind: parameter
+  true
+    kind: keyword
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/location/pattern_variable_declaration_test.dart b/pkg/analysis_server/test/services/completion/dart/location/pattern_variable_declaration_test.dart
index cf1ea5b..136d260 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/pattern_variable_declaration_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/pattern_variable_declaration_test.dart
@@ -52,6 +52,8 @@
 suggestions
   r01
     kind: parameter
+  true
+    kind: keyword
 ''');
   }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/location/relational_pattern_test.dart b/pkg/analysis_server/test/services/completion/dart/location/relational_pattern_test.dart
index eb9e7ab..6c4c7f4 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/relational_pattern_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/relational_pattern_test.dart
@@ -41,6 +41,8 @@
     kind: class
   A02
     kind: constructorInvocation
+  false
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/switch_expression_test.dart b/pkg/analysis_server/test/services/completion/dart/location/switch_expression_test.dart
index 8f3457a..3cf05f5 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/switch_expression_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/switch_expression_test.dart
@@ -94,12 +94,12 @@
 ''');
     assertResponse(r'''
 suggestions
-  c01
-    kind: topLevelVariable
   A1
     kind: class
   A1.named
     kind: constructor
+  c01
+    kind: topLevelVariable
   const
     kind: keyword
   false
@@ -140,16 +140,22 @@
 replacement
   left: 1
 suggestions
-  A02
-    kind: topLevelVariable
   A01
     kind: class
   A01
     kind: constructorInvocation
+  A02
+    kind: topLevelVariable
   A03
     kind: topLevelVariable
   A04
     kind: functionInvocation
+  false
+    kind: keyword
+  final
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
@@ -178,16 +184,22 @@
 replacement
   left: 1
 suggestions
-  A02
-    kind: topLevelVariable
   A01
     kind: class
   A01
     kind: constructorInvocation
+  A02
+    kind: topLevelVariable
   A03
     kind: topLevelVariable
   A04
     kind: functionInvocation
+  false
+    kind: keyword
+  final
+    kind: keyword
+  var
+    kind: keyword
 ''');
   }
 
diff --git a/pkg/analysis_server/test/services/completion/dart/location/switch_pattern_case_test.dart b/pkg/analysis_server/test/services/completion/dart/location/switch_pattern_case_test.dart
index 1ba30ac..9df054b 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/switch_pattern_case_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/switch_pattern_case_test.dart
@@ -249,6 +249,8 @@
 replacement
   left: 1
 suggestions
+  myValue
+    kind: identifier
   value
     kind: identifier
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/location/switch_statement_test.dart b/pkg/analysis_server/test/services/completion/dart/location/switch_statement_test.dart
index 998a9be..4b66b39 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/switch_statement_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/switch_statement_test.dart
@@ -141,6 +141,8 @@
 replacement
   left: 1
 suggestions
+  const
+    kind: keyword
   null
     kind: keyword
 ''');
@@ -155,6 +157,8 @@
 replacement
   left: 1
 suggestions
+  const
+    kind: keyword
   null
     kind: keyword
 ''');
diff --git a/pkg/analysis_server/test/services/completion/dart/location/try_statement_test.dart b/pkg/analysis_server/test/services/completion/dart/location/try_statement_test.dart
index 490f7ff..7263d50 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/try_statement_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/try_statement_test.dart
@@ -25,10 +25,14 @@
 replacement
   left: 1
 suggestions
+  switch
+    kind: keyword
   catch
     kind: keyword
   const
     kind: keyword
+  dynamic
+    kind: keyword
 ''');
   }
 
@@ -40,10 +44,14 @@
 replacement
   left: 1
 suggestions
+  switch
+    kind: keyword
   catch
     kind: keyword
   const
     kind: keyword
+  dynamic
+    kind: keyword
 ''');
   }