Skip to content

Commit

Permalink
Version 3.5.0-3.0.dev
Browse files Browse the repository at this point in the history
Merge 4e0ece2 into dev
  • Loading branch information
Dart CI committed Mar 29, 2024
2 parents 52b0514 + 4e0ece2 commit 572de60
Show file tree
Hide file tree
Showing 31 changed files with 829 additions and 580 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,19 @@ final class LabelSuggestion extends CandidateSuggestion {
String get completion => label.label.name;
}

/// The suggestion for `loadLibrary()`.
final class LoadLibraryFunctionSuggestion extends ExecutableSuggestion {
final FunctionElement element;

LoadLibraryFunctionSuggestion({
required super.kind,
required this.element,
});

@override
String get completion => element.name;
}

/// The information about a candidate suggestion based on a local function.
final class LocalFunctionSuggestion extends ExecutableSuggestion {
/// The element on which the suggestion is based.
Expand Down Expand Up @@ -506,6 +519,27 @@ final class RecordFieldSuggestion extends CandidateSuggestion {
String get completion => name;
}

/// The information about a candidate suggestion based on a named field of
/// a record type.
final class RecordLiteralNamedFieldSuggestion extends CandidateSuggestion {
final RecordTypeNamedField field;
final bool appendColon;
final bool appendComma;

RecordLiteralNamedFieldSuggestion.newField({
required this.field,
required this.appendComma,
}) : appendColon = true;

RecordLiteralNamedFieldSuggestion.onlyName({
required this.field,
}) : appendColon = false,
appendComma = false;

@override
String get completion => field.name;
}

/// The information about a candidate suggestion based on a static field in a
/// location where the name of the field must be qualified by the name of the
/// enclosing element.
Expand Down Expand Up @@ -707,6 +741,10 @@ extension SuggestionBuilderExtension on SuggestionBuilder {
offset: suggestion.selectionOffset);
case LabelSuggestion():
suggestLabel(suggestion.label);
case LoadLibraryFunctionSuggestion():
suggestLoadLibraryFunction(
suggestion.element,
);
case LocalFunctionSuggestion():
suggestTopLevelFunction(suggestion.element);
case LocalVariableSuggestion():
Expand Down Expand Up @@ -759,6 +797,12 @@ extension SuggestionBuilderExtension on SuggestionBuilder {
);
case RecordFieldSuggestion():
suggestRecordField(field: suggestion.field, name: suggestion.name);
case RecordLiteralNamedFieldSuggestion():
suggestNamedRecordField(
suggestion.field,
appendColon: suggestion.appendColon,
appendComma: suggestion.appendComma,
);
case StaticFieldSuggestion():
libraryUriStr = suggestion.libraryUriStr;
suggestStaticField(suggestion.element, prefix: suggestion.prefix);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ import 'package:analysis_server/src/provisional/completion/completion_core.dart'
import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
import 'package:analysis_server/src/services/completion/dart/candidate_suggestion.dart';
import 'package:analysis_server/src/services/completion/dart/completion_state.dart';
import 'package:analysis_server/src/services/completion/dart/extension_member_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/feature_computer.dart';
import 'package:analysis_server/src/services/completion/dart/in_scope_completion_pass.dart';
import 'package:analysis_server/src/services/completion/dart/library_member_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/not_imported_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/record_literal_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
import 'package:analysis_server/src/services/completion/dart/suggestion_collector.dart';
import 'package:analysis_server/src/utilities/selection.dart';
Expand Down Expand Up @@ -121,11 +118,7 @@ class DartCompletionManager {
// Compute the list of contributors that will be run.
var builder =
SuggestionBuilder(request, useFilter: useFilter, listener: listener);
var contributors = <DartCompletionContributor>[
ExtensionMemberContributor(request, builder),
LibraryMemberContributor(request, builder),
RecordLiteralContributor(request, builder),
];
var contributors = <DartCompletionContributor>[];

if (includedElementKinds != null) {
_addIncludedElementKinds(request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/element/type_algebra.dart';
import 'package:analyzer/src/dart/resolver/applicable_extensions.dart';
import 'package:analyzer/src/dart/resolver/scope.dart';
import 'package:analyzer/src/utilities/extensions/element.dart';
import 'package:analyzer/src/workspace/pub.dart';
Expand Down Expand Up @@ -68,6 +69,10 @@ class DeclarationHelper {
/// Whether suggestions should be limited to only include types.
final bool mustBeType;

/// Whether suggestions should exclude type names, e.g. include only
/// constructor invocations.
final bool excludeTypeNames;

/// Whether suggestions should be tear-offs rather than invocations where
/// possible.
final bool preferNonInvocation;
Expand Down Expand Up @@ -110,6 +115,7 @@ class DeclarationHelper {
required this.mustBeNonVoid,
required this.mustBeStatic,
required this.mustBeType,
required this.excludeTypeNames,
required this.preferNonInvocation,
required this.suggestUnnamedAsNew,
required this.skipImports,
Expand Down Expand Up @@ -179,6 +185,17 @@ class DeclarationHelper {
namespace: importElement.namespace,
prefix: null,
);

if (importElement.prefix case var importPrefix?) {
if (importPrefix is DeferredImportElementPrefix) {
collector.addSuggestion(
LoadLibraryFunctionSuggestion(
kind: CompletionSuggestionKind.INVOCATION,
element: importedLibrary.loadLibraryFunction,
),
);
}
}
}
}

Expand Down Expand Up @@ -356,6 +373,20 @@ class DeclarationHelper {
}
}

/// Add members from the given [ExtensionElement].
void addMembersFromExtensionElement(ExtensionElement extension) {
for (var method in extension.methods) {
if (!method.isStatic) {
_suggestMethod(method, extension);
}
}
for (var accessor in extension.accessors) {
if (!accessor.isStatic) {
_suggestProperty(accessor, extension);
}
}
}

/// Add any parameters from the super constructor of the constructor
/// containing the [node] that can be referenced as a super parameter.
void addParametersFromSuperConstructor(SuperFormalParameter node) {
Expand Down Expand Up @@ -573,6 +604,40 @@ class DeclarationHelper {
}
}

/// Add members from all the applicable extensions that are visible for the
/// given [InterfaceType].
void _addExtensionMembers(
{required InterfaceType type,
required Set<String> excludedGetters,
required bool includeMethods,
required bool includeSetters}) {
var libraryElement = request.libraryElement;

var applicableExtensions = libraryElement.accessibleExtensions.applicableTo(
targetLibrary: libraryElement,
// Ignore nullability, consistent with non-extension members.
targetType: type.isDartCoreNull
? type
: libraryElement.typeSystem.promoteToNonNull(type),
strictCasts: false,
);
for (var instantiatedExtension in applicableExtensions) {
var extension = instantiatedExtension.extension;
if (includeMethods) {
for (var method in extension.methods) {
if (!method.isStatic) {
_suggestMethod(method, extension);
}
}
}
for (var accessor in extension.accessors) {
if (accessor.isGetter || includeSetters && accessor.isSetter) {
_suggestProperty(accessor, extension);
}
}
}
}

/// Add suggestions for any of the fields defined by the record [type] except
/// for those whose names are in the set of [excludedFields].
void _addFieldsOfRecordType({
Expand Down Expand Up @@ -738,6 +803,12 @@ class DeclarationHelper {
type.allSupertypes.any((type) => type.isDartCoreFunction)) {
_suggestFunctionCall(); // from builder
}
// Add members from extensions
_addExtensionMembers(
type: type,
excludedGetters: excludedGetters,
includeMethods: includeMethods,
includeSetters: includeSetters);
}

/// Adds suggestions for any local declarations that are visible at the
Expand Down Expand Up @@ -898,6 +969,11 @@ class DeclarationHelper {
_suggestMethod(method, element);
}
}
_addExtensionMembers(
type: element.thisType as InterfaceType,
excludedGetters: {},
includeMethods: true,
includeSetters: true);
}

/// Completion is inside [declaration].
Expand Down Expand Up @@ -1135,7 +1211,7 @@ class DeclarationHelper {
(mustBeMixable && !element.isMixableIn(request.libraryElement))) {
return;
}
if (!mustBeConstant) {
if (!mustBeConstant && !excludeTypeNames) {
var suggestion =
ClassSuggestion(importData: importData, element: element);
collector.addSuggestion(suggestion);
Expand Down
Loading

0 comments on commit 572de60

Please sign in to comment.