[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
''');
}