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

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

Issue 1500793003: rework ArgListContributor to use new task model (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: merge Created 5 years 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/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';
- }
-}

Powered by Google App Engine
This is Rietveld 408576698