Chromium Code Reviews| 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 b664d7bad081d7bc0e531262a943b1e8589a28ed..a0b7b6f6eb7cfad38d9027d73bd52bbea5700ab9 100644 |
| --- a/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart |
| +++ b/pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart |
| @@ -4,7 +4,8 @@ |
| library services.completion.suggestion.builder; |
| -import 'package:analysis_server/src/protocol.dart' as protocol show Element, ElementKind; |
| +import 'package:analysis_server/src/protocol.dart' as protocol show Element, |
| + ElementKind; |
| import 'package:analysis_server/src/protocol.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 = new protocol.Element.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,100 @@ 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.getAncestor((parent) => parent is LibraryElement); |
|
scheglov
2014/10/06 21:36:14
element.library
danrubel
2014/10/07 12:42:01
Good suggestion. Done.
|
| + 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 = new protocol.Element.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); |
| + } |
| +} |