| Index: pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| index d9eb0a494c8f0e14e965c2b2656e97ebb63c8054..9c5e9ba5d5bb7fca3270ad7e74d6cbe2b25b335d 100644
|
| --- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| +++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
|
| @@ -87,6 +87,7 @@ class AssistProcessor {
|
| _addProposal_convertToIsNot_onIs();
|
| _addProposal_convertToIsNot_onNot();
|
| _addProposal_convertToIsNotEmpty();
|
| + _addProposal_convertToFieldParameter();
|
| _addProposal_convertToNormalParameter();
|
| _addProposal_encapsulateField();
|
| _addProposal_exchangeOperands();
|
| @@ -444,6 +445,93 @@ class AssistProcessor {
|
| _addAssist(DartAssistKind.CONVERT_INTO_EXPRESSION_BODY, []);
|
| }
|
|
|
| + void _addProposal_convertToFieldParameter() {
|
| + if (node == null) {
|
| + return;
|
| + }
|
| + // prepare ConstructorDeclaration
|
| + ConstructorDeclaration constructor =
|
| + node.getAncestor((node) => node is ConstructorDeclaration);
|
| + if (constructor == null) {
|
| + return;
|
| + }
|
| + FormalParameterList parameterList = constructor.parameters;
|
| + List<ConstructorInitializer> initializers = constructor.initializers;
|
| + // prepare parameter
|
| + SimpleFormalParameter parameter;
|
| + if (node.parent is SimpleFormalParameter &&
|
| + node.parent.parent is FormalParameterList &&
|
| + node.parent.parent.parent is ConstructorDeclaration) {
|
| + parameter = node.parent;
|
| + }
|
| + if (node is SimpleIdentifier &&
|
| + node.parent is ConstructorFieldInitializer) {
|
| + String name = (node as SimpleIdentifier).name;
|
| + ConstructorFieldInitializer initializer = node.parent;
|
| + if (initializer.expression == node) {
|
| + for (FormalParameter formalParameter in parameterList.parameters) {
|
| + if (formalParameter is SimpleFormalParameter &&
|
| + formalParameter.identifier.name == name) {
|
| + parameter = formalParameter;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + // analyze parameter
|
| + if (parameter != null) {
|
| + String parameterName = parameter.identifier.name;
|
| + ParameterElement parameterElement = parameter.element;
|
| + // check number of references
|
| + {
|
| + int numOfReferences = 0;
|
| + AstVisitor visitor = new _SimpleIdentifierRecursiveAstVisitor(
|
| + (SimpleIdentifier node) {
|
| + if (node.staticElement == parameterElement) {
|
| + numOfReferences++;
|
| + }
|
| + });
|
| + for (ConstructorInitializer initializer in initializers) {
|
| + initializer.accept(visitor);
|
| + }
|
| + if (numOfReferences != 1) {
|
| + return;
|
| + }
|
| + }
|
| + // find the field initializer
|
| + ConstructorFieldInitializer parameterInitializer;
|
| + for (ConstructorInitializer initializer in initializers) {
|
| + if (initializer is ConstructorFieldInitializer) {
|
| + Expression expression = initializer.expression;
|
| + if (expression is SimpleIdentifier &&
|
| + expression.name == parameterName) {
|
| + parameterInitializer = initializer;
|
| + }
|
| + }
|
| + }
|
| + if (parameterInitializer == null) {
|
| + return;
|
| + }
|
| + String fieldName = parameterInitializer.fieldName.name;
|
| + // replace parameter
|
| + _addReplaceEdit(rangeNode(parameter), 'this.$fieldName');
|
| + // remove initializer
|
| + int initializerIndex = initializers.indexOf(parameterInitializer);
|
| + if (initializers.length == 1) {
|
| + _addRemoveEdit(rangeEndEnd(parameterList, parameterInitializer));
|
| + } else {
|
| + if (initializerIndex == 0) {
|
| + ConstructorInitializer next = initializers[initializerIndex + 1];
|
| + _addRemoveEdit(rangeStartStart(parameterInitializer, next));
|
| + } else {
|
| + ConstructorInitializer prev = initializers[initializerIndex - 1];
|
| + _addRemoveEdit(rangeEndEnd(prev, parameterInitializer));
|
| + }
|
| + }
|
| + // add proposal
|
| + _addAssist(DartAssistKind.CONVERT_TO_FIELD_PARAMETER, []);
|
| + }
|
| + }
|
| +
|
| void _addProposal_convertToForIndexLoop() {
|
| // find enclosing ForEachStatement
|
| ForEachStatement forEachStatement =
|
|
|