Index: pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart |
diff --git a/pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart |
deleted file mode 100644 |
index 69d00446ad64a5f845b87af36b10edb3c116fac2..0000000000000000000000000000000000000000 |
--- a/pkg/analysis_server/lib/src/services/completion/arglist_contributor.dart |
+++ /dev/null |
@@ -1,427 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library services.completion.contributor.dart.arglist; |
- |
-import 'dart:async'; |
- |
-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/local_declaration_visitor.dart'; |
-import 'package:analyzer/src/generated/ast.dart'; |
-import 'package:analyzer/src/generated/element.dart'; |
-import 'package:analyzer/src/generated/scanner.dart'; |
-import 'package:analyzer/src/generated/utilities_dart.dart'; |
- |
-void _addNamedParameterSuggestion( |
- DartCompletionRequest request, List<String> namedArgs, String name) { |
- if (name != null && name.length > 0 && !namedArgs.contains(name)) { |
- request.addSuggestion(new CompletionSuggestion( |
- CompletionSuggestionKind.NAMED_ARGUMENT, |
- DART_RELEVANCE_NAMED_PARAMETER, |
- '$name: ', |
- name.length + 2, |
- 0, |
- false, |
- false)); |
- } |
-} |
- |
-/** |
- * Determine the number of arguments. |
- */ |
-int _argCount(DartCompletionRequest request) { |
- AstNode node = request.target.containingNode; |
- if (node is ArgumentList) { |
- return node.arguments.length; |
- } |
- return 0; |
-} |
- |
-/** |
- * Determine if the completion target is at the end of the list of arguments. |
- */ |
-bool _isAppendingToArgList(DartCompletionRequest request) { |
- AstNode node = request.target.containingNode; |
- if (node is ArgumentList) { |
- var entity = request.target.entity; |
- if (entity == node.rightParenthesis) { |
- return true; |
- } |
- if (node.arguments.length > 0 && node.arguments.last == entity) { |
- return entity is SimpleIdentifier; |
- } |
- } |
- return false; |
-} |
- |
-/** |
- * Determine if the completion target is an emtpy argument list. |
- */ |
-bool _isEmptyArgList(DartCompletionRequest request) { |
- AstNode node = request.target.containingNode; |
- return node is ArgumentList && |
- node.leftParenthesis.next == node.rightParenthesis; |
-} |
- |
-/** |
- * Return a collection of currently specified named arguments |
- */ |
-Iterable<String> _namedArgs(DartCompletionRequest request) { |
- AstNode node = request.target.containingNode; |
- List<String> namedArgs = new List<String>(); |
- if (node is ArgumentList) { |
- for (Expression arg in node.arguments) { |
- if (arg is NamedExpression) { |
- namedArgs.add(arg.name.label.name); |
- } |
- } |
- } |
- return namedArgs; |
-} |
- |
-/** |
- * A contributor for calculating `completion.getSuggestions` request results |
- * when the cursor position is inside the arguments to a method call. |
- */ |
-class ArgListContributor extends DartCompletionContributor { |
- _ArgSuggestionBuilder builder; |
- |
- @override |
- bool computeFast(DartCompletionRequest request) { |
- builder = |
- request.target.containingNode.accept(new _ArgListAstVisitor(request)); |
- return builder == null; |
- } |
- |
- @override |
- Future<bool> computeFull(DartCompletionRequest request) { |
- if (builder != null) { |
- return builder.compute(request.target.containingNode); |
- } |
- return new Future.value(false); |
- } |
-} |
- |
-/** |
- * A visitor for determining whether an argument list suggestion is needed |
- * and instantiating the builder to create the suggestion. |
- */ |
-class _ArgListAstVisitor extends GeneralizingAstVisitor<_ArgSuggestionBuilder> { |
- final DartCompletionRequest request; |
- |
- _ArgListAstVisitor(this.request); |
- |
- @override |
- _ArgSuggestionBuilder visitArgumentList(ArgumentList node) { |
- Token leftParen = node.leftParenthesis; |
- if (leftParen != null && request.offset > leftParen.offset) { |
- AstNode parent = node.parent; |
- if (parent is MethodInvocation) { |
- SimpleIdentifier selector = parent.methodName; |
- if (selector != null) { |
- String name = selector.name; |
- if (name != null && name.length > 0) { |
- if (parent.operator == null) { |
- /* |
- * If a local declaration is found, then return null |
- * indicating that suggestions were added |
- * and no further action is necessary |
- */ |
- if (new _LocalArgSuggestionBuilder(request, request.offset, name) |
- .visit(node)) { |
- return null; |
- } |
- } else { |
- // determine target |
- } |
- return new _ArgSuggestionBuilder(request, name); |
- } |
- } |
- } |
- String constructorName; |
- if (parent is Annotation && parent.name != null) { |
- constructorName = parent.name.toSource(); |
- } |
- if (parent is InstanceCreationExpression && |
- parent.constructorName != null) { |
- constructorName = parent.constructorName.toSource(); |
- } |
- if (constructorName != null && constructorName.length > 0) { |
- if (new _LocalArgSuggestionBuilder( |
- request, request.offset, constructorName).visit(node)) { |
- return null; |
- } |
- return new _ArgSuggestionBuilder(request, constructorName); |
- } |
- } |
- return null; |
- } |
- |
- @override |
- _ArgSuggestionBuilder visitNode(AstNode node) { |
- return null; |
- } |
-} |
- |
-/** |
- * A [_ArgSuggestionBuilder] determines which method or function is being |
- * invoked, then builds the argument list suggestion. |
- * This operation is instantiated during `computeFast` |
- * and calculates the suggestions during `computeFull`. |
- */ |
-class _ArgSuggestionBuilder { |
- final DartCompletionRequest request; |
- final String methodName; |
- |
- _ArgSuggestionBuilder(this.request, this.methodName); |
- |
- Future<bool> compute(ArgumentList node) { |
- AstNode parent = node.parent; |
- if (parent is MethodInvocation) { |
- SimpleIdentifier methodName = parent.methodName; |
- if (methodName != null) { |
- Element methodElem = methodName.bestElement; |
- if (methodElem is ExecutableElement) { |
- _addSuggestions(methodElem.parameters); |
- } |
- } |
- } |
- if (parent is InstanceCreationExpression) { |
- ConstructorName constructorName = parent.constructorName; |
- if (constructorName != null) { |
- ConstructorElement element = constructorName.staticElement; |
- if (element is ExecutableElement) { |
- _addSuggestions(element.parameters); |
- } |
- } |
- } |
- if (parent is Annotation) { |
- Element element = parent.element; |
- if (element is ExecutableElement) { |
- _addSuggestions(element.parameters); |
- } |
- } |
- return new Future.value(false); |
- } |
- |
- void _addArgListSuggestion(Iterable<ParameterElement> requiredParam) { |
- StringBuffer completion = new StringBuffer('('); |
- List<String> paramNames = new List<String>(); |
- List<String> paramTypes = new List<String>(); |
- for (ParameterElement param in requiredParam) { |
- String name = param.name; |
- if (name != null && name.length > 0) { |
- if (completion.length > 1) { |
- completion.write(', '); |
- } |
- completion.write(name); |
- paramNames.add(name); |
- paramTypes.add(_getParamType(param)); |
- } |
- } |
- completion.write(')'); |
- CompletionSuggestion suggestion = new CompletionSuggestion( |
- CompletionSuggestionKind.ARGUMENT_LIST, |
- DART_RELEVANCE_HIGH, |
- completion.toString(), |
- completion.length, |
- 0, |
- false, |
- false); |
- suggestion.parameterNames = paramNames; |
- suggestion.parameterTypes = paramTypes; |
- request.addSuggestion(suggestion); |
- } |
- |
- void _addDefaultParamSuggestions(Iterable<ParameterElement> parameters) { |
- Iterable<String> namedArgs = _namedArgs(request); |
- for (ParameterElement param in parameters) { |
- if (param.parameterKind == ParameterKind.NAMED) { |
- _addNamedParameterSuggestion(request, namedArgs, param.name); |
- } |
- } |
- } |
- |
- void _addSuggestions(Iterable<ParameterElement> parameters) { |
- if (parameters == null || parameters.length == 0) { |
- return; |
- } |
- Iterable<ParameterElement> requiredParam = parameters.where( |
- (ParameterElement p) => p.parameterKind == ParameterKind.REQUIRED); |
- int requiredCount = requiredParam.length; |
- if (requiredCount > 0 && _isEmptyArgList(request)) { |
- _addArgListSuggestion(requiredParam); |
- return; |
- } |
- if (_isAppendingToArgList(request)) { |
- if (requiredCount == 0 || requiredCount < _argCount(request)) { |
- _addDefaultParamSuggestions(parameters); |
- } |
- } |
- } |
- |
- String _getParamType(ParameterElement param) { |
- DartType type = param.type; |
- if (type != null) { |
- return type.displayName; |
- } |
- return 'dynamic'; |
- } |
-} |
- |
-/** |
- * [_LocalArgSuggestionBuilder] visits an [AstNode] and its parent recursively |
- * looking for a matching declaration. If found, it adds the appropriate |
- * suggestions and sets finished to `true`. |
- */ |
-class _LocalArgSuggestionBuilder extends LocalDeclarationVisitor { |
- final DartCompletionRequest request; |
- final String name; |
- |
- _LocalArgSuggestionBuilder(this.request, int offset, this.name) |
- : super(offset); |
- |
- @override |
- void declaredClass(ClassDeclaration declaration) { |
- String className = null; |
- if (declaration.name != null) { |
- className = declaration.name.name; |
- } |
- if (className != null && className.length > 0) { |
- for (ClassMember member in declaration.members) { |
- if (member is ConstructorDeclaration) { |
- String selector = className; |
- if (member.name != null) { |
- selector = '$selector.${member.name.name}'; |
- } |
- if (selector == name) { |
- _addSuggestions(member.parameters); |
- finished(); |
- } |
- } |
- } |
- } |
- } |
- |
- @override |
- void declaredClassTypeAlias(ClassTypeAlias declaration) {} |
- |
- @override |
- void declaredField(FieldDeclaration fieldDecl, VariableDeclaration varDecl) {} |
- |
- @override |
- void declaredFunction(FunctionDeclaration declaration) { |
- SimpleIdentifier selector = declaration.name; |
- if (selector != null && name == selector.name) { |
- _addSuggestions(declaration.functionExpression.parameters); |
- finished(); |
- } |
- } |
- |
- @override |
- void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {} |
- |
- @override |
- void declaredLabel(Label label, bool isCaseLabel) {} |
- |
- @override |
- void declaredLocalVar(SimpleIdentifier name, TypeName type) {} |
- |
- @override |
- void declaredMethod(MethodDeclaration declaration) { |
- SimpleIdentifier selector = declaration.name; |
- if (selector != null && name == selector.name) { |
- _addSuggestions(declaration.parameters); |
- finished(); |
- } |
- } |
- |
- @override |
- void declaredParam(SimpleIdentifier name, TypeName type) {} |
- |
- @override |
- void declaredTopLevelVar( |
- VariableDeclarationList varList, VariableDeclaration varDecl) {} |
- |
- void _addArgListSuggestion(Iterable<FormalParameter> requiredParam) { |
- StringBuffer completion = new StringBuffer('('); |
- List<String> paramNames = new List<String>(); |
- List<String> paramTypes = new List<String>(); |
- for (FormalParameter param in requiredParam) { |
- SimpleIdentifier paramId = param.identifier; |
- if (paramId != null) { |
- String name = paramId.name; |
- if (name != null && name.length > 0) { |
- if (completion.length > 1) { |
- completion.write(', '); |
- } |
- completion.write(name); |
- paramNames.add(name); |
- paramTypes.add(_getParamType(param)); |
- } |
- } |
- } |
- completion.write(')'); |
- CompletionSuggestion suggestion = new CompletionSuggestion( |
- CompletionSuggestionKind.ARGUMENT_LIST, |
- DART_RELEVANCE_HIGH, |
- completion.toString(), |
- completion.length, |
- 0, |
- false, |
- false); |
- suggestion.parameterNames = paramNames; |
- suggestion.parameterTypes = paramTypes; |
- request.addSuggestion(suggestion); |
- } |
- |
- void _addDefaultParamSuggestions(FormalParameterList parameters) { |
- Iterable<String> namedArgs = _namedArgs(request); |
- for (FormalParameter param in parameters.parameters) { |
- if (param.kind == ParameterKind.NAMED) { |
- SimpleIdentifier paramId = param.identifier; |
- if (paramId != null) { |
- _addNamedParameterSuggestion(request, namedArgs, paramId.name); |
- } |
- } |
- } |
- } |
- |
- void _addSuggestions(FormalParameterList parameters) { |
- if (parameters == null || parameters.parameters.length == 0) { |
- return; |
- } |
- Iterable<FormalParameter> requiredParam = parameters.parameters |
- .where((FormalParameter p) => p.kind == ParameterKind.REQUIRED); |
- int requiredCount = requiredParam.length; |
- if (requiredCount > 0 && _isEmptyArgList(request)) { |
- _addArgListSuggestion(requiredParam); |
- return; |
- } |
- if (_isAppendingToArgList(request)) { |
- if (requiredCount == 0 || requiredCount < _argCount(request)) { |
- _addDefaultParamSuggestions(parameters); |
- } |
- } |
- } |
- |
- String _getParamType(FormalParameter param) { |
- TypeName type; |
- if (param is SimpleFormalParameter) { |
- type = param.type; |
- } |
- if (type != null) { |
- Identifier id = type.name; |
- if (id != null) { |
- String name = id.name; |
- if (name != null && name.length > 0) { |
- return name; |
- } |
- } |
- } |
- return 'dynamic'; |
- } |
-} |