| Index: pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
|
| diff --git a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
|
| index a95f5eaefde3fafe6054ad7725ef962dd99ead54..d0e86dd8995a0e4ab1c1e07e6ed4f3d45c7c4d38 100644
|
| --- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
|
| +++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart
|
| @@ -5,7 +5,8 @@
|
| library services.completion.suggestion.builder;
|
|
|
| import 'package:analysis_server/src/protocol_server.dart' as protocol;
|
| -import 'package:analysis_server/src/protocol_server.dart' hide Element, ElementKind;
|
| +import 'package:analysis_server/src/protocol_server.dart' hide Element,
|
| + ElementKind;
|
| import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
|
| import 'package:analyzer/src/generated/element.dart';
|
|
|
| @@ -14,11 +15,9 @@ import 'package:analyzer/src/generated/element.dart';
|
| * the visible members in that class. Clients should call
|
| * [ClassElementSuggestionBuilder.suggestionsFor].
|
| */
|
| -class ClassElementSuggestionBuilder extends GeneralizingElementVisitor {
|
| - final DartCompletionRequest request;
|
| - final Set<String> _completions = new Set<String>();
|
| +class ClassElementSuggestionBuilder extends _AbstractSuggestionBuilder {
|
|
|
| - ClassElementSuggestionBuilder(this.request);
|
| + ClassElementSuggestionBuilder(DartCompletionRequest request) : super(request);
|
|
|
| @override
|
| visitClassElement(ClassElement element) {
|
| @@ -35,7 +34,7 @@ class ClassElementSuggestionBuilder extends GeneralizingElementVisitor {
|
|
|
| @override
|
| visitFieldElement(FieldElement element) {
|
| - _addSuggestion(
|
| + _addElementSuggestion(
|
| element,
|
| CompletionSuggestionKind.GETTER,
|
| element.type,
|
| @@ -44,7 +43,7 @@ class ClassElementSuggestionBuilder extends GeneralizingElementVisitor {
|
|
|
| @override
|
| visitMethodElement(MethodElement element) {
|
| - _addSuggestion(
|
| + _addElementSuggestion(
|
| element,
|
| CompletionSuggestionKind.METHOD,
|
| element.returnType,
|
| @@ -54,13 +53,13 @@ class ClassElementSuggestionBuilder extends GeneralizingElementVisitor {
|
| @override
|
| visitPropertyAccessorElement(PropertyAccessorElement element) {
|
| if (element.isGetter) {
|
| - _addSuggestion(
|
| + _addElementSuggestion(
|
| element,
|
| CompletionSuggestionKind.GETTER,
|
| element.returnType,
|
| element.enclosingElement);
|
| } else if (element.isSetter) {
|
| - _addSuggestion(
|
| + _addElementSuggestion(
|
| element,
|
| CompletionSuggestionKind.SETTER,
|
| element.returnType,
|
| @@ -68,60 +67,12 @@ class ClassElementSuggestionBuilder extends GeneralizingElementVisitor {
|
| }
|
| }
|
|
|
| - void _addSuggestion(Element element, CompletionSuggestionKind kind,
|
| - DartType type, ClassElement enclosingElement) {
|
| - if (element.isSynthetic) {
|
| - return;
|
| - }
|
| - if (element.isPrivate) {
|
| - LibraryElement elementLibrary =
|
| - element.getAncestor((parent) => parent is LibraryElement);
|
| - LibraryElement unitLibrary =
|
| - request.unit.element.getAncestor((parent) => parent is LibraryElement);
|
| - if (elementLibrary != unitLibrary) {
|
| - return;
|
| - }
|
| - }
|
| - String completion = element.displayName;
|
| - if (completion == null ||
|
| - completion.length <= 0 ||
|
| - !_completions.add(completion)) {
|
| - return;
|
| - }
|
| - CompletionSuggestion suggestion = new CompletionSuggestion(
|
| - kind,
|
| - CompletionRelevance.DEFAULT,
|
| - completion,
|
| - completion.length,
|
| - 0,
|
| - element.isDeprecated,
|
| - false);
|
| - suggestion.element = newElement_fromEngine(element);
|
| - if (suggestion.element != null) {
|
| - if (element is FieldElement) {
|
| - suggestion.element.kind = protocol.ElementKind.GETTER;
|
| - suggestion.element.returnType =
|
| - element.type != null ? element.type.displayName : 'dynamic';
|
| - }
|
| - }
|
| - if (enclosingElement != null) {
|
| - suggestion.declaringType = enclosingElement.displayName;
|
| - }
|
| - if (type != null) {
|
| - String typeName = type.displayName;
|
| - if (typeName != null && typeName.length > 0 && typeName != 'dynamic') {
|
| - suggestion.returnType = typeName;
|
| - }
|
| - }
|
| - request.suggestions.add(suggestion);
|
| - }
|
| -
|
| /**
|
| * Add suggestions for the visible members in the given class
|
| */
|
| static void suggestionsFor(DartCompletionRequest request, Element element) {
|
| if (element is ClassElement) {
|
| - element.accept(new ClassElementSuggestionBuilder(request));
|
| + return element.accept(new ClassElementSuggestionBuilder(request));
|
| }
|
| }
|
| }
|
| @@ -192,3 +143,98 @@ class LibraryElementSuggestionBuilder extends GeneralizingElementVisitor {
|
| }
|
| }
|
| }
|
| +
|
| +/**
|
| + * This class visits elements in a class and provides suggestions based upon
|
| + * the visible named constructors in that class. Clients should call
|
| + * [NamedConstructorSuggestionBuilder.suggestionsFor].
|
| + */
|
| +class NamedConstructorSuggestionBuilder extends _AbstractSuggestionBuilder {
|
| +
|
| + NamedConstructorSuggestionBuilder(DartCompletionRequest request)
|
| + : super(request);
|
| +
|
| + @override
|
| + visitClassElement(ClassElement element) {
|
| + element.visitChildren(this);
|
| + }
|
| +
|
| + @override
|
| + visitConstructorElement(ConstructorElement element) {
|
| + _addElementSuggestion(
|
| + element,
|
| + CompletionSuggestionKind.CONSTRUCTOR,
|
| + element.returnType,
|
| + element.enclosingElement);
|
| + }
|
| +
|
| + @override
|
| + visitElement(Element element) {
|
| + // ignored
|
| + }
|
| +
|
| + /**
|
| + * Add suggestions for the visible members in the given class
|
| + */
|
| + static void suggestionsFor(DartCompletionRequest request, Element element) {
|
| + if (element is ClassElement) {
|
| + element.accept(new NamedConstructorSuggestionBuilder(request));
|
| + }
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Common superclass for sharing behavior
|
| + */
|
| +class _AbstractSuggestionBuilder extends GeneralizingElementVisitor {
|
| + final DartCompletionRequest request;
|
| + final Set<String> _completions = new Set<String>();
|
| +
|
| + _AbstractSuggestionBuilder(this.request);
|
| +
|
| + void _addElementSuggestion(Element element, CompletionSuggestionKind kind,
|
| + DartType type, ClassElement enclosingElement) {
|
| + if (element.isSynthetic) {
|
| + return;
|
| + }
|
| + if (element.isPrivate) {
|
| + LibraryElement elementLibrary = element.library;
|
| + LibraryElement unitLibrary = request.unit.element.library;
|
| + if (elementLibrary != unitLibrary) {
|
| + return;
|
| + }
|
| + }
|
| + String completion = element.displayName;
|
| + if (completion == null ||
|
| + completion.length <= 0 ||
|
| + !_completions.add(completion)) {
|
| + return;
|
| + }
|
| + CompletionSuggestion suggestion = new CompletionSuggestion(
|
| + kind,
|
| + CompletionRelevance.DEFAULT,
|
| + completion,
|
| + completion.length,
|
| + 0,
|
| + element.isDeprecated,
|
| + false);
|
| + suggestion.element = protocol.newElement_fromEngine(element);
|
| + if (suggestion.element != null) {
|
| + if (element is FieldElement) {
|
| + suggestion.element.kind = protocol.ElementKind.GETTER;
|
| + suggestion.element.returnType =
|
| + element.type != null ? element.type.displayName : 'dynamic';
|
| + }
|
| + }
|
| + if (enclosingElement != null) {
|
| + suggestion.declaringType = enclosingElement.displayName;
|
| + }
|
| + if (type != null) {
|
| + String typeName = type.displayName;
|
| + if (typeName != null && typeName.length > 0 && typeName != 'dynamic') {
|
| + suggestion.returnType = typeName;
|
| + }
|
| + }
|
| + request.suggestions.add(suggestion);
|
| + }
|
| +}
|
|
|