Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Unified Diff: pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart

Issue 634653002: add named constructor, cascade selector suggestions and more tests (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698