OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library services.completion.contributor.dart.invocation; | 5 library services.completion.contributor.dart.invocation; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analysis_server/src/services/completion/dart_completion_manager.
dart'; | 9 import 'package:analysis_server/src/services/completion/dart_completion_manager.
dart'; |
10 import 'package:analysis_server/src/services/completion/local_declaration_visito
r.dart'; | 10 import 'package:analysis_server/src/services/completion/local_declaration_visito
r.dart'; |
11 import 'package:analysis_server/src/services/completion/local_suggestion_builder
.dart' | 11 import 'package:analysis_server/src/services/completion/local_suggestion_builder
.dart' |
12 hide createSuggestion; | 12 hide createSuggestion; |
13 import 'package:analysis_server/src/services/completion/optype.dart'; | 13 import 'package:analysis_server/src/services/completion/optype.dart'; |
14 import 'package:analysis_server/src/services/completion/suggestion_builder.dart'
; | 14 import 'package:analysis_server/src/services/completion/suggestion_builder.dart'
; |
15 import 'package:analysis_server/src/services/completion/suggestion_builder.dart' | 15 import 'package:analysis_server/src/services/completion/suggestion_builder.dart' |
16 show createSuggestion; | 16 show createSuggestion; |
17 import 'package:analyzer/src/generated/ast.dart'; | 17 import 'package:analyzer/src/generated/ast.dart'; |
18 import 'package:analyzer/src/generated/element.dart'; | 18 import 'package:analyzer/src/generated/element.dart'; |
19 | 19 |
20 import '../../protocol_server.dart' | 20 import '../../protocol_server.dart' |
21 show CompletionSuggestion, CompletionSuggestionKind; | 21 show CompletionSuggestion, CompletionSuggestionKind; |
22 import '../../protocol_server.dart' as protocol; | |
23 | 22 |
24 /** | 23 /** |
25 * A contributor for calculating invocation / access suggestions | 24 * A contributor for calculating invocation / access suggestions |
26 * `completion.getSuggestions` request results. | 25 * `completion.getSuggestions` request results. |
27 */ | 26 */ |
28 class PrefixedElementContributor extends DartCompletionContributor { | 27 class PrefixedElementContributor extends DartCompletionContributor { |
29 SuggestionBuilder builder; | 28 SuggestionBuilder builder; |
30 | 29 |
31 @override | 30 @override |
32 bool computeFast(DartCompletionRequest request) { | 31 bool computeFast(DartCompletionRequest request) { |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 final DartCompletionRequest request; | 102 final DartCompletionRequest request; |
104 | 103 |
105 _FieldFormalSuggestionBuilder(this.request); | 104 _FieldFormalSuggestionBuilder(this.request); |
106 | 105 |
107 @override | 106 @override |
108 bool computeFast(AstNode node) { | 107 bool computeFast(AstNode node) { |
109 if (node is FieldFormalParameter) { | 108 if (node is FieldFormalParameter) { |
110 ConstructorDeclaration constructorDecl = | 109 ConstructorDeclaration constructorDecl = |
111 node.getAncestor((p) => p is ConstructorDeclaration); | 110 node.getAncestor((p) => p is ConstructorDeclaration); |
112 if (constructorDecl != null) { | 111 if (constructorDecl != null) { |
113 | |
114 // Compute fields already referenced | 112 // Compute fields already referenced |
115 List<String> referencedFields = new List<String>(); | 113 List<String> referencedFields = new List<String>(); |
116 for (FormalParameter param in constructorDecl.parameters.parameters) { | 114 for (FormalParameter param in constructorDecl.parameters.parameters) { |
117 if (param is FieldFormalParameter) { | 115 if (param is FieldFormalParameter) { |
118 SimpleIdentifier fieldId = param.identifier; | 116 SimpleIdentifier fieldId = param.identifier; |
119 if (fieldId != null && fieldId != request.target.entity) { | 117 if (fieldId != null && fieldId != request.target.entity) { |
120 String fieldName = fieldId.name; | 118 String fieldName = fieldId.name; |
121 if (fieldName != null && fieldName.length > 0) { | 119 if (fieldName != null && fieldName.length > 0) { |
122 referencedFields.add(fieldName); | 120 referencedFields.add(fieldName); |
123 } | 121 } |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 SuggestionBuilder visitPropertyAccess(PropertyAccess node) { | 204 SuggestionBuilder visitPropertyAccess(PropertyAccess node) { |
207 return new _ExpressionSuggestionBuilder(request); | 205 return new _ExpressionSuggestionBuilder(request); |
208 } | 206 } |
209 } | 207 } |
210 | 208 |
211 /** | 209 /** |
212 * An [AstVisitor] which looks for a declaration with the given name | 210 * An [AstVisitor] which looks for a declaration with the given name |
213 * and if found, tries to determine a type for that declaration. | 211 * and if found, tries to determine a type for that declaration. |
214 */ | 212 */ |
215 class _LocalBestTypeVisitor extends LocalDeclarationVisitor { | 213 class _LocalBestTypeVisitor extends LocalDeclarationVisitor { |
216 | |
217 /** | 214 /** |
218 * The name for the declaration to be found. | 215 * The name for the declaration to be found. |
219 */ | 216 */ |
220 final String targetName; | 217 final String targetName; |
221 | 218 |
222 /** | 219 /** |
223 * The best type for the found declaration, | 220 * The best type for the found declaration, |
224 * or `null` if no declaration found or failed to determine a type. | 221 * or `null` if no declaration found or failed to determine a type. |
225 */ | 222 */ |
226 DartType typeFound; | 223 DartType typeFound; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 @override | 393 @override |
397 Future<bool> visitPrefixElement(PrefixElement element) { | 394 Future<bool> visitPrefixElement(PrefixElement element) { |
398 bool modified = false; | 395 bool modified = false; |
399 // Find the import directive with the given prefix | 396 // Find the import directive with the given prefix |
400 for (Directive directive in request.unit.directives) { | 397 for (Directive directive in request.unit.directives) { |
401 if (directive is ImportDirective) { | 398 if (directive is ImportDirective) { |
402 if (directive.prefix != null) { | 399 if (directive.prefix != null) { |
403 if (directive.prefix.name == element.name) { | 400 if (directive.prefix.name == element.name) { |
404 // Suggest elements from the imported library | 401 // Suggest elements from the imported library |
405 LibraryElement library = directive.uriElement; | 402 LibraryElement library = directive.uriElement; |
| 403 AstNode node = request.target.containingNode; |
| 404 bool typesOnly = node.parent is TypeName; |
| 405 bool instCreation = |
| 406 typesOnly && node.parent.parent is ConstructorName; |
406 LibraryElementSuggestionBuilder.suggestionsFor(request, | 407 LibraryElementSuggestionBuilder.suggestionsFor(request, |
407 CompletionSuggestionKind.INVOCATION, library, | 408 CompletionSuggestionKind.INVOCATION, library, typesOnly, |
408 request.target.containingNode.parent is TypeName); | 409 instCreation); |
409 modified = true; | 410 modified = true; |
410 if (directive.deferredKeyword != null) { | 411 if (directive.deferredKeyword != null) { |
411 FunctionElement loadLibFunct = library.loadLibraryFunction; | 412 FunctionElement loadLibFunct = library.loadLibraryFunction; |
412 request.addSuggestion(createSuggestion(loadLibFunct)); | 413 request.addSuggestion(createSuggestion(loadLibFunct)); |
413 } | 414 } |
414 } | 415 } |
415 } | 416 } |
416 } | 417 } |
417 } | 418 } |
418 return new Future.value(modified); | 419 return new Future.value(modified); |
(...skipping 10 matching lines...) Expand all Loading... |
429 } | 430 } |
430 return new Future.value(false); | 431 return new Future.value(false); |
431 } | 432 } |
432 | 433 |
433 @override | 434 @override |
434 Future<bool> visitVariableElement(VariableElement element) { | 435 Future<bool> visitVariableElement(VariableElement element) { |
435 InterfaceTypeSuggestionBuilder.suggestionsFor(request, element.type); | 436 InterfaceTypeSuggestionBuilder.suggestionsFor(request, element.type); |
436 return new Future.value(true); | 437 return new Future.value(true); |
437 } | 438 } |
438 } | 439 } |
OLD | NEW |