Chromium Code Reviews| Index: pkg/analysis_server/lib/src/services/completion/imported_computer.dart |
| diff --git a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart |
| index 1094cee2a5ff376e242c1356fd9aaca98a00c435..3c0ffeaaef7049768491d13316317e759a5635e6 100644 |
| --- a/pkg/analysis_server/lib/src/services/completion/imported_computer.dart |
| +++ b/pkg/analysis_server/lib/src/services/completion/imported_computer.dart |
| @@ -6,7 +6,8 @@ library services.completion.computer.dart.toplevel; |
| import 'dart:async'; |
| -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:analysis_server/src/services/completion/suggestion_builder.dart'; |
| import 'package:analysis_server/src/services/search/search_engine.dart'; |
| @@ -51,27 +52,52 @@ class _ImportedVisitor extends GeneralizingAstVisitor<Future<bool>> { |
| } |
| @override |
| + Future<bool> visitCombinator(Combinator node) { |
| + return _addCombinatorSuggestions(node); |
| + } |
| + |
| + @override |
| + Future<bool> visitExpressionStatement(ExpressionStatement node) { |
| + Expression expression = node.expression; |
| + // A pre-variable declaration (e.g. C ^) is parsed as an expression |
| + // statement. Do not make suggestions for the variable name. |
|
scheglov
2014/10/07 18:15:45
Actually it would be nice to propose variable name
|
| + if (expression is SimpleIdentifier && request.offset <= expression.end) { |
| + return _addImportedElementSuggestions(); |
| + } |
| + return new Future.value(false); |
| + } |
| + |
| + @override |
| Future<bool> visitNode(AstNode node) { |
| return new Future.value(false); |
| } |
| @override |
| - Future<bool> visitSimpleIdentifier(SimpleIdentifier node) { |
| - AstNode parent = node.parent; |
| - if (parent is Combinator) { |
| - return _addCombinatorSuggestions(parent); |
| - } |
| - if (parent is ExpressionStatement) { |
| + Future<bool> visitPrefixedIdentifier(PrefixedIdentifier node) { |
| + // Make suggestions for the prefix, but not for the selector |
| + // InvocationComputer makes selector suggestions |
| + if (request.offset <= node.prefix.end) { |
| return _addImportedElementSuggestions(); |
| } |
| - if (parent is PrefixedIdentifier) { |
| - if (request.offset <= parent.prefix.end) { |
| - return _addImportedElementSuggestions(); |
| - } |
| + return new Future.value(false); |
| + } |
| + |
| + @override |
| + Future<bool> visitCascadeExpression(CascadeExpression node) { |
| + // Make suggestions for the target, but not for the selector |
| + // InvocationComputer makes selector suggestions |
| + Expression target = node.target; |
| + if (target != null && request.offset <= target.end) { |
| + return _addImportedElementSuggestions(); |
| } |
| return new Future.value(false); |
| } |
| + @override |
| + Future<bool> visitSimpleIdentifier(SimpleIdentifier node) { |
| + return node.parent.accept(this); |
| + } |
| + |
| Future _addCombinatorSuggestions(Combinator node) { |
| var directive = node.getAncestor((parent) => parent is NamespaceDirective); |
| if (directive is NamespaceDirective) { |
| @@ -83,6 +109,40 @@ class _ImportedVisitor extends GeneralizingAstVisitor<Future<bool>> { |
| return new Future.value(false); |
| } |
| + void _addElementSuggestion(Element element, CompletionRelevance relevance) { |
| + CompletionSuggestionKind kind = |
| + newCompletionSuggestionKind_fromElementKind(element.kind); |
| + |
| + String completion = element.displayName; |
| + CompletionSuggestion suggestion = new CompletionSuggestion( |
| + kind, |
| + relevance, |
| + completion, |
| + completion.length, |
| + 0, |
| + element.isDeprecated, |
| + false); |
| + |
| + suggestion.element = newElement_fromEngine(element); |
| + |
| + DartType type; |
| + if (element is FunctionElement) { |
| + type = element.returnType; |
| + } else if (element is PropertyAccessorElement && element.isGetter) { |
| + type = element.returnType; |
| + } else if (element is TopLevelVariableElement) { |
| + type = element.type; |
| + } |
| + if (type != null) { |
| + String name = type.displayName; |
| + if (name != null && name.length > 0 && name != 'dynamic') { |
| + suggestion.returnType = name; |
| + } |
| + } |
| + |
| + request.suggestions.add(suggestion); |
| + } |
| + |
| Future<bool> _addImportedElementSuggestions() { |
| // Exclude elements from local library |
| @@ -141,40 +201,6 @@ class _ImportedVisitor extends GeneralizingAstVisitor<Future<bool>> { |
| }); |
| } |
| - void _addElementSuggestion(Element element, CompletionRelevance relevance) { |
| - CompletionSuggestionKind kind = |
| - newCompletionSuggestionKind_fromElementKind(element.kind); |
| - |
| - String completion = element.displayName; |
| - CompletionSuggestion suggestion = new CompletionSuggestion( |
| - kind, |
| - relevance, |
| - completion, |
| - completion.length, |
| - 0, |
| - element.isDeprecated, |
| - false); |
| - |
| - suggestion.element = newElement_fromEngine(element); |
| - |
| - DartType type; |
| - if (element is FunctionElement) { |
| - type = element.returnType; |
| - } else if (element is PropertyAccessorElement && element.isGetter) { |
| - type = element.returnType; |
| - } else if (element is TopLevelVariableElement) { |
| - type = element.type; |
| - } |
| - if (type != null) { |
| - String name = type.displayName; |
| - if (name != null && name.length > 0 && name != 'dynamic') { |
| - suggestion.returnType = name; |
| - } |
| - } |
| - |
| - request.suggestions.add(suggestion); |
| - } |
| - |
| void _addLibraryPrefixSuggestion(ImportElement importElem) { |
| String completion = importElem.prefix.displayName; |
| if (completion != null && completion.length > 0) { |