| Index: pkg/analysis_server/lib/src/services/correction/fix_internal.dart
|
| diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
|
| index e00e4fd62811be4a2ea73804b3a810edff097f11..4a6b1f9fff3a5bc242b2be3ec54f0206cac89a70 100644
|
| --- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
|
| +++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
|
| @@ -132,9 +132,9 @@ class FixProcessor {
|
| errorLength = error.length;
|
| errorEnd = errorOffset + errorLength;
|
| errorRange = new SourceRange(errorOffset, errorLength);
|
| - node = new NodeLocator(errorOffset).searchWithin(unit);
|
| - coveredNode = new NodeLocator(errorOffset, errorOffset + errorLength)
|
| - .searchWithin(unit);
|
| + node = new NodeLocator2(errorOffset).searchWithin(unit);
|
| + coveredNode =
|
| + new NodeLocator2(errorOffset, errorEnd - 1).searchWithin(unit);
|
| // analyze ErrorCode
|
| ErrorCode errorCode = error.errorCode;
|
| if (errorCode == StaticWarningCode.UNDEFINED_CLASS_BOOLEAN) {
|
| @@ -380,68 +380,66 @@ class FixProcessor {
|
| }
|
|
|
| void _addFix_addMissingParameter() {
|
| - if (node is SimpleIdentifier && node.parent is MethodInvocation) {
|
| + if (node is ArgumentList && node.parent is MethodInvocation) {
|
| + ArgumentList argumentList = node;
|
| MethodInvocation invocation = node.parent;
|
| SimpleIdentifier methodName = invocation.methodName;
|
| - ArgumentList argumentList = invocation.argumentList;
|
| - if (methodName == node && argumentList != null) {
|
| - Element targetElement = methodName.bestElement;
|
| - List<Expression> arguments = argumentList.arguments;
|
| - if (targetElement is ExecutableElement) {
|
| - List<ParameterElement> parameters = targetElement.parameters;
|
| - int numParameters = parameters.length;
|
| - Iterable<ParameterElement> requiredParameters = parameters
|
| - .takeWhile((p) => p.parameterKind == ParameterKind.REQUIRED);
|
| - Iterable<ParameterElement> optionalParameters = parameters
|
| - .skipWhile((p) => p.parameterKind == ParameterKind.REQUIRED);
|
| - int numRequired = requiredParameters.length;
|
| - Expression argument = arguments[numRequired];
|
| - // prepare target
|
| - int targetOffset;
|
| - if (numRequired != 0) {
|
| - AstNode parameterNode = requiredParameters.last.computeNode();
|
| - targetOffset = parameterNode.end;
|
| + Element targetElement = methodName.bestElement;
|
| + List<Expression> arguments = argumentList.arguments;
|
| + if (targetElement is ExecutableElement) {
|
| + List<ParameterElement> parameters = targetElement.parameters;
|
| + int numParameters = parameters.length;
|
| + Iterable<ParameterElement> requiredParameters = parameters
|
| + .takeWhile((p) => p.parameterKind == ParameterKind.REQUIRED);
|
| + Iterable<ParameterElement> optionalParameters = parameters
|
| + .skipWhile((p) => p.parameterKind == ParameterKind.REQUIRED);
|
| + int numRequired = requiredParameters.length;
|
| + Expression argument = arguments[numRequired];
|
| + // prepare target
|
| + int targetOffset;
|
| + if (numRequired != 0) {
|
| + AstNode parameterNode = requiredParameters.last.computeNode();
|
| + targetOffset = parameterNode.end;
|
| + } else {
|
| + AstNode targetNode = targetElement.computeNode();
|
| + if (targetNode is FunctionDeclaration) {
|
| + FunctionExpression function = targetNode.functionExpression;
|
| + targetOffset = function.parameters.leftParenthesis.end;
|
| + } else if (targetNode is MethodDeclaration) {
|
| + targetOffset = targetNode.parameters.leftParenthesis.end;
|
| } else {
|
| - AstNode targetNode = targetElement.computeNode();
|
| - if (targetNode is FunctionDeclaration) {
|
| - FunctionExpression function = targetNode.functionExpression;
|
| - targetOffset = function.parameters.leftParenthesis.end;
|
| - } else if (targetNode is MethodDeclaration) {
|
| - targetOffset = targetNode.parameters.leftParenthesis.end;
|
| - } else {
|
| - return;
|
| - }
|
| + return;
|
| }
|
| - String targetFile = targetElement.source.fullName;
|
| - // required
|
| - {
|
| - SourceBuilder sb = new SourceBuilder(targetFile, targetOffset);
|
| - // append source
|
| - if (numRequired != 0) {
|
| - sb.append(', ');
|
| - }
|
| - _appendParameterForArgument(sb, numRequired, argument);
|
| - if (numRequired != numParameters) {
|
| - sb.append(', ');
|
| - }
|
| - // add proposal
|
| - _insertBuilder(sb, targetElement);
|
| - _addFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, []);
|
| + }
|
| + String targetFile = targetElement.source.fullName;
|
| + // required
|
| + {
|
| + SourceBuilder sb = new SourceBuilder(targetFile, targetOffset);
|
| + // append source
|
| + if (numRequired != 0) {
|
| + sb.append(', ');
|
| }
|
| - // optional positional
|
| - if (optionalParameters.isEmpty) {
|
| - SourceBuilder sb = new SourceBuilder(targetFile, targetOffset);
|
| - // append source
|
| - if (numRequired != 0) {
|
| - sb.append(', ');
|
| - }
|
| - sb.append('[');
|
| - _appendParameterForArgument(sb, numRequired, argument);
|
| - sb.append(']');
|
| - // add proposal
|
| - _insertBuilder(sb, targetElement);
|
| - _addFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL, []);
|
| + _appendParameterForArgument(sb, numRequired, argument);
|
| + if (numRequired != numParameters) {
|
| + sb.append(', ');
|
| + }
|
| + // add proposal
|
| + _insertBuilder(sb, targetElement);
|
| + _addFix(DartFixKind.ADD_MISSING_PARAMETER_REQUIRED, []);
|
| + }
|
| + // optional positional
|
| + if (optionalParameters.isEmpty) {
|
| + SourceBuilder sb = new SourceBuilder(targetFile, targetOffset);
|
| + // append source
|
| + if (numRequired != 0) {
|
| + sb.append(', ');
|
| }
|
| + sb.append('[');
|
| + _appendParameterForArgument(sb, numRequired, argument);
|
| + sb.append(']');
|
| + // add proposal
|
| + _insertBuilder(sb, targetElement);
|
| + _addFix(DartFixKind.ADD_MISSING_PARAMETER_POSITIONAL, []);
|
| }
|
| }
|
| }
|
| @@ -626,45 +624,26 @@ class FixProcessor {
|
| }
|
|
|
| void _addFix_createConstructor_insteadOfSyntheticDefault() {
|
| - TypeName typeName = null;
|
| - ConstructorName constructorName = null;
|
| - InstanceCreationExpression instanceCreation = null;
|
| - if (node is SimpleIdentifier) {
|
| - if (node.parent is TypeName) {
|
| - typeName = node.parent as TypeName;
|
| - if (typeName.name == node && typeName.parent is ConstructorName) {
|
| - constructorName = typeName.parent as ConstructorName;
|
| - // should be synthetic default constructor
|
| - {
|
| - ConstructorElement constructorElement =
|
| - constructorName.staticElement;
|
| - if (constructorElement == null ||
|
| - !constructorElement.isDefaultConstructor ||
|
| - !constructorElement.isSynthetic) {
|
| - return;
|
| - }
|
| - }
|
| - // prepare InstanceCreationExpression
|
| - if (constructorName.parent is InstanceCreationExpression) {
|
| - instanceCreation =
|
| - constructorName.parent as InstanceCreationExpression;
|
| - if (instanceCreation.constructorName != constructorName) {
|
| - return;
|
| - }
|
| - }
|
| - }
|
| - }
|
| + if (node is! ArgumentList) {
|
| + return;
|
| }
|
| - // do we have enough information?
|
| - if (instanceCreation == null) {
|
| + if (node.parent is! InstanceCreationExpression) {
|
| + return;
|
| + }
|
| + InstanceCreationExpression instanceCreation = node.parent;
|
| + ConstructorName constructorName = instanceCreation.constructorName;
|
| + // should be synthetic default constructor
|
| + ConstructorElement constructorElement = constructorName.staticElement;
|
| + if (constructorElement == null ||
|
| + !constructorElement.isDefaultConstructor ||
|
| + !constructorElement.isSynthetic) {
|
| return;
|
| }
|
| // prepare target
|
| - DartType targetType = typeName.type;
|
| - if (targetType is! InterfaceType) {
|
| + if (constructorElement.enclosingElement is! ClassElement) {
|
| return;
|
| }
|
| - ClassElement targetElement = targetType.element as ClassElement;
|
| + ClassElement targetElement = constructorElement.enclosingElement;
|
| String targetFile = targetElement.source.fullName;
|
| ClassDeclaration targetClass = getParsedClassElementNode(targetElement);
|
| _ConstructorLocation targetLocation =
|
| @@ -1618,11 +1597,12 @@ class FixProcessor {
|
| }
|
|
|
| void _addFix_removeParameters_inGetterDeclaration() {
|
| - if (node is SimpleIdentifier && node.parent is MethodDeclaration) {
|
| - MethodDeclaration method = node.parent as MethodDeclaration;
|
| + if (node is MethodDeclaration) {
|
| + MethodDeclaration method = node as MethodDeclaration;
|
| + SimpleIdentifier name = method.name;
|
| FunctionBody body = method.body;
|
| - if (method.name == node && body != null) {
|
| - _addReplaceEdit(rf.rangeEndStart(node, body), ' ');
|
| + if (name != null && body != null) {
|
| + _addReplaceEdit(rf.rangeEndStart(name, body), ' ');
|
| _addFix(DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION, []);
|
| }
|
| }
|
|
|