[Elements.migrate] Migrate LibraryElementSuggestionBuilder
Change-Id: I56dde963754fbaf5012f7229fa5a37441c210c4c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/396140
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Keerti Parthasarathy <keertip@google.com>
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 12a5be6..1a7946a 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -226,7 +226,7 @@
);
var exportMap = element.exportNamespace.definedNames;
for (var definedElement in exportMap.values) {
- definedElement.accept(visitor);
+ definedElement.asElement2?.accept2(visitor);
}
return suggestionBuilder.suggestions.toList();
}
diff --git a/pkg/analysis_server/lib/src/cider/local_library_contributor.dart b/pkg/analysis_server/lib/src/cider/local_library_contributor.dart
index 6f998a6..8d52730 100644
--- a/pkg/analysis_server/lib/src/cider/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/cider/local_library_contributor.dart
@@ -8,17 +8,16 @@
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart'
show SuggestionBuilder;
import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/dart/element/visitor.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
+import 'package:analyzer/dart/element/visitor2.dart';
import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
/// A visitor for building suggestions based upon the elements defined by
/// a source file contained in the same library but not the same as
/// the source in which the completions are being requested.
-class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor<void> {
+class LibraryElementSuggestionBuilder
+ extends GeneralizingElementVisitor2<void> {
final DartCompletionRequest request;
final SuggestionBuilder builder;
@@ -30,7 +29,7 @@
final String? prefix;
/// The set of libraries that have been, or are currently being, visited.
- final Set<LibraryElement> visitedLibraries = <LibraryElement>{};
+ final Set<LibraryElement2> visitedLibraries = <LibraryElement2>{};
factory LibraryElementSuggestionBuilder(
DartCompletionRequest request,
@@ -60,164 +59,126 @@
);
@override
- void visitClassElement(ClassElement element) {
+ void visitClassElement(ClassElement2 element) {
AstNode node = request.target.containingNode;
- if (node is ExtendsClause &&
- !element.isExtendableIn(request.libraryElement)) {
+ var libraryElement = request.libraryElement2;
+ if (node is ExtendsClause && !element.isExtendableIn2(libraryElement)) {
return;
} else if (node is ImplementsClause &&
- !element.isImplementableIn(request.libraryElement)) {
+ !element.isImplementableIn2(libraryElement)) {
return;
- } else if (node is WithClause &&
- !element.isMixableIn(request.libraryElement)) {
+ } else if (node is WithClause && !element.isMixableIn2(libraryElement)) {
return;
}
_visitInterfaceElement(element);
}
@override
- void visitCompilationUnitElement(CompilationUnitElement element) {
- element.visitChildren(this);
- }
-
- @override
- void visitElement(Element element) {
+ void visitElement(Element2 element) {
// ignored
}
@override
- visitEnumElement(EnumElement element) {
+ visitEnumElement(EnumElement2 element) {
_visitInterfaceElement(element);
}
@override
- void visitExtensionElement(ExtensionElement element) {
+ void visitExtensionElement(ExtensionElement2 element) {
if (opType.includeReturnValueSuggestions) {
- if (element.name != null) {
- builder.suggestExtension(
- element.asElement2 as ExtensionElement2,
- kind: kind,
- prefix: prefix,
- );
+ if (element.name3 != null) {
+ builder.suggestExtension(element, kind: kind, prefix: prefix);
}
}
}
@override
- void visitExtensionTypeElement(ExtensionTypeElement element) {
+ void visitExtensionTypeElement(ExtensionTypeElement2 element) {
_visitInterfaceElement(element);
}
@override
- void visitFunctionElement(FunctionElement element) {
- // Do not suggest operators or local functions
- if (element.isOperator) {
- return;
- }
- if (element.enclosingElement3 is! CompilationUnitElement) {
- return;
- }
- var returnType = element.returnType;
- if (returnType is VoidType) {
- if (opType.includeVoidReturnSuggestions) {
- builder.suggestTopLevelFunction(
- element.asElement2 as TopLevelFunctionElement,
- kind: kind,
- prefix: prefix,
- );
- }
- } else {
- if (opType.includeReturnValueSuggestions) {
- builder.suggestTopLevelFunction(
- element.asElement2 as TopLevelFunctionElement,
- kind: kind,
- prefix: prefix,
- );
- }
- }
- }
-
- @override
- void visitLibraryElement(LibraryElement element) {
- if (visitedLibraries.add(element)) {
- element.visitChildren(this);
- }
- }
-
- @override
- visitMixinElement(MixinElement element) {
- AstNode node = request.target.containingNode;
- if (node is ImplementsClause &&
- !element.isImplementableIn(request.libraryElement)) {
- return;
- }
- _visitInterfaceElement(element);
- }
-
- @override
- void visitPropertyAccessorElement(PropertyAccessorElement element) {
- var variable = element.variable2;
+ void visitGetterElement(GetterElement element) {
+ var variable = element.variable3;
if (opType.includeReturnValueSuggestions ||
(opType.includeAnnotationSuggestions &&
variable != null &&
variable.isConst)) {
- var parent = element.enclosingElement3;
- if (parent is InterfaceElement || parent is ExtensionElement) {
+ var parent = element.enclosingElement2;
+ if (parent is InterfaceElement2 || parent is ExtensionElement2) {
if (element.isSynthetic) {
- if (element.isGetter) {
- if (variable is FieldElement) {
- builder.suggestField(
- variable.asElement2,
- inheritanceDistance: 0.0,
- );
- }
+ if (variable is FieldElement2) {
+ builder.suggestField(variable, inheritanceDistance: 0.0);
}
} else {
- if (element.isGetter) {
- builder.suggestGetter(
- element.asElement2 as GetterElement,
- inheritanceDistance: 0.0,
- );
- } else {
- builder.suggestSetter(
- element.asElement2 as SetterElement,
- inheritanceDistance: 0.0,
- );
- }
+ builder.suggestGetter(element, inheritanceDistance: 0.0);
}
} else {
- if (element.isGetter) {
- builder.suggestTopLevelGetter(
- element.asElement2 as GetterElement,
- prefix: prefix,
- );
- } else {
- builder.suggestTopLevelSetter(
- element.asElement2 as SetterElement,
- prefix: prefix,
- );
- }
+ builder.suggestTopLevelGetter(element, prefix: prefix);
}
}
}
@override
- void visitTopLevelVariableElement(TopLevelVariableElement element) {
- if (opType.includeReturnValueSuggestions && !element.isSynthetic) {
- builder.suggestTopLevelVariable(
- element.asElement2 as TopLevelVariableElement2,
- prefix: prefix,
- );
+ void visitLibraryElement(LibraryElement2 element) {
+ if (visitedLibraries.add(element)) {
+ element.visitChildren2(this);
}
}
@override
- void visitTypeAliasElement(TypeAliasElement element) {
+ visitMixinElement(MixinElement2 element) {
+ AstNode node = request.target.containingNode;
+ if (node is ImplementsClause &&
+ !element.isImplementableIn2(request.libraryElement2)) {
+ return;
+ }
+ _visitInterfaceElement(element);
+ }
+
+ @override
+ void visitSetterElement(SetterElement element) {
+ var variable = element.variable3;
+ if (opType.includeReturnValueSuggestions ||
+ (opType.includeAnnotationSuggestions &&
+ variable != null &&
+ variable.isConst)) {
+ var parent = element.enclosingElement2;
+ if (parent is InterfaceElement2 || parent is ExtensionElement2) {
+ if (!element.isSynthetic) {
+ builder.suggestSetter(element, inheritanceDistance: 0.0);
+ }
+ } else {
+ builder.suggestTopLevelSetter(element, prefix: prefix);
+ }
+ }
+ }
+
+ @override
+ void visitTopLevelFunctionElement(TopLevelFunctionElement element) {
+ var returnType = element.returnType;
+ if (returnType is VoidType) {
+ if (opType.includeVoidReturnSuggestions) {
+ builder.suggestTopLevelFunction(element, kind: kind, prefix: prefix);
+ }
+ } else {
+ if (opType.includeReturnValueSuggestions) {
+ builder.suggestTopLevelFunction(element, kind: kind, prefix: prefix);
+ }
+ }
+ }
+
+ @override
+ void visitTopLevelVariableElement(TopLevelVariableElement2 element) {
+ if (opType.includeReturnValueSuggestions && !element.isSynthetic) {
+ builder.suggestTopLevelVariable(element, prefix: prefix);
+ }
+ }
+
+ @override
+ void visitTypeAliasElement(TypeAliasElement2 element) {
if (opType.includeTypeNameSuggestions) {
- builder.suggestTypeAlias(
- element.asElement2 as TypeAliasElement2,
- prefix: prefix,
- );
+ builder.suggestTypeAlias(element, prefix: prefix);
}
}
@@ -225,14 +186,14 @@
///
/// If [onlyConst] is `true`, only `const` constructors will be suggested.
void _addConstructorSuggestions(
- ClassElement element, {
+ ClassElement2 element, {
bool onlyConst = false,
}) {
- if (element is EnumElement) {
+ if (element is EnumElement2) {
return;
}
- for (var constructor in element.constructors) {
+ for (var constructor in element.constructors2) {
if (constructor.isPrivate) {
continue;
}
@@ -242,19 +203,15 @@
if (onlyConst && !constructor.isConst) {
continue;
}
- builder.suggestConstructor(
- constructor.asElement2 as ConstructorElement2,
- kind: kind,
- prefix: prefix,
- );
+ builder.suggestConstructor(constructor, kind: kind, prefix: prefix);
}
}
- void _visitInterfaceElement(InterfaceElement element) {
+ void _visitInterfaceElement(InterfaceElement2 element) {
if (opType.includeTypeNameSuggestions) {
- builder.suggestInterface(element.asElement2, prefix: prefix);
+ builder.suggestInterface(element, prefix: prefix);
}
- if (element is ClassElement) {
+ if (element is ClassElement2) {
if (opType.includeConstructorSuggestions) {
_addConstructorSuggestions(element);
} else if (opType.includeAnnotationSuggestions) {
@@ -266,24 +223,21 @@
var contextType = request.contextType;
if (contextType is InterfaceType) {
// TODO(scheglov): This looks not ideal - we should suggest getters.
- for (var field in element.fields) {
+ for (var field in element.fields2) {
if (field.isStatic &&
- field.isAccessibleIn(request.libraryElement) &&
+ field.isAccessibleIn2(request.libraryElement2) &&
typeSystem.isSubtypeOf(field.type, contextType)) {
if (field.isSynthetic) {
- var getter = field.getter;
+ var getter = field.getter2;
if (getter != null) {
builder.suggestGetter(
- getter.asElement2 as GetterElement,
+ getter,
inheritanceDistance: 0.0,
withEnclosingName: true,
);
}
} else {
- builder.suggestStaticField(
- field.asElement2,
- prefix: prefix,
- );
+ builder.suggestStaticField(field, prefix: prefix);
}
}
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 794d096..d4a9730 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -20,6 +20,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/source/source.dart';
@@ -34,6 +35,7 @@
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:analyzer/src/util/performance/operation_performance.dart';
import 'package:analyzer/src/utilities/completion_matcher.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
import 'package:analyzer/src/utilities/fuzzy_matcher.dart';
import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
@@ -401,6 +403,10 @@
return analysisSession.inheritanceManager;
}
+ /// Getter for the [Element2] repersentation of [libraryElement].
+ LibraryElement2 get libraryElement2 =>
+ libraryElement.asElement2 as LibraryElement2;
+
/// Answer the [DartType] for Object in dart:core
InterfaceType get objectType => libraryElement.typeProvider.objectType;