| 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:collection'; | 6 import 'dart:collection'; |
| 7 import 'dart:core'; | 7 import 'dart:core'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/edit/fix/fix_core.dart'; | 9 import 'package:analysis_server/plugin/edit/fix/fix_core.dart'; |
| 10 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart'; | 10 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart'; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 GetTopLevelDeclarations getTopLevelDeclarations; | 99 GetTopLevelDeclarations getTopLevelDeclarations; |
| 100 CompilationUnit unit; | 100 CompilationUnit unit; |
| 101 AnalysisError error; | 101 AnalysisError error; |
| 102 | 102 |
| 103 /** | 103 /** |
| 104 * The analysis driver being used to perform analysis. | 104 * The analysis driver being used to perform analysis. |
| 105 */ | 105 */ |
| 106 AnalysisDriver driver; | 106 AnalysisDriver driver; |
| 107 | 107 |
| 108 String file; | 108 String file; |
| 109 int fileStamp; | |
| 110 CompilationUnitElement unitElement; | 109 CompilationUnitElement unitElement; |
| 111 Source unitSource; | 110 Source unitSource; |
| 112 LibraryElement unitLibraryElement; | 111 LibraryElement unitLibraryElement; |
| 113 File unitLibraryFile; | 112 File unitLibraryFile; |
| 114 Folder unitLibraryFolder; | 113 Folder unitLibraryFolder; |
| 115 | 114 |
| 116 final List<Fix> fixes = <Fix>[]; | 115 final List<Fix> fixes = <Fix>[]; |
| 117 | 116 |
| 118 CorrectionUtils utils; | 117 CorrectionUtils utils; |
| 119 int errorOffset; | 118 int errorOffset; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 130 resourceProvider = dartContext.resourceProvider; | 129 resourceProvider = dartContext.resourceProvider; |
| 131 astProvider = dartContext.astProvider; | 130 astProvider = dartContext.astProvider; |
| 132 getTopLevelDeclarations = dartContext.getTopLevelDeclarations; | 131 getTopLevelDeclarations = dartContext.getTopLevelDeclarations; |
| 133 driver = dartContext.analysisDriver; | 132 driver = dartContext.analysisDriver; |
| 134 // unit | 133 // unit |
| 135 unit = dartContext.unit; | 134 unit = dartContext.unit; |
| 136 unitElement = unit.element; | 135 unitElement = unit.element; |
| 137 unitSource = unitElement.source; | 136 unitSource = unitElement.source; |
| 138 // file | 137 // file |
| 139 file = unitSource.fullName; | 138 file = unitSource.fullName; |
| 140 fileStamp = _modificationStamp(file); | |
| 141 // library | 139 // library |
| 142 unitLibraryElement = unitElement.library; | 140 unitLibraryElement = unitElement.library; |
| 143 String unitLibraryPath = unitLibraryElement.source.fullName; | 141 String unitLibraryPath = unitLibraryElement.source.fullName; |
| 144 unitLibraryFile = resourceProvider.getFile(unitLibraryPath); | 142 unitLibraryFile = resourceProvider.getFile(unitLibraryPath); |
| 145 unitLibraryFolder = unitLibraryFile.parent; | 143 unitLibraryFolder = unitLibraryFile.parent; |
| 146 // error | 144 // error |
| 147 error = dartContext.error; | 145 error = dartContext.error; |
| 148 } | 146 } |
| 149 | 147 |
| 150 DartType get coreTypeBool => _getCoreType('bool'); | 148 DartType get coreTypeBool => _getCoreType('bool'); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 166 if (driver.analysisOptions.strongMode) { | 164 if (driver.analysisOptions.strongMode) { |
| 167 _typeSystem = new StrongTypeSystemImpl(typeProvider); | 165 _typeSystem = new StrongTypeSystemImpl(typeProvider); |
| 168 } else { | 166 } else { |
| 169 _typeSystem = new TypeSystemImpl(typeProvider); | 167 _typeSystem = new TypeSystemImpl(typeProvider); |
| 170 } | 168 } |
| 171 } | 169 } |
| 172 return _typeSystem; | 170 return _typeSystem; |
| 173 } | 171 } |
| 174 | 172 |
| 175 Future<List<Fix>> compute() async { | 173 Future<List<Fix>> compute() async { |
| 176 // If the source was changed between the constructor and running | |
| 177 // this asynchronous method, it is not safe to use the unit. | |
| 178 if (_modificationStamp(unitSource.fullName) != fileStamp) { | |
| 179 return const <Fix>[]; | |
| 180 } | |
| 181 | |
| 182 try { | 174 try { |
| 183 utils = new CorrectionUtils(unit); | 175 utils = new CorrectionUtils(unit); |
| 184 } catch (e) { | 176 } catch (e) { |
| 185 throw new CancelCorrectionException(exception: e); | 177 throw new CancelCorrectionException(exception: e); |
| 186 } | 178 } |
| 187 | 179 |
| 188 errorOffset = error.offset; | 180 errorOffset = error.offset; |
| 189 errorLength = error.length; | 181 errorLength = error.length; |
| 190 errorEnd = errorOffset + errorLength; | 182 errorEnd = errorOffset + errorLength; |
| 191 errorRange = new SourceRange(errorOffset, errorLength); | 183 errorRange = new SourceRange(errorOffset, errorLength); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 } | 440 } |
| 449 | 441 |
| 450 /** | 442 /** |
| 451 * Returns `true` if the `async` proposal was added. | 443 * Returns `true` if the `async` proposal was added. |
| 452 */ | 444 */ |
| 453 Future<Null> _addFix_addAsync() async { | 445 Future<Null> _addFix_addAsync() async { |
| 454 FunctionBody body = node.getAncestor((n) => n is FunctionBody); | 446 FunctionBody body = node.getAncestor((n) => n is FunctionBody); |
| 455 if (body != null && body.keyword == null) { | 447 if (body != null && body.keyword == null) { |
| 456 TypeProvider typeProvider = await this.typeProvider; | 448 TypeProvider typeProvider = await this.typeProvider; |
| 457 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 449 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 458 await changeBuilder.addFileEdit(file, fileStamp, | 450 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 459 (DartFileEditBuilder builder) { | |
| 460 builder.convertFunctionFromSyncToAsync(body, typeProvider); | 451 builder.convertFunctionFromSyncToAsync(body, typeProvider); |
| 461 }); | 452 }); |
| 462 _addFixFromBuilder(changeBuilder, DartFixKind.ADD_ASYNC); | 453 _addFixFromBuilder(changeBuilder, DartFixKind.ADD_ASYNC); |
| 463 } | 454 } |
| 464 } | 455 } |
| 465 | 456 |
| 466 Future<Null> _addFix_addMissingMethodCall() async { | 457 Future<Null> _addFix_addMissingMethodCall() async { |
| 467 ClassDeclaration targetClass = node.parent as ClassDeclaration; | 458 ClassDeclaration targetClass = node.parent as ClassDeclaration; |
| 468 int insertOffset = targetClass.end - 1; | 459 int insertOffset = targetClass.end - 1; |
| 469 // prepare environment | 460 // prepare environment |
| 470 String prefix = utils.getIndent(1); | 461 String prefix = utils.getIndent(1); |
| 471 String prefix2 = utils.getIndent(2); | 462 String prefix2 = utils.getIndent(2); |
| 472 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 463 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 473 await changeBuilder.addFileEdit(file, fileStamp, | 464 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 474 (DartFileEditBuilder builder) { | |
| 475 builder.addInsertion(insertOffset, (DartEditBuilder builder) { | 465 builder.addInsertion(insertOffset, (DartEditBuilder builder) { |
| 476 builder.selectHere(); | 466 builder.selectHere(); |
| 477 builder.write(prefix); | 467 builder.write(prefix); |
| 478 builder.write('call() {'); | 468 builder.write('call() {'); |
| 479 // TO-DO | 469 // TO-DO |
| 480 builder.write(eol); | 470 builder.write(eol); |
| 481 builder.write(prefix2); | 471 builder.write(prefix2); |
| 482 builder.write('// TODO: implement call'); | 472 builder.write('// TODO: implement call'); |
| 483 builder.write(eol); | 473 builder.write(eol); |
| 484 // close method | 474 // close method |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 return; | 527 return; |
| 538 } | 528 } |
| 539 targetOffset = paren.end; | 529 targetOffset = paren.end; |
| 540 } else { | 530 } else { |
| 541 return; | 531 return; |
| 542 } | 532 } |
| 543 } | 533 } |
| 544 Source targetSource = targetElement.source; | 534 Source targetSource = targetElement.source; |
| 545 String targetFile = targetSource.fullName; | 535 String targetFile = targetSource.fullName; |
| 546 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 536 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 547 await changeBuilder | 537 await changeBuilder.addFileEdit(targetFile, |
| 548 .addFileEdit(targetFile, targetSource.modificationStamp, | 538 (DartFileEditBuilder builder) { |
| 549 (DartFileEditBuilder builder) { | |
| 550 builder.addInsertion(targetOffset, (DartEditBuilder builder) { | 539 builder.addInsertion(targetOffset, (DartEditBuilder builder) { |
| 551 if (numRequired != 0) { | 540 if (numRequired != 0) { |
| 552 builder.write(', '); | 541 builder.write(', '); |
| 553 } | 542 } |
| 554 builder.writeParameterMatchingArgument( | 543 builder.writeParameterMatchingArgument( |
| 555 argument, numRequired, new Set<String>()); | 544 argument, numRequired, new Set<String>()); |
| 556 if (numRequired != numParameters) { | 545 if (numRequired != numParameters) { |
| 557 builder.write(', '); | 546 builder.write(', '); |
| 558 } | 547 } |
| 559 }); | 548 }); |
| 560 }); | 549 }); |
| 561 _addFixFromBuilder( | 550 _addFixFromBuilder( |
| 562 changeBuilder, DartFixKind.ADD_MISSING_PARAMETER_REQUIRED); | 551 changeBuilder, DartFixKind.ADD_MISSING_PARAMETER_REQUIRED); |
| 563 if (optionalParameters.isEmpty) { | 552 if (optionalParameters.isEmpty) { |
| 564 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 553 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 565 await changeBuilder | 554 await changeBuilder.addFileEdit(targetFile, |
| 566 .addFileEdit(targetFile, targetSource.modificationStamp, | 555 (DartFileEditBuilder builder) { |
| 567 (DartFileEditBuilder builder) { | |
| 568 builder.addInsertion(targetOffset, (DartEditBuilder builder) { | 556 builder.addInsertion(targetOffset, (DartEditBuilder builder) { |
| 569 if (numRequired != 0) { | 557 if (numRequired != 0) { |
| 570 builder.write(', '); | 558 builder.write(', '); |
| 571 } | 559 } |
| 572 builder.write('['); | 560 builder.write('['); |
| 573 builder.writeParameterMatchingArgument( | 561 builder.writeParameterMatchingArgument( |
| 574 argument, numRequired, new Set<String>()); | 562 argument, numRequired, new Set<String>()); |
| 575 builder.write(']'); | 563 builder.write(']'); |
| 576 }); | 564 }); |
| 577 }); | 565 }); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 607 if (parts.length < 2) { | 595 if (parts.length < 2) { |
| 608 return; | 596 return; |
| 609 } | 597 } |
| 610 | 598 |
| 611 // add proposal | 599 // add proposal |
| 612 String paramName = parts[1]; | 600 String paramName = parts[1]; |
| 613 final List<Expression> args = argumentList.arguments; | 601 final List<Expression> args = argumentList.arguments; |
| 614 int offset = | 602 int offset = |
| 615 args.isEmpty ? argumentList.leftParenthesis.end : args.last.end; | 603 args.isEmpty ? argumentList.leftParenthesis.end : args.last.end; |
| 616 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 604 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 617 await changeBuilder.addFileEdit(file, fileStamp, | 605 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 618 (DartFileEditBuilder builder) { | |
| 619 builder.addInsertion(offset, (DartEditBuilder builder) { | 606 builder.addInsertion(offset, (DartEditBuilder builder) { |
| 620 if (args.isNotEmpty) { | 607 if (args.isNotEmpty) { |
| 621 builder.write(', '); | 608 builder.write(', '); |
| 622 } | 609 } |
| 623 List<ParameterElement> parameters = | 610 List<ParameterElement> parameters = |
| 624 (targetElement as ExecutableElement).parameters; | 611 (targetElement as ExecutableElement).parameters; |
| 625 ParameterElement element = parameters | 612 ParameterElement element = parameters |
| 626 .firstWhere((p) => p.name == paramName, orElse: () => null); | 613 .firstWhere((p) => p.name == paramName, orElse: () => null); |
| 627 String defaultValue = getDefaultStringParameterValue(element); | 614 String defaultValue = getDefaultStringParameterValue(element); |
| 628 builder.write('$paramName: $defaultValue'); | 615 builder.write('$paramName: $defaultValue'); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 649 | 636 |
| 650 // Handle doc comments. | 637 // Handle doc comments. |
| 651 Token token = member.beginToken; | 638 Token token = member.beginToken; |
| 652 if (token is CommentToken) { | 639 if (token is CommentToken) { |
| 653 token = (token as CommentToken).parent; | 640 token = (token as CommentToken).parent; |
| 654 } | 641 } |
| 655 | 642 |
| 656 Position exitPosition = new Position(file, token.offset - 1); | 643 Position exitPosition = new Position(file, token.offset - 1); |
| 657 String indent = utils.getIndent(1); | 644 String indent = utils.getIndent(1); |
| 658 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 645 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 659 await changeBuilder.addFileEdit(file, fileStamp, | 646 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 660 (DartFileEditBuilder builder) { | |
| 661 builder.addSimpleReplacement( | 647 builder.addSimpleReplacement( |
| 662 range.startLength(token, 0), '@override$eol$indent'); | 648 range.startLength(token, 0), '@override$eol$indent'); |
| 663 }); | 649 }); |
| 664 changeBuilder.setSelection(exitPosition); | 650 changeBuilder.setSelection(exitPosition); |
| 665 _addFixFromBuilder(changeBuilder, DartFixKind.LINT_ADD_OVERRIDE); | 651 _addFixFromBuilder(changeBuilder, DartFixKind.LINT_ADD_OVERRIDE); |
| 666 } | 652 } |
| 667 | 653 |
| 668 Future<Null> _addFix_boolInsteadOfBoolean() async { | 654 Future<Null> _addFix_boolInsteadOfBoolean() async { |
| 669 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 655 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 670 await changeBuilder.addFileEdit(file, fileStamp, | 656 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 671 (DartFileEditBuilder builder) { | |
| 672 builder.addSimpleReplacement(range.error(error), 'bool'); | 657 builder.addSimpleReplacement(range.error(error), 'bool'); |
| 673 }); | 658 }); |
| 674 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_BOOLEAN_WITH_BOOL); | 659 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_BOOLEAN_WITH_BOOL); |
| 675 } | 660 } |
| 676 | 661 |
| 677 Future<Null> _addFix_canBeNullAfterNullAware() async { | 662 Future<Null> _addFix_canBeNullAfterNullAware() async { |
| 678 AstNode node = coveredNode; | 663 AstNode node = coveredNode; |
| 679 if (node is Expression) { | 664 if (node is Expression) { |
| 680 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 665 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 681 await changeBuilder.addFileEdit(file, fileStamp, | 666 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 682 (DartFileEditBuilder builder) { | |
| 683 AstNode parent = node.parent; | 667 AstNode parent = node.parent; |
| 684 while (parent != null) { | 668 while (parent != null) { |
| 685 if (parent is MethodInvocation && parent.target == node) { | 669 if (parent is MethodInvocation && parent.target == node) { |
| 686 builder.addSimpleReplacement(range.token(parent.operator), '?.'); | 670 builder.addSimpleReplacement(range.token(parent.operator), '?.'); |
| 687 } else if (parent is PropertyAccess && parent.target == node) { | 671 } else if (parent is PropertyAccess && parent.target == node) { |
| 688 builder.addSimpleReplacement(range.token(parent.operator), '?.'); | 672 builder.addSimpleReplacement(range.token(parent.operator), '?.'); |
| 689 } else { | 673 } else { |
| 690 break; | 674 break; |
| 691 } | 675 } |
| 692 node = parent; | 676 node = parent; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 703 declaration.initializer == coveredNode) { | 687 declaration.initializer == coveredNode) { |
| 704 AstNode variableList = declaration.parent; | 688 AstNode variableList = declaration.parent; |
| 705 if (variableList is VariableDeclarationList && | 689 if (variableList is VariableDeclarationList && |
| 706 variableList.variables.length == 1) { | 690 variableList.variables.length == 1) { |
| 707 TypeAnnotation typeNode = variableList.type; | 691 TypeAnnotation typeNode = variableList.type; |
| 708 if (typeNode != null) { | 692 if (typeNode != null) { |
| 709 Expression initializer = coveredNode; | 693 Expression initializer = coveredNode; |
| 710 DartType newType = initializer.bestType; | 694 DartType newType = initializer.bestType; |
| 711 if (newType is InterfaceType || newType is FunctionType) { | 695 if (newType is InterfaceType || newType is FunctionType) { |
| 712 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 696 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 713 await changeBuilder.addFileEdit(file, fileStamp, | 697 await changeBuilder.addFileEdit(file, |
| 714 (DartFileEditBuilder builder) { | 698 (DartFileEditBuilder builder) { |
| 715 builder.addReplacement(range.node(typeNode), | 699 builder.addReplacement(range.node(typeNode), |
| 716 (DartEditBuilder builder) { | 700 (DartEditBuilder builder) { |
| 717 builder.writeType(newType); | 701 builder.writeType(newType); |
| 718 }); | 702 }); |
| 719 }); | 703 }); |
| 720 _addFixFromBuilder( | 704 _addFixFromBuilder( |
| 721 changeBuilder, DartFixKind.CHANGE_TYPE_ANNOTATION, args: [ | 705 changeBuilder, DartFixKind.CHANGE_TYPE_ANNOTATION, args: [ |
| 722 resolutionMap.typeForTypeName(typeNode), | 706 resolutionMap.typeForTypeName(typeNode), |
| 723 newType.displayName | 707 newType.displayName |
| 724 ]); | 708 ]); |
| 725 } | 709 } |
| 726 } | 710 } |
| 727 } | 711 } |
| 728 } | 712 } |
| 729 } | 713 } |
| 730 | 714 |
| 731 Future<Null> _addFix_convertFlutterChild() async { | 715 Future<Null> _addFix_convertFlutterChild() async { |
| 732 NamedExpression namedExp = findFlutterNamedExpression(node, 'child'); | 716 NamedExpression namedExp = findFlutterNamedExpression(node, 'child'); |
| 733 if (namedExp == null) { | 717 if (namedExp == null) { |
| 734 return; | 718 return; |
| 735 } | 719 } |
| 736 InstanceCreationExpression childArg = getChildWidget(namedExp, false); | 720 InstanceCreationExpression childArg = getChildWidget(namedExp, false); |
| 737 if (childArg != null) { | 721 if (childArg != null) { |
| 738 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 722 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 739 await changeBuilder.addFileEdit(file, fileStamp, | 723 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 740 (DartFileEditBuilder builder) { | |
| 741 convertFlutterChildToChildren2( | 724 convertFlutterChildToChildren2( |
| 742 builder, | 725 builder, |
| 743 childArg, | 726 childArg, |
| 744 namedExp, | 727 namedExp, |
| 745 eol, | 728 eol, |
| 746 utils.getNodeText, | 729 utils.getNodeText, |
| 747 utils.getLinePrefix, | 730 utils.getLinePrefix, |
| 748 utils.getIndent, | 731 utils.getIndent, |
| 749 utils.getText, | 732 utils.getText, |
| 750 range.node); | 733 range.node); |
| 751 }); | 734 }); |
| 752 _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_FLUTTER_CHILD); | 735 _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_FLUTTER_CHILD); |
| 753 return; | 736 return; |
| 754 } | 737 } |
| 755 ListLiteral listArg = getChildList(namedExp); | 738 ListLiteral listArg = getChildList(namedExp); |
| 756 if (listArg != null) { | 739 if (listArg != null) { |
| 757 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 740 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 758 await changeBuilder.addFileEdit(file, fileStamp, | 741 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 759 (DartFileEditBuilder builder) { | |
| 760 builder.addSimpleInsertion(namedExp.offset + 'child'.length, 'ren'); | 742 builder.addSimpleInsertion(namedExp.offset + 'child'.length, 'ren'); |
| 761 if (listArg.typeArguments == null) { | 743 if (listArg.typeArguments == null) { |
| 762 builder.addSimpleInsertion(listArg.offset, '<Widget>'); | 744 builder.addSimpleInsertion(listArg.offset, '<Widget>'); |
| 763 } | 745 } |
| 764 }); | 746 }); |
| 765 _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_FLUTTER_CHILD); | 747 _addFixFromBuilder(changeBuilder, DartFixKind.CONVERT_FLUTTER_CHILD); |
| 766 } | 748 } |
| 767 } | 749 } |
| 768 | 750 |
| 769 Future<Null> _addFix_convertFlutterChildren() async { | 751 Future<Null> _addFix_convertFlutterChildren() async { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 794 } | 776 } |
| 795 } else { | 777 } else { |
| 796 return; | 778 return; |
| 797 } | 779 } |
| 798 // prepare environment | 780 // prepare environment |
| 799 Element targetUnit; | 781 Element targetUnit; |
| 800 String prefix = ''; | 782 String prefix = ''; |
| 801 String suffix = ''; | 783 String suffix = ''; |
| 802 int offset = -1; | 784 int offset = -1; |
| 803 String filePath; | 785 String filePath; |
| 804 int modificationTime = 0; | |
| 805 if (prefixElement == null) { | 786 if (prefixElement == null) { |
| 806 targetUnit = unitElement; | 787 targetUnit = unitElement; |
| 807 CompilationUnitMember enclosingMember = | 788 CompilationUnitMember enclosingMember = |
| 808 node.getAncestor((node) => node.parent is CompilationUnit); | 789 node.getAncestor((node) => node.parent is CompilationUnit); |
| 809 if (enclosingMember == null) { | 790 if (enclosingMember == null) { |
| 810 return; | 791 return; |
| 811 } | 792 } |
| 812 offset = enclosingMember.end; | 793 offset = enclosingMember.end; |
| 813 filePath = file; | 794 filePath = file; |
| 814 modificationTime = fileStamp; | |
| 815 prefix = '$eol$eol'; | 795 prefix = '$eol$eol'; |
| 816 } else { | 796 } else { |
| 817 for (ImportElement import in unitLibraryElement.imports) { | 797 for (ImportElement import in unitLibraryElement.imports) { |
| 818 if (prefixElement is PrefixElement && import.prefix == prefixElement) { | 798 if (prefixElement is PrefixElement && import.prefix == prefixElement) { |
| 819 LibraryElement library = import.importedLibrary; | 799 LibraryElement library = import.importedLibrary; |
| 820 if (library != null) { | 800 if (library != null) { |
| 821 targetUnit = library.definingCompilationUnit; | 801 targetUnit = library.definingCompilationUnit; |
| 822 Source targetSource = targetUnit.source; | 802 Source targetSource = targetUnit.source; |
| 823 offset = targetSource.contents.data.length; | 803 offset = targetSource.contents.data.length; |
| 824 filePath = targetSource.fullName; | 804 filePath = targetSource.fullName; |
| 825 modificationTime = targetSource.modificationStamp; | |
| 826 prefix = '$eol'; | 805 prefix = '$eol'; |
| 827 suffix = '$eol'; | 806 suffix = '$eol'; |
| 828 break; | 807 break; |
| 829 } | 808 } |
| 830 } | 809 } |
| 831 } | 810 } |
| 832 } | 811 } |
| 833 if (offset < 0) { | 812 if (offset < 0) { |
| 834 return; | 813 return; |
| 835 } | 814 } |
| 836 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 815 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 837 await changeBuilder.addFileEdit(filePath, modificationTime, | 816 await changeBuilder.addFileEdit(filePath, (DartFileEditBuilder builder) { |
| 838 (DartFileEditBuilder builder) { | |
| 839 builder.addInsertion(offset, (DartEditBuilder builder) { | 817 builder.addInsertion(offset, (DartEditBuilder builder) { |
| 840 builder.write(prefix); | 818 builder.write(prefix); |
| 841 builder.writeClassDeclaration(name, nameGroupName: 'NAME'); | 819 builder.writeClassDeclaration(name, nameGroupName: 'NAME'); |
| 842 builder.write(suffix); | 820 builder.write(suffix); |
| 843 }); | 821 }); |
| 844 if (prefixElement == null) { | 822 if (prefixElement == null) { |
| 845 builder.addLinkedPosition(range.node(node), 'NAME'); | 823 builder.addLinkedPosition(range.node(node), 'NAME'); |
| 846 } | 824 } |
| 847 }); | 825 }); |
| 848 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_CLASS, args: [name]); | 826 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_CLASS, args: [name]); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 870 fieldNames.addAll(variableList.variables | 848 fieldNames.addAll(variableList.variables |
| 871 .where((v) => v.initializer == null) | 849 .where((v) => v.initializer == null) |
| 872 .map((v) => v.name.name)); | 850 .map((v) => v.name.name)); |
| 873 } | 851 } |
| 874 } | 852 } |
| 875 } | 853 } |
| 876 // prepare location for a new constructor | 854 // prepare location for a new constructor |
| 877 ClassMemberLocation targetLocation = | 855 ClassMemberLocation targetLocation = |
| 878 utils.prepareNewConstructorLocation(classDeclaration); | 856 utils.prepareNewConstructorLocation(classDeclaration); |
| 879 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 857 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 880 await changeBuilder.addFileEdit(file, fileStamp, | 858 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 881 (DartFileEditBuilder builder) { | |
| 882 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 859 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 883 builder.write(targetLocation.prefix); | 860 builder.write(targetLocation.prefix); |
| 884 builder.writeConstructorDeclaration(classDeclaration.name.name, | 861 builder.writeConstructorDeclaration(classDeclaration.name.name, |
| 885 fieldNames: fieldNames); | 862 fieldNames: fieldNames); |
| 886 builder.write(targetLocation.suffix); | 863 builder.write(targetLocation.suffix); |
| 887 }); | 864 }); |
| 888 }); | 865 }); |
| 889 _addFixFromBuilder( | 866 _addFixFromBuilder( |
| 890 changeBuilder, DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS); | 867 changeBuilder, DartFixKind.CREATE_CONSTRUCTOR_FOR_FINAL_FIELDS); |
| 891 } | 868 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 914 // prepare location for a new constructor | 891 // prepare location for a new constructor |
| 915 AstNode targetTypeNode = getParsedClassElementNode(targetElement); | 892 AstNode targetTypeNode = getParsedClassElementNode(targetElement); |
| 916 if (targetTypeNode is! ClassDeclaration) { | 893 if (targetTypeNode is! ClassDeclaration) { |
| 917 return; | 894 return; |
| 918 } | 895 } |
| 919 ClassMemberLocation targetLocation = | 896 ClassMemberLocation targetLocation = |
| 920 utils.prepareNewConstructorLocation(targetTypeNode); | 897 utils.prepareNewConstructorLocation(targetTypeNode); |
| 921 Source targetSource = targetElement.source; | 898 Source targetSource = targetElement.source; |
| 922 String targetFile = targetSource.fullName; | 899 String targetFile = targetSource.fullName; |
| 923 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 900 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 924 await changeBuilder.addFileEdit(targetFile, targetSource.modificationStamp, | 901 await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) { |
| 925 (DartFileEditBuilder builder) { | |
| 926 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 902 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 927 builder.write(targetLocation.prefix); | 903 builder.write(targetLocation.prefix); |
| 928 builder.writeConstructorDeclaration(targetElement.name, | 904 builder.writeConstructorDeclaration(targetElement.name, |
| 929 argumentList: instanceCreation.argumentList); | 905 argumentList: instanceCreation.argumentList); |
| 930 builder.write(targetLocation.suffix); | 906 builder.write(targetLocation.suffix); |
| 931 }); | 907 }); |
| 932 }); | 908 }); |
| 933 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_CONSTRUCTOR, | 909 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_CONSTRUCTOR, |
| 934 args: [constructorName]); | 910 args: [constructorName]); |
| 935 } | 911 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 // prepare location for a new constructor | 944 // prepare location for a new constructor |
| 969 ClassElement targetElement = targetType.element as ClassElement; | 945 ClassElement targetElement = targetType.element as ClassElement; |
| 970 AstNode targetTypeNode = getParsedClassElementNode(targetElement); | 946 AstNode targetTypeNode = getParsedClassElementNode(targetElement); |
| 971 if (targetTypeNode is! ClassDeclaration) { | 947 if (targetTypeNode is! ClassDeclaration) { |
| 972 return; | 948 return; |
| 973 } | 949 } |
| 974 ClassMemberLocation targetLocation = | 950 ClassMemberLocation targetLocation = |
| 975 utils.prepareNewConstructorLocation(targetTypeNode); | 951 utils.prepareNewConstructorLocation(targetTypeNode); |
| 976 String targetFile = targetElement.source.fullName; | 952 String targetFile = targetElement.source.fullName; |
| 977 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 953 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 978 await changeBuilder.addFileEdit(file, fileStamp, | 954 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 979 (DartFileEditBuilder builder) { | |
| 980 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 955 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 981 builder.write(targetLocation.prefix); | 956 builder.write(targetLocation.prefix); |
| 982 builder.writeConstructorDeclaration(targetElement.name, | 957 builder.writeConstructorDeclaration(targetElement.name, |
| 983 argumentList: instanceCreation.argumentList, | 958 argumentList: instanceCreation.argumentList, |
| 984 constructorName: name, | 959 constructorName: name, |
| 985 constructorNameGroupName: 'NAME'); | 960 constructorNameGroupName: 'NAME'); |
| 986 builder.write(targetLocation.suffix); | 961 builder.write(targetLocation.suffix); |
| 987 }); | 962 }); |
| 988 if (targetFile == file) { | 963 if (targetFile == file) { |
| 989 builder.addLinkedPosition(range.node(name), 'NAME'); | 964 builder.addLinkedPosition(range.node(name), 'NAME'); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1019 insertOffset = targetConstructor.parameters.end; | 994 insertOffset = targetConstructor.parameters.end; |
| 1020 prefix = ' : '; | 995 prefix = ' : '; |
| 1021 } else { | 996 } else { |
| 1022 ConstructorInitializer lastInitializer = | 997 ConstructorInitializer lastInitializer = |
| 1023 initializers[initializers.length - 1]; | 998 initializers[initializers.length - 1]; |
| 1024 insertOffset = lastInitializer.end; | 999 insertOffset = lastInitializer.end; |
| 1025 prefix = ', '; | 1000 prefix = ', '; |
| 1026 } | 1001 } |
| 1027 String proposalName = _getConstructorProposalName(superConstructor); | 1002 String proposalName = _getConstructorProposalName(superConstructor); |
| 1028 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1003 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1029 await changeBuilder.addFileEdit(file, fileStamp, | 1004 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1030 (DartFileEditBuilder builder) { | |
| 1031 builder.addInsertion(insertOffset, (DartEditBuilder builder) { | 1005 builder.addInsertion(insertOffset, (DartEditBuilder builder) { |
| 1032 builder.write(prefix); | 1006 builder.write(prefix); |
| 1033 // add super constructor name | 1007 // add super constructor name |
| 1034 builder.write('super'); | 1008 builder.write('super'); |
| 1035 if (!isEmpty(constructorName)) { | 1009 if (!isEmpty(constructorName)) { |
| 1036 builder.write('.'); | 1010 builder.write('.'); |
| 1037 builder.addSimpleLinkedEdit('NAME', constructorName); | 1011 builder.addSimpleLinkedEdit('NAME', constructorName); |
| 1038 } | 1012 } |
| 1039 // add arguments | 1013 // add arguments |
| 1040 builder.write('('); | 1014 builder.write('('); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 } | 1052 } |
| 1079 // prepare parameters and arguments | 1053 // prepare parameters and arguments |
| 1080 Iterable<ParameterElement> requiredParameters = | 1054 Iterable<ParameterElement> requiredParameters = |
| 1081 superConstructor.parameters.where( | 1055 superConstructor.parameters.where( |
| 1082 (parameter) => parameter.parameterKind == ParameterKind.REQUIRED); | 1056 (parameter) => parameter.parameterKind == ParameterKind.REQUIRED); |
| 1083 // add proposal | 1057 // add proposal |
| 1084 ClassMemberLocation targetLocation = | 1058 ClassMemberLocation targetLocation = |
| 1085 utils.prepareNewConstructorLocation(targetClassNode); | 1059 utils.prepareNewConstructorLocation(targetClassNode); |
| 1086 String proposalName = _getConstructorProposalName(superConstructor); | 1060 String proposalName = _getConstructorProposalName(superConstructor); |
| 1087 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1061 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1088 await changeBuilder.addFileEdit(file, fileStamp, | 1062 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1089 (DartFileEditBuilder builder) { | |
| 1090 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 1063 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 1091 void writeParameters(bool includeType) { | 1064 void writeParameters(bool includeType) { |
| 1092 bool firstParameter = true; | 1065 bool firstParameter = true; |
| 1093 for (ParameterElement parameter in requiredParameters) { | 1066 for (ParameterElement parameter in requiredParameters) { |
| 1094 if (firstParameter) { | 1067 if (firstParameter) { |
| 1095 firstParameter = false; | 1068 firstParameter = false; |
| 1096 } else { | 1069 } else { |
| 1097 builder.write(', '); | 1070 builder.write(', '); |
| 1098 } | 1071 } |
| 1099 String parameterName = parameter.displayName; | 1072 String parameterName = parameter.displayName; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 return; | 1156 return; |
| 1184 } | 1157 } |
| 1185 ClassDeclaration targetClassNode = targetTypeNode; | 1158 ClassDeclaration targetClassNode = targetTypeNode; |
| 1186 // prepare location | 1159 // prepare location |
| 1187 ClassMemberLocation targetLocation = | 1160 ClassMemberLocation targetLocation = |
| 1188 utils.prepareNewFieldLocation(targetClassNode); | 1161 utils.prepareNewFieldLocation(targetClassNode); |
| 1189 // build field source | 1162 // build field source |
| 1190 Source targetSource = targetClassElement.source; | 1163 Source targetSource = targetClassElement.source; |
| 1191 String targetFile = targetSource.fullName; | 1164 String targetFile = targetSource.fullName; |
| 1192 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1165 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1193 await changeBuilder.addFileEdit(targetFile, targetSource.modificationStamp, | 1166 await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) { |
| 1194 (DartFileEditBuilder builder) { | |
| 1195 Expression fieldTypeNode = climbPropertyAccess(nameNode); | 1167 Expression fieldTypeNode = climbPropertyAccess(nameNode); |
| 1196 DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode); | 1168 DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode); |
| 1197 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 1169 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 1198 builder.write(targetLocation.prefix); | 1170 builder.write(targetLocation.prefix); |
| 1199 builder.writeFieldDeclaration(name, | 1171 builder.writeFieldDeclaration(name, |
| 1200 isStatic: staticModifier, | 1172 isStatic: staticModifier, |
| 1201 nameGroupName: 'NAME', | 1173 nameGroupName: 'NAME', |
| 1202 type: fieldType, | 1174 type: fieldType, |
| 1203 typeGroupName: 'TYPE'); | 1175 typeGroupName: 'TYPE'); |
| 1204 builder.write(targetLocation.suffix); | 1176 builder.write(targetLocation.suffix); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1222 return; | 1194 return; |
| 1223 } | 1195 } |
| 1224 SimpleIdentifier nameNode = parameter.identifier; | 1196 SimpleIdentifier nameNode = parameter.identifier; |
| 1225 String name = nameNode.name; | 1197 String name = nameNode.name; |
| 1226 ClassMemberLocation targetLocation = | 1198 ClassMemberLocation targetLocation = |
| 1227 utils.prepareNewFieldLocation(targetClassNode); | 1199 utils.prepareNewFieldLocation(targetClassNode); |
| 1228 // | 1200 // |
| 1229 // Add proposal. | 1201 // Add proposal. |
| 1230 // | 1202 // |
| 1231 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1203 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1232 await changeBuilder.addFileEdit(file, fileStamp, | 1204 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1233 (DartFileEditBuilder builder) { | |
| 1234 DartType fieldType = parameter.type?.type; | 1205 DartType fieldType = parameter.type?.type; |
| 1235 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 1206 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 1236 builder.write(targetLocation.prefix); | 1207 builder.write(targetLocation.prefix); |
| 1237 builder.writeFieldDeclaration(name, | 1208 builder.writeFieldDeclaration(name, |
| 1238 nameGroupName: 'NAME', type: fieldType, typeGroupName: 'TYPE'); | 1209 nameGroupName: 'NAME', type: fieldType, typeGroupName: 'TYPE'); |
| 1239 builder.write(targetLocation.suffix); | 1210 builder.write(targetLocation.suffix); |
| 1240 }); | 1211 }); |
| 1241 }); | 1212 }); |
| 1242 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FIELD, args: [name]); | 1213 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FIELD, args: [name]); |
| 1243 } | 1214 } |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1342 return; | 1313 return; |
| 1343 } | 1314 } |
| 1344 ClassDeclaration targetClassNode = targetTypeNode; | 1315 ClassDeclaration targetClassNode = targetTypeNode; |
| 1345 // prepare location | 1316 // prepare location |
| 1346 ClassMemberLocation targetLocation = | 1317 ClassMemberLocation targetLocation = |
| 1347 utils.prepareNewGetterLocation(targetClassNode); | 1318 utils.prepareNewGetterLocation(targetClassNode); |
| 1348 // build method source | 1319 // build method source |
| 1349 Source targetSource = targetClassElement.source; | 1320 Source targetSource = targetClassElement.source; |
| 1350 String targetFile = targetSource.fullName; | 1321 String targetFile = targetSource.fullName; |
| 1351 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1322 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1352 await changeBuilder.addFileEdit(targetFile, targetSource.modificationStamp, | 1323 await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) { |
| 1353 (DartFileEditBuilder builder) { | |
| 1354 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 1324 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 1355 Expression fieldTypeNode = climbPropertyAccess(nameNode); | 1325 Expression fieldTypeNode = climbPropertyAccess(nameNode); |
| 1356 DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode); | 1326 DartType fieldType = _inferUndefinedExpressionType(fieldTypeNode); |
| 1357 builder.write(targetLocation.prefix); | 1327 builder.write(targetLocation.prefix); |
| 1358 builder.writeGetterDeclaration(name, | 1328 builder.writeGetterDeclaration(name, |
| 1359 isStatic: staticModifier, | 1329 isStatic: staticModifier, |
| 1360 nameGroupName: 'NAME', | 1330 nameGroupName: 'NAME', |
| 1361 returnType: fieldType, | 1331 returnType: fieldType, |
| 1362 returnTypeGroupName: 'TYPE'); | 1332 returnTypeGroupName: 'TYPE'); |
| 1363 builder.write(targetLocation.suffix); | 1333 builder.write(targetLocation.suffix); |
| 1364 }); | 1334 }); |
| 1365 }); | 1335 }); |
| 1366 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_GETTER, args: [name]); | 1336 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_GETTER, args: [name]); |
| 1367 } | 1337 } |
| 1368 | 1338 |
| 1369 Future<Null> _addFix_createImportUri() async { | 1339 Future<Null> _addFix_createImportUri() async { |
| 1370 // TODO(brianwilkerson) Generalize this to allow other valid string literals
. | 1340 // TODO(brianwilkerson) Generalize this to allow other valid string literals
. |
| 1371 // TODO(brianwilkerson) Support the case where the node's parent is a Config
uration. | 1341 // TODO(brianwilkerson) Support the case where the node's parent is a Config
uration. |
| 1372 if (node is SimpleStringLiteral && node.parent is ImportDirective) { | 1342 if (node is SimpleStringLiteral && node.parent is ImportDirective) { |
| 1373 ImportDirective importDirective = node.parent; | 1343 ImportDirective importDirective = node.parent; |
| 1374 Source source = importDirective.uriSource; | 1344 Source source = importDirective.uriSource; |
| 1375 if (source != null) { | 1345 if (source != null) { |
| 1376 String file = source.fullName; | 1346 String file = source.fullName; |
| 1377 if (isAbsolute(file) && AnalysisEngine.isDartFileName(file)) { | 1347 if (isAbsolute(file) && AnalysisEngine.isDartFileName(file)) { |
| 1378 String libName = _computeLibraryName(file); | 1348 String libName = _computeLibraryName(file); |
| 1379 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1349 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1380 await changeBuilder.addFileEdit(source.fullName, -1, | 1350 await changeBuilder.addFileEdit(source.fullName, |
| 1381 (DartFileEditBuilder builder) { | 1351 (DartFileEditBuilder builder) { |
| 1382 builder.addSimpleInsertion(0, 'library $libName;$eol$eol'); | 1352 builder.addSimpleInsertion(0, 'library $libName;$eol$eol'); |
| 1383 }); | 1353 }); |
| 1384 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FILE, | 1354 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FILE, |
| 1385 args: [source.shortName]); | 1355 args: [source.shortName]); |
| 1386 } | 1356 } |
| 1387 } | 1357 } |
| 1388 } | 1358 } |
| 1389 } | 1359 } |
| 1390 | 1360 |
| 1391 Future<Null> _addFix_createLocalVariable() async { | 1361 Future<Null> _addFix_createLocalVariable() async { |
| 1392 if (node is! SimpleIdentifier) { | 1362 if (node is! SimpleIdentifier) { |
| 1393 return; | 1363 return; |
| 1394 } | 1364 } |
| 1395 SimpleIdentifier nameNode = node; | 1365 SimpleIdentifier nameNode = node; |
| 1396 String name = nameNode.name; | 1366 String name = nameNode.name; |
| 1397 // if variable is assigned, convert assignment into declaration | 1367 // if variable is assigned, convert assignment into declaration |
| 1398 if (node.parent is AssignmentExpression) { | 1368 if (node.parent is AssignmentExpression) { |
| 1399 AssignmentExpression assignment = node.parent; | 1369 AssignmentExpression assignment = node.parent; |
| 1400 if (assignment.leftHandSide == node && | 1370 if (assignment.leftHandSide == node && |
| 1401 assignment.operator.type == TokenType.EQ && | 1371 assignment.operator.type == TokenType.EQ && |
| 1402 assignment.parent is ExpressionStatement) { | 1372 assignment.parent is ExpressionStatement) { |
| 1403 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1373 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1404 await changeBuilder.addFileEdit(file, fileStamp, | 1374 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1405 (DartFileEditBuilder builder) { | |
| 1406 builder.addSimpleInsertion(node.offset, 'var '); | 1375 builder.addSimpleInsertion(node.offset, 'var '); |
| 1407 }); | 1376 }); |
| 1408 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_LOCAL_VARIABLE, | 1377 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_LOCAL_VARIABLE, |
| 1409 args: [name]); | 1378 args: [name]); |
| 1410 return; | 1379 return; |
| 1411 } | 1380 } |
| 1412 } | 1381 } |
| 1413 // prepare target Statement | 1382 // prepare target Statement |
| 1414 Statement target = node.getAncestor((x) => x is Statement); | 1383 Statement target = node.getAncestor((x) => x is Statement); |
| 1415 if (target == null) { | 1384 if (target == null) { |
| 1416 return; | 1385 return; |
| 1417 } | 1386 } |
| 1418 String prefix = utils.getNodePrefix(target); | 1387 String prefix = utils.getNodePrefix(target); |
| 1419 // compute type | 1388 // compute type |
| 1420 DartType type = _inferUndefinedExpressionType(node); | 1389 DartType type = _inferUndefinedExpressionType(node); |
| 1421 if (!(type == null || | 1390 if (!(type == null || |
| 1422 type is InterfaceType || | 1391 type is InterfaceType || |
| 1423 type is FunctionType && | 1392 type is FunctionType && |
| 1424 type.element != null && | 1393 type.element != null && |
| 1425 !type.element.isSynthetic)) { | 1394 !type.element.isSynthetic)) { |
| 1426 return; | 1395 return; |
| 1427 } | 1396 } |
| 1428 // build variable declaration source | 1397 // build variable declaration source |
| 1429 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1398 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1430 await changeBuilder.addFileEdit(file, fileStamp, | 1399 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1431 (DartFileEditBuilder builder) { | |
| 1432 builder.addInsertion(target.offset, (DartEditBuilder builder) { | 1400 builder.addInsertion(target.offset, (DartEditBuilder builder) { |
| 1433 builder.writeLocalVariableDeclaration(name, | 1401 builder.writeLocalVariableDeclaration(name, |
| 1434 nameGroupName: 'NAME', type: type, typeGroupName: 'TYPE'); | 1402 nameGroupName: 'NAME', type: type, typeGroupName: 'TYPE'); |
| 1435 builder.write(eol); | 1403 builder.write(eol); |
| 1436 builder.write(prefix); | 1404 builder.write(prefix); |
| 1437 }); | 1405 }); |
| 1438 builder.addLinkedPosition(range.node(node), 'NAME'); | 1406 builder.addLinkedPosition(range.node(node), 'NAME'); |
| 1439 }); | 1407 }); |
| 1440 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_LOCAL_VARIABLE, | 1408 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_LOCAL_VARIABLE, |
| 1441 args: [name]); | 1409 args: [name]); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1462 } | 1430 } |
| 1463 if (a.kind == ElementKind.GETTER) { | 1431 if (a.kind == ElementKind.GETTER) { |
| 1464 return -1; | 1432 return -1; |
| 1465 } | 1433 } |
| 1466 return 1; | 1434 return 1; |
| 1467 }); | 1435 }); |
| 1468 int numElements = elements.length; | 1436 int numElements = elements.length; |
| 1469 int insertOffset = targetClass.end - 1; | 1437 int insertOffset = targetClass.end - 1; |
| 1470 String prefix = utils.getIndent(1); | 1438 String prefix = utils.getIndent(1); |
| 1471 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1439 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1472 await changeBuilder.addFileEdit(file, fileStamp, | 1440 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1473 (DartFileEditBuilder builder) { | |
| 1474 builder.addInsertion(insertOffset, (DartEditBuilder builder) { | 1441 builder.addInsertion(insertOffset, (DartEditBuilder builder) { |
| 1475 // TODO(brianwilkerson) Compare with builder.writeOverrideOfInheritedMem
ber | 1442 // TODO(brianwilkerson) Compare with builder.writeOverrideOfInheritedMem
ber |
| 1476 // The builder method doesn't merge getter/setter pairs into fields. | 1443 // The builder method doesn't merge getter/setter pairs into fields. |
| 1477 // EOL management | 1444 // EOL management |
| 1478 bool isFirst = true; | 1445 bool isFirst = true; |
| 1479 void addEolIfNotFirst() { | 1446 void addEolIfNotFirst() { |
| 1480 if (!isFirst || utils.isClassWithEmptyBody(targetClass)) { | 1447 if (!isFirst || utils.isClassWithEmptyBody(targetClass)) { |
| 1481 builder.write(eol); | 1448 builder.write(eol); |
| 1482 } | 1449 } |
| 1483 isFirst = false; | 1450 isFirst = false; |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1582 builder.write(eol); | 1549 builder.write(eol); |
| 1583 utils.targetExecutableElement = null; | 1550 utils.targetExecutableElement = null; |
| 1584 } | 1551 } |
| 1585 | 1552 |
| 1586 Future<Null> _addFix_createNoSuchMethod() async { | 1553 Future<Null> _addFix_createNoSuchMethod() async { |
| 1587 ClassDeclaration targetClass = node.parent as ClassDeclaration; | 1554 ClassDeclaration targetClass = node.parent as ClassDeclaration; |
| 1588 // prepare environment | 1555 // prepare environment |
| 1589 String prefix = utils.getIndent(1); | 1556 String prefix = utils.getIndent(1); |
| 1590 int insertOffset = targetClass.end - 1; | 1557 int insertOffset = targetClass.end - 1; |
| 1591 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1558 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1592 await changeBuilder.addFileEdit(file, fileStamp, | 1559 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1593 (DartFileEditBuilder builder) { | |
| 1594 builder.addInsertion(insertOffset, (DartEditBuilder builder) { | 1560 builder.addInsertion(insertOffset, (DartEditBuilder builder) { |
| 1595 builder.selectHere(); | 1561 builder.selectHere(); |
| 1596 // insert empty line before existing member | 1562 // insert empty line before existing member |
| 1597 if (!targetClass.members.isEmpty) { | 1563 if (!targetClass.members.isEmpty) { |
| 1598 builder.write(eol); | 1564 builder.write(eol); |
| 1599 } | 1565 } |
| 1600 // append method | 1566 // append method |
| 1601 builder.write(prefix); | 1567 builder.write(prefix); |
| 1602 builder.write( | 1568 builder.write( |
| 1603 'noSuchMethod(Invocation invocation) => super.noSuchMethod(invocatio
n);'); | 1569 'noSuchMethod(Invocation invocation) => super.noSuchMethod(invocatio
n);'); |
| 1604 builder.write(eol); | 1570 builder.write(eol); |
| 1605 }); | 1571 }); |
| 1606 }); | 1572 }); |
| 1607 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_NO_SUCH_METHOD); | 1573 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_NO_SUCH_METHOD); |
| 1608 } | 1574 } |
| 1609 | 1575 |
| 1610 Future<Null> _addFix_createPartUri() async { | 1576 Future<Null> _addFix_createPartUri() async { |
| 1611 // TODO(brianwilkerson) Generalize this to allow other valid string literals
. | 1577 // TODO(brianwilkerson) Generalize this to allow other valid string literals
. |
| 1612 if (node is SimpleStringLiteral && node.parent is PartDirective) { | 1578 if (node is SimpleStringLiteral && node.parent is PartDirective) { |
| 1613 PartDirective partDirective = node.parent; | 1579 PartDirective partDirective = node.parent; |
| 1614 Source source = partDirective.uriSource; | 1580 Source source = partDirective.uriSource; |
| 1615 if (source != null) { | 1581 if (source != null) { |
| 1616 String libName = unitLibraryElement.name; | 1582 String libName = unitLibraryElement.name; |
| 1617 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1583 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1618 await changeBuilder.addFileEdit(source.fullName, -1, | 1584 await changeBuilder.addFileEdit(source.fullName, |
| 1619 (DartFileEditBuilder builder) { | 1585 (DartFileEditBuilder builder) { |
| 1620 // TODO(brianwilkerson) Consider using the URI rather than name | 1586 // TODO(brianwilkerson) Consider using the URI rather than name |
| 1621 builder.addSimpleInsertion(0, 'part of $libName;$eol$eol'); | 1587 builder.addSimpleInsertion(0, 'part of $libName;$eol$eol'); |
| 1622 }); | 1588 }); |
| 1623 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FILE, | 1589 _addFixFromBuilder(changeBuilder, DartFixKind.CREATE_FILE, |
| 1624 args: [source.shortName]); | 1590 args: [source.shortName]); |
| 1625 } | 1591 } |
| 1626 } | 1592 } |
| 1627 } | 1593 } |
| 1628 | 1594 |
| 1629 Future<Null> _addFix_illegalAsyncReturnType() async { | 1595 Future<Null> _addFix_illegalAsyncReturnType() async { |
| 1630 // prepare the existing type | 1596 // prepare the existing type |
| 1631 TypeAnnotation typeName = node.getAncestor((n) => n is TypeAnnotation); | 1597 TypeAnnotation typeName = node.getAncestor((n) => n is TypeAnnotation); |
| 1632 TypeProvider typeProvider = this.typeProvider; | 1598 TypeProvider typeProvider = this.typeProvider; |
| 1633 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1599 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1634 await changeBuilder.addFileEdit(file, fileStamp, | 1600 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1635 (DartFileEditBuilder builder) { | |
| 1636 builder.replaceTypeWithFuture(typeName, typeProvider); | 1601 builder.replaceTypeWithFuture(typeName, typeProvider); |
| 1637 }); | 1602 }); |
| 1638 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_RETURN_TYPE_FUTURE); | 1603 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_RETURN_TYPE_FUTURE); |
| 1639 } | 1604 } |
| 1640 | 1605 |
| 1641 Future<Null> _addFix_importLibrary(FixKind kind, Source library) async { | 1606 Future<Null> _addFix_importLibrary(FixKind kind, Source library) async { |
| 1642 String libraryUri = getLibrarySourceUri(unitLibraryElement, library); | 1607 String libraryUri = getLibrarySourceUri(unitLibraryElement, library); |
| 1643 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1608 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1644 await changeBuilder.addFileEdit(file, fileStamp, | 1609 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1645 (DartFileEditBuilder builder) { | |
| 1646 builder.importLibraries([library]); | 1610 builder.importLibraries([library]); |
| 1647 }); | 1611 }); |
| 1648 _addFixFromBuilder(changeBuilder, kind, args: [libraryUri]); | 1612 _addFixFromBuilder(changeBuilder, kind, args: [libraryUri]); |
| 1649 } | 1613 } |
| 1650 | 1614 |
| 1651 Future<Null> _addFix_importLibrary_withElement(String name, | 1615 Future<Null> _addFix_importLibrary_withElement(String name, |
| 1652 List<ElementKind> elementKinds, TopLevelDeclarationKind kind2) async { | 1616 List<ElementKind> elementKinds, TopLevelDeclarationKind kind2) async { |
| 1653 // ignore if private | 1617 // ignore if private |
| 1654 if (name.startsWith('_')) { | 1618 if (name.startsWith('_')) { |
| 1655 return; | 1619 return; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1667 if (element is PropertyAccessorElement) { | 1631 if (element is PropertyAccessorElement) { |
| 1668 element = (element as PropertyAccessorElement).variable; | 1632 element = (element as PropertyAccessorElement).variable; |
| 1669 } | 1633 } |
| 1670 if (!elementKinds.contains(element.kind)) { | 1634 if (!elementKinds.contains(element.kind)) { |
| 1671 continue; | 1635 continue; |
| 1672 } | 1636 } |
| 1673 // may be apply prefix | 1637 // may be apply prefix |
| 1674 PrefixElement prefix = imp.prefix; | 1638 PrefixElement prefix = imp.prefix; |
| 1675 if (prefix != null) { | 1639 if (prefix != null) { |
| 1676 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1640 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1677 await changeBuilder.addFileEdit(file, fileStamp, | 1641 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1678 (DartFileEditBuilder builder) { | |
| 1679 builder.addSimpleReplacement( | 1642 builder.addSimpleReplacement( |
| 1680 range.startLength(node, 0), '${prefix.displayName}.'); | 1643 range.startLength(node, 0), '${prefix.displayName}.'); |
| 1681 }); | 1644 }); |
| 1682 _addFixFromBuilder(changeBuilder, DartFixKind.IMPORT_LIBRARY_PREFIX, | 1645 _addFixFromBuilder(changeBuilder, DartFixKind.IMPORT_LIBRARY_PREFIX, |
| 1683 args: [libraryElement.displayName, prefix.displayName]); | 1646 args: [libraryElement.displayName, prefix.displayName]); |
| 1684 continue; | 1647 continue; |
| 1685 } | 1648 } |
| 1686 // may be update "show" directive | 1649 // may be update "show" directive |
| 1687 List<NamespaceCombinator> combinators = imp.combinators; | 1650 List<NamespaceCombinator> combinators = imp.combinators; |
| 1688 if (combinators.length == 1 && combinators[0] is ShowElementCombinator) { | 1651 if (combinators.length == 1 && combinators[0] is ShowElementCombinator) { |
| 1689 ShowElementCombinator showCombinator = | 1652 ShowElementCombinator showCombinator = |
| 1690 combinators[0] as ShowElementCombinator; | 1653 combinators[0] as ShowElementCombinator; |
| 1691 // prepare new set of names to show | 1654 // prepare new set of names to show |
| 1692 Set<String> showNames = new SplayTreeSet<String>(); | 1655 Set<String> showNames = new SplayTreeSet<String>(); |
| 1693 showNames.addAll(showCombinator.shownNames); | 1656 showNames.addAll(showCombinator.shownNames); |
| 1694 showNames.add(name); | 1657 showNames.add(name); |
| 1695 // prepare library name - unit name or 'dart:name' for SDK library | 1658 // prepare library name - unit name or 'dart:name' for SDK library |
| 1696 String libraryName = libraryElement.definingCompilationUnit.displayName; | 1659 String libraryName = libraryElement.definingCompilationUnit.displayName; |
| 1697 if (libraryElement.isInSdk) { | 1660 if (libraryElement.isInSdk) { |
| 1698 libraryName = imp.uri; | 1661 libraryName = imp.uri; |
| 1699 } | 1662 } |
| 1700 // don't add this library again | 1663 // don't add this library again |
| 1701 alreadyImportedWithPrefix.add(libraryElement.source); | 1664 alreadyImportedWithPrefix.add(libraryElement.source); |
| 1702 // update library | 1665 // update library |
| 1703 String newShowCode = 'show ${showNames.join(', ')}'; | 1666 String newShowCode = 'show ${showNames.join(', ')}'; |
| 1704 int offset = showCombinator.offset; | 1667 int offset = showCombinator.offset; |
| 1705 int length = showCombinator.end - offset; | 1668 int length = showCombinator.end - offset; |
| 1706 String libraryFile = unitLibraryElement.source.fullName; | 1669 String libraryFile = unitLibraryElement.source.fullName; |
| 1707 int libraryStamp = unitLibraryElement.context | |
| 1708 .getModificationStamp(unitLibraryElement.source); | |
| 1709 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1670 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1710 await changeBuilder.addFileEdit(libraryFile, libraryStamp, | 1671 await changeBuilder.addFileEdit(libraryFile, |
| 1711 (DartFileEditBuilder builder) { | 1672 (DartFileEditBuilder builder) { |
| 1712 builder.addSimpleReplacement( | 1673 builder.addSimpleReplacement( |
| 1713 new SourceRange(offset, length), newShowCode); | 1674 new SourceRange(offset, length), newShowCode); |
| 1714 }); | 1675 }); |
| 1715 _addFixFromBuilder(changeBuilder, DartFixKind.IMPORT_LIBRARY_SHOW, | 1676 _addFixFromBuilder(changeBuilder, DartFixKind.IMPORT_LIBRARY_SHOW, |
| 1716 args: [libraryName]); | 1677 args: [libraryName]); |
| 1717 } | 1678 } |
| 1718 } | 1679 } |
| 1719 // Find new top-level declarations. | 1680 // Find new top-level declarations. |
| 1720 { | 1681 { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1784 } | 1745 } |
| 1785 } | 1746 } |
| 1786 | 1747 |
| 1787 Future<Null> _addFix_insertSemicolon() async { | 1748 Future<Null> _addFix_insertSemicolon() async { |
| 1788 if (error.message.contains("';'")) { | 1749 if (error.message.contains("';'")) { |
| 1789 if (_isAwaitNode()) { | 1750 if (_isAwaitNode()) { |
| 1790 return; | 1751 return; |
| 1791 } | 1752 } |
| 1792 int insertOffset = error.offset + error.length; | 1753 int insertOffset = error.offset + error.length; |
| 1793 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1754 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1794 await changeBuilder.addFileEdit(file, fileStamp, | 1755 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1795 (DartFileEditBuilder builder) { | |
| 1796 builder.addSimpleInsertion(insertOffset, ';'); | 1756 builder.addSimpleInsertion(insertOffset, ';'); |
| 1797 }); | 1757 }); |
| 1798 _addFixFromBuilder(changeBuilder, DartFixKind.INSERT_SEMICOLON); | 1758 _addFixFromBuilder(changeBuilder, DartFixKind.INSERT_SEMICOLON); |
| 1799 } | 1759 } |
| 1800 } | 1760 } |
| 1801 | 1761 |
| 1802 Future<Null> _addFix_isNotNull() async { | 1762 Future<Null> _addFix_isNotNull() async { |
| 1803 if (coveredNode is IsExpression) { | 1763 if (coveredNode is IsExpression) { |
| 1804 IsExpression isExpression = coveredNode as IsExpression; | 1764 IsExpression isExpression = coveredNode as IsExpression; |
| 1805 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1765 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1806 await changeBuilder.addFileEdit(file, fileStamp, | 1766 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1807 (DartFileEditBuilder builder) { | |
| 1808 builder | 1767 builder |
| 1809 .addReplacement(range.endEnd(isExpression.expression, isExpression), | 1768 .addReplacement(range.endEnd(isExpression.expression, isExpression), |
| 1810 (DartEditBuilder builder) { | 1769 (DartEditBuilder builder) { |
| 1811 builder.write(' != null'); | 1770 builder.write(' != null'); |
| 1812 }); | 1771 }); |
| 1813 }); | 1772 }); |
| 1814 _addFixFromBuilder(changeBuilder, DartFixKind.USE_NOT_EQ_NULL); | 1773 _addFixFromBuilder(changeBuilder, DartFixKind.USE_NOT_EQ_NULL); |
| 1815 } | 1774 } |
| 1816 } | 1775 } |
| 1817 | 1776 |
| 1818 Future<Null> _addFix_isNull() async { | 1777 Future<Null> _addFix_isNull() async { |
| 1819 if (coveredNode is IsExpression) { | 1778 if (coveredNode is IsExpression) { |
| 1820 IsExpression isExpression = coveredNode as IsExpression; | 1779 IsExpression isExpression = coveredNode as IsExpression; |
| 1821 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1780 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1822 await changeBuilder.addFileEdit(file, fileStamp, | 1781 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1823 (DartFileEditBuilder builder) { | |
| 1824 builder | 1782 builder |
| 1825 .addReplacement(range.endEnd(isExpression.expression, isExpression), | 1783 .addReplacement(range.endEnd(isExpression.expression, isExpression), |
| 1826 (DartEditBuilder builder) { | 1784 (DartEditBuilder builder) { |
| 1827 builder.write(' == null'); | 1785 builder.write(' == null'); |
| 1828 }); | 1786 }); |
| 1829 }); | 1787 }); |
| 1830 _addFixFromBuilder(changeBuilder, DartFixKind.USE_EQ_EQ_NULL); | 1788 _addFixFromBuilder(changeBuilder, DartFixKind.USE_EQ_EQ_NULL); |
| 1831 } | 1789 } |
| 1832 } | 1790 } |
| 1833 | 1791 |
| 1834 Future<Null> _addFix_makeEnclosingClassAbstract() async { | 1792 Future<Null> _addFix_makeEnclosingClassAbstract() async { |
| 1835 ClassDeclaration enclosingClass = | 1793 ClassDeclaration enclosingClass = |
| 1836 node.getAncestor((node) => node is ClassDeclaration); | 1794 node.getAncestor((node) => node is ClassDeclaration); |
| 1837 if (enclosingClass == null) { | 1795 if (enclosingClass == null) { |
| 1838 return; | 1796 return; |
| 1839 } | 1797 } |
| 1840 String className = enclosingClass.name.name; | 1798 String className = enclosingClass.name.name; |
| 1841 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1799 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1842 await changeBuilder.addFileEdit(file, fileStamp, | 1800 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1843 (DartFileEditBuilder builder) { | |
| 1844 builder.addSimpleInsertion( | 1801 builder.addSimpleInsertion( |
| 1845 enclosingClass.classKeyword.offset, 'abstract '); | 1802 enclosingClass.classKeyword.offset, 'abstract '); |
| 1846 }); | 1803 }); |
| 1847 _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_CLASS_ABSTRACT, | 1804 _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_CLASS_ABSTRACT, |
| 1848 args: [className]); | 1805 args: [className]); |
| 1849 } | 1806 } |
| 1850 | 1807 |
| 1851 Future<Null> _addFix_makeFieldNotFinal() async { | 1808 Future<Null> _addFix_makeFieldNotFinal() async { |
| 1852 AstNode node = this.node; | 1809 AstNode node = this.node; |
| 1853 if (node is SimpleIdentifier && | 1810 if (node is SimpleIdentifier && |
| 1854 node.bestElement is PropertyAccessorElement) { | 1811 node.bestElement is PropertyAccessorElement) { |
| 1855 PropertyAccessorElement getter = node.bestElement; | 1812 PropertyAccessorElement getter = node.bestElement; |
| 1856 if (getter.isGetter && | 1813 if (getter.isGetter && |
| 1857 getter.isSynthetic && | 1814 getter.isSynthetic && |
| 1858 !getter.variable.isSynthetic && | 1815 !getter.variable.isSynthetic && |
| 1859 getter.variable.setter == null && | 1816 getter.variable.setter == null && |
| 1860 getter.enclosingElement is ClassElement) { | 1817 getter.enclosingElement is ClassElement) { |
| 1861 AstNode name = | 1818 AstNode name = |
| 1862 await astProvider.getParsedNameForElement(getter.variable); | 1819 await astProvider.getParsedNameForElement(getter.variable); |
| 1863 AstNode variable = name?.parent; | 1820 AstNode variable = name?.parent; |
| 1864 if (variable is VariableDeclaration && | 1821 if (variable is VariableDeclaration && |
| 1865 variable.parent is VariableDeclarationList && | 1822 variable.parent is VariableDeclarationList && |
| 1866 variable.parent.parent is FieldDeclaration) { | 1823 variable.parent.parent is FieldDeclaration) { |
| 1867 VariableDeclarationList declarationList = variable.parent; | 1824 VariableDeclarationList declarationList = variable.parent; |
| 1868 Token keywordToken = declarationList.keyword; | 1825 Token keywordToken = declarationList.keyword; |
| 1869 if (declarationList.variables.length == 1 && | 1826 if (declarationList.variables.length == 1 && |
| 1870 keywordToken.keyword == Keyword.FINAL) { | 1827 keywordToken.keyword == Keyword.FINAL) { |
| 1871 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1828 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1872 await changeBuilder.addFileEdit(file, fileStamp, | 1829 await changeBuilder.addFileEdit(file, |
| 1873 (DartFileEditBuilder builder) { | 1830 (DartFileEditBuilder builder) { |
| 1874 if (declarationList.type != null) { | 1831 if (declarationList.type != null) { |
| 1875 builder.addReplacement( | 1832 builder.addReplacement( |
| 1876 range.startStart(keywordToken, declarationList.type), | 1833 range.startStart(keywordToken, declarationList.type), |
| 1877 (DartEditBuilder builder) {}); | 1834 (DartEditBuilder builder) {}); |
| 1878 } else { | 1835 } else { |
| 1879 builder.addReplacement(range.startStart(keywordToken, variable), | 1836 builder.addReplacement(range.startStart(keywordToken, variable), |
| 1880 (DartEditBuilder builder) { | 1837 (DartEditBuilder builder) { |
| 1881 builder.write('var '); | 1838 builder.write('var '); |
| 1882 }); | 1839 }); |
| 1883 } | 1840 } |
| 1884 }); | 1841 }); |
| 1885 String fieldName = getter.variable.displayName; | 1842 String fieldName = getter.variable.displayName; |
| 1886 _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_FIELD_NOT_FINAL, | 1843 _addFixFromBuilder(changeBuilder, DartFixKind.MAKE_FIELD_NOT_FINAL, |
| 1887 args: [fieldName]); | 1844 args: [fieldName]); |
| 1888 } | 1845 } |
| 1889 } | 1846 } |
| 1890 } | 1847 } |
| 1891 } | 1848 } |
| 1892 } | 1849 } |
| 1893 | 1850 |
| 1894 Future<Null> _addFix_nonBoolCondition_addNotNull() async { | 1851 Future<Null> _addFix_nonBoolCondition_addNotNull() async { |
| 1895 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1852 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1896 await changeBuilder.addFileEdit(file, fileStamp, | 1853 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1897 (DartFileEditBuilder builder) { | |
| 1898 builder.addSimpleInsertion(error.offset + error.length, ' != null'); | 1854 builder.addSimpleInsertion(error.offset + error.length, ' != null'); |
| 1899 }); | 1855 }); |
| 1900 _addFixFromBuilder(changeBuilder, DartFixKind.ADD_NE_NULL); | 1856 _addFixFromBuilder(changeBuilder, DartFixKind.ADD_NE_NULL); |
| 1901 } | 1857 } |
| 1902 | 1858 |
| 1903 Future<Null> _addFix_removeAwait() async { | 1859 Future<Null> _addFix_removeAwait() async { |
| 1904 final awaitExpression = node; | 1860 final awaitExpression = node; |
| 1905 if (awaitExpression is AwaitExpression) { | 1861 if (awaitExpression is AwaitExpression) { |
| 1906 final awaitToken = awaitExpression.awaitKeyword; | 1862 final awaitToken = awaitExpression.awaitKeyword; |
| 1907 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1863 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1908 await changeBuilder.addFileEdit(file, fileStamp, | 1864 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1909 (DartFileEditBuilder builder) { | |
| 1910 builder.addDeletion(range.startStart(awaitToken, awaitToken.next)); | 1865 builder.addDeletion(range.startStart(awaitToken, awaitToken.next)); |
| 1911 }); | 1866 }); |
| 1912 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_AWAIT); | 1867 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_AWAIT); |
| 1913 } | 1868 } |
| 1914 } | 1869 } |
| 1915 | 1870 |
| 1916 Future<Null> _addFix_removeDeadCode() async { | 1871 Future<Null> _addFix_removeDeadCode() async { |
| 1917 AstNode coveringNode = this.coveredNode; | 1872 AstNode coveringNode = this.coveredNode; |
| 1918 if (coveringNode is Expression) { | 1873 if (coveringNode is Expression) { |
| 1919 AstNode parent = coveredNode.parent; | 1874 AstNode parent = coveredNode.parent; |
| 1920 if (parent is BinaryExpression) { | 1875 if (parent is BinaryExpression) { |
| 1921 if (parent.rightOperand == coveredNode) { | 1876 if (parent.rightOperand == coveredNode) { |
| 1922 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1877 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1923 await changeBuilder.addFileEdit(file, fileStamp, | 1878 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1924 (DartFileEditBuilder builder) { | |
| 1925 builder.addDeletion(range.endEnd(parent.leftOperand, coveredNode)); | 1879 builder.addDeletion(range.endEnd(parent.leftOperand, coveredNode)); |
| 1926 }); | 1880 }); |
| 1927 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE); | 1881 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE); |
| 1928 } | 1882 } |
| 1929 } | 1883 } |
| 1930 } else if (coveringNode is Block) { | 1884 } else if (coveringNode is Block) { |
| 1931 Block block = coveringNode; | 1885 Block block = coveringNode; |
| 1932 List<Statement> statementsToRemove = <Statement>[]; | 1886 List<Statement> statementsToRemove = <Statement>[]; |
| 1933 for (Statement statement in block.statements) { | 1887 for (Statement statement in block.statements) { |
| 1934 if (range.node(statement).intersects(errorRange)) { | 1888 if (range.node(statement).intersects(errorRange)) { |
| 1935 statementsToRemove.add(statement); | 1889 statementsToRemove.add(statement); |
| 1936 } | 1890 } |
| 1937 } | 1891 } |
| 1938 if (statementsToRemove.isNotEmpty) { | 1892 if (statementsToRemove.isNotEmpty) { |
| 1939 SourceRange rangeToRemove = | 1893 SourceRange rangeToRemove = |
| 1940 utils.getLinesRangeStatements(statementsToRemove); | 1894 utils.getLinesRangeStatements(statementsToRemove); |
| 1941 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1895 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1942 await changeBuilder.addFileEdit(file, fileStamp, | 1896 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1943 (DartFileEditBuilder builder) { | |
| 1944 builder.addDeletion(rangeToRemove); | 1897 builder.addDeletion(rangeToRemove); |
| 1945 }); | 1898 }); |
| 1946 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE); | 1899 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE); |
| 1947 } | 1900 } |
| 1948 } else if (coveringNode is Statement) { | 1901 } else if (coveringNode is Statement) { |
| 1949 SourceRange rangeToRemove = | 1902 SourceRange rangeToRemove = |
| 1950 utils.getLinesRangeStatements(<Statement>[coveringNode]); | 1903 utils.getLinesRangeStatements(<Statement>[coveringNode]); |
| 1951 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1904 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1952 await changeBuilder.addFileEdit(file, fileStamp, | 1905 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1953 (DartFileEditBuilder builder) { | |
| 1954 builder.addDeletion(rangeToRemove); | 1906 builder.addDeletion(rangeToRemove); |
| 1955 }); | 1907 }); |
| 1956 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE); | 1908 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_DEAD_CODE); |
| 1957 } | 1909 } |
| 1958 } | 1910 } |
| 1959 | 1911 |
| 1960 Future<Null> _addFix_removeEmptyStatement() async { | 1912 Future<Null> _addFix_removeEmptyStatement() async { |
| 1961 EmptyStatement emptyStatement = node; | 1913 EmptyStatement emptyStatement = node; |
| 1962 if (emptyStatement.parent is Block) { | 1914 if (emptyStatement.parent is Block) { |
| 1963 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1915 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1964 await changeBuilder.addFileEdit(file, fileStamp, | 1916 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1965 (DartFileEditBuilder builder) { | |
| 1966 builder.addDeletion(utils.getLinesRange(range.node(emptyStatement))); | 1917 builder.addDeletion(utils.getLinesRange(range.node(emptyStatement))); |
| 1967 }); | 1918 }); |
| 1968 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_EMPTY_STATEMENT); | 1919 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_EMPTY_STATEMENT); |
| 1969 } else { | 1920 } else { |
| 1970 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1921 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1971 await changeBuilder.addFileEdit(file, fileStamp, | 1922 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1972 (DartFileEditBuilder builder) { | |
| 1973 builder.addSimpleReplacement( | 1923 builder.addSimpleReplacement( |
| 1974 range.endEnd(emptyStatement.beginToken.previous, emptyStatement), | 1924 range.endEnd(emptyStatement.beginToken.previous, emptyStatement), |
| 1975 ' {}'); | 1925 ' {}'); |
| 1976 }); | 1926 }); |
| 1977 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_BRACKETS); | 1927 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_BRACKETS); |
| 1978 } | 1928 } |
| 1979 } | 1929 } |
| 1980 | 1930 |
| 1981 Future<Null> _addFix_removeInitializer() async { | 1931 Future<Null> _addFix_removeInitializer() async { |
| 1982 // Retrieve the linted node. | 1932 // Retrieve the linted node. |
| 1983 VariableDeclaration ancestor = | 1933 VariableDeclaration ancestor = |
| 1984 node.getAncestor((a) => a is VariableDeclaration); | 1934 node.getAncestor((a) => a is VariableDeclaration); |
| 1985 if (ancestor == null) { | 1935 if (ancestor == null) { |
| 1986 return; | 1936 return; |
| 1987 } | 1937 } |
| 1988 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1938 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 1989 await changeBuilder.addFileEdit(file, fileStamp, | 1939 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 1990 (DartFileEditBuilder builder) { | |
| 1991 builder.addDeletion(range.endEnd(ancestor.name, ancestor.initializer)); | 1940 builder.addDeletion(range.endEnd(ancestor.name, ancestor.initializer)); |
| 1992 }); | 1941 }); |
| 1993 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_INITIALIZER); | 1942 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_INITIALIZER); |
| 1994 } | 1943 } |
| 1995 | 1944 |
| 1996 Future<Null> _addFix_removeInterpolationBraces() async { | 1945 Future<Null> _addFix_removeInterpolationBraces() async { |
| 1997 AstNode node = this.node; | 1946 AstNode node = this.node; |
| 1998 if (node is InterpolationExpression) { | 1947 if (node is InterpolationExpression) { |
| 1999 Token right = node.rightBracket; | 1948 Token right = node.rightBracket; |
| 2000 if (node.expression != null && right != null) { | 1949 if (node.expression != null && right != null) { |
| 2001 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1950 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2002 await changeBuilder.addFileEdit(file, fileStamp, | 1951 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2003 (DartFileEditBuilder builder) { | |
| 2004 builder.addSimpleReplacement( | 1952 builder.addSimpleReplacement( |
| 2005 range.startStart(node, node.expression), r'$'); | 1953 range.startStart(node, node.expression), r'$'); |
| 2006 builder.addDeletion(range.token(right)); | 1954 builder.addDeletion(range.token(right)); |
| 2007 }); | 1955 }); |
| 2008 _addFixFromBuilder( | 1956 _addFixFromBuilder( |
| 2009 changeBuilder, DartFixKind.LINT_REMOVE_INTERPOLATION_BRACES); | 1957 changeBuilder, DartFixKind.LINT_REMOVE_INTERPOLATION_BRACES); |
| 2010 } else {} | 1958 } else {} |
| 2011 } | 1959 } |
| 2012 } | 1960 } |
| 2013 | 1961 |
| 2014 Future<Null> _addFix_removeMethodDeclaration() async { | 1962 Future<Null> _addFix_removeMethodDeclaration() async { |
| 2015 MethodDeclaration declaration = | 1963 MethodDeclaration declaration = |
| 2016 node.getAncestor((node) => node is MethodDeclaration); | 1964 node.getAncestor((node) => node is MethodDeclaration); |
| 2017 if (declaration != null) { | 1965 if (declaration != null) { |
| 2018 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1966 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2019 await changeBuilder.addFileEdit(file, fileStamp, | 1967 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2020 (DartFileEditBuilder builder) { | |
| 2021 builder.addDeletion(utils.getLinesRange(range.node(declaration))); | 1968 builder.addDeletion(utils.getLinesRange(range.node(declaration))); |
| 2022 }); | 1969 }); |
| 2023 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_METHOD_DECLARATION); | 1970 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_METHOD_DECLARATION); |
| 2024 } | 1971 } |
| 2025 } | 1972 } |
| 2026 | 1973 |
| 2027 Future<Null> _addFix_removeParameters_inGetterDeclaration() async { | 1974 Future<Null> _addFix_removeParameters_inGetterDeclaration() async { |
| 2028 if (node is MethodDeclaration) { | 1975 if (node is MethodDeclaration) { |
| 2029 MethodDeclaration method = node as MethodDeclaration; | 1976 MethodDeclaration method = node as MethodDeclaration; |
| 2030 SimpleIdentifier name = method.name; | 1977 SimpleIdentifier name = method.name; |
| 2031 FunctionBody body = method.body; | 1978 FunctionBody body = method.body; |
| 2032 if (name != null && body != null) { | 1979 if (name != null && body != null) { |
| 2033 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1980 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2034 await changeBuilder.addFileEdit(file, fileStamp, | 1981 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2035 (DartFileEditBuilder builder) { | |
| 2036 builder.addSimpleReplacement(range.endStart(name, body), ' '); | 1982 builder.addSimpleReplacement(range.endStart(name, body), ' '); |
| 2037 }); | 1983 }); |
| 2038 _addFixFromBuilder( | 1984 _addFixFromBuilder( |
| 2039 changeBuilder, DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION); | 1985 changeBuilder, DartFixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION); |
| 2040 } | 1986 } |
| 2041 } | 1987 } |
| 2042 } | 1988 } |
| 2043 | 1989 |
| 2044 Future<Null> _addFix_removeParentheses_inGetterInvocation() async { | 1990 Future<Null> _addFix_removeParentheses_inGetterInvocation() async { |
| 2045 if (node is SimpleIdentifier && node.parent is MethodInvocation) { | 1991 if (node is SimpleIdentifier && node.parent is MethodInvocation) { |
| 2046 MethodInvocation invocation = node.parent as MethodInvocation; | 1992 MethodInvocation invocation = node.parent as MethodInvocation; |
| 2047 if (invocation.methodName == node && invocation.target != null) { | 1993 if (invocation.methodName == node && invocation.target != null) { |
| 2048 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 1994 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2049 await changeBuilder.addFileEdit(file, fileStamp, | 1995 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2050 (DartFileEditBuilder builder) { | |
| 2051 builder.addDeletion(range.endEnd(node, invocation)); | 1996 builder.addDeletion(range.endEnd(node, invocation)); |
| 2052 }); | 1997 }); |
| 2053 _addFixFromBuilder( | 1998 _addFixFromBuilder( |
| 2054 changeBuilder, DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION); | 1999 changeBuilder, DartFixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION); |
| 2055 } | 2000 } |
| 2056 } | 2001 } |
| 2057 } | 2002 } |
| 2058 | 2003 |
| 2059 Future<Null> _addFix_removeThisExpression() async { | 2004 Future<Null> _addFix_removeThisExpression() async { |
| 2060 final thisExpression = node is ThisExpression | 2005 final thisExpression = node is ThisExpression |
| 2061 ? node | 2006 ? node |
| 2062 : node.getAncestor((node) => node is ThisExpression); | 2007 : node.getAncestor((node) => node is ThisExpression); |
| 2063 final parent = thisExpression.parent; | 2008 final parent = thisExpression.parent; |
| 2064 if (parent is PropertyAccess) { | 2009 if (parent is PropertyAccess) { |
| 2065 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2010 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2066 await changeBuilder.addFileEdit(file, fileStamp, | 2011 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2067 (DartFileEditBuilder builder) { | |
| 2068 builder.addDeletion(range.startEnd(parent, parent.operator)); | 2012 builder.addDeletion(range.startEnd(parent, parent.operator)); |
| 2069 }); | 2013 }); |
| 2070 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_THIS_EXPRESSION); | 2014 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_THIS_EXPRESSION); |
| 2071 } else if (parent is MethodInvocation) { | 2015 } else if (parent is MethodInvocation) { |
| 2072 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2016 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2073 await changeBuilder.addFileEdit(file, fileStamp, | 2017 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2074 (DartFileEditBuilder builder) { | |
| 2075 builder.addDeletion(range.startEnd(parent, parent.operator)); | 2018 builder.addDeletion(range.startEnd(parent, parent.operator)); |
| 2076 }); | 2019 }); |
| 2077 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_THIS_EXPRESSION); | 2020 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_THIS_EXPRESSION); |
| 2078 } | 2021 } |
| 2079 } | 2022 } |
| 2080 | 2023 |
| 2081 Future<Null> _addFix_removeTypeName() async { | 2024 Future<Null> _addFix_removeTypeName() async { |
| 2082 final TypeName type = node.getAncestor((node) => node is TypeName); | 2025 final TypeName type = node.getAncestor((node) => node is TypeName); |
| 2083 if (type != null) { | 2026 if (type != null) { |
| 2084 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2027 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2085 await changeBuilder.addFileEdit(file, fileStamp, | 2028 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2086 (DartFileEditBuilder builder) { | |
| 2087 builder.addDeletion(range.startStart(type, type.endToken.next)); | 2029 builder.addDeletion(range.startStart(type, type.endToken.next)); |
| 2088 }); | 2030 }); |
| 2089 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_TYPE_NAME); | 2031 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_TYPE_NAME); |
| 2090 } | 2032 } |
| 2091 } | 2033 } |
| 2092 | 2034 |
| 2093 Future<Null> _addFix_removeUnnecessaryCast() async { | 2035 Future<Null> _addFix_removeUnnecessaryCast() async { |
| 2094 if (coveredNode is! AsExpression) { | 2036 if (coveredNode is! AsExpression) { |
| 2095 return; | 2037 return; |
| 2096 } | 2038 } |
| 2097 AsExpression asExpression = coveredNode as AsExpression; | 2039 AsExpression asExpression = coveredNode as AsExpression; |
| 2098 Expression expression = asExpression.expression; | 2040 Expression expression = asExpression.expression; |
| 2099 int expressionPrecedence = getExpressionPrecedence(expression); | 2041 int expressionPrecedence = getExpressionPrecedence(expression); |
| 2100 // remove 'as T' from 'e as T' | 2042 // remove 'as T' from 'e as T' |
| 2101 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2043 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2102 await changeBuilder.addFileEdit(file, fileStamp, | 2044 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2103 (DartFileEditBuilder builder) { | |
| 2104 builder.addDeletion(range.endEnd(expression, asExpression)); | 2045 builder.addDeletion(range.endEnd(expression, asExpression)); |
| 2105 _removeEnclosingParentheses(builder, asExpression, expressionPrecedence); | 2046 _removeEnclosingParentheses(builder, asExpression, expressionPrecedence); |
| 2106 }); | 2047 }); |
| 2107 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNNECESSARY_CAST); | 2048 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNNECESSARY_CAST); |
| 2108 } | 2049 } |
| 2109 | 2050 |
| 2110 Future<Null> _addFix_removeUnusedCatchClause() async { | 2051 Future<Null> _addFix_removeUnusedCatchClause() async { |
| 2111 if (node is SimpleIdentifier) { | 2052 if (node is SimpleIdentifier) { |
| 2112 AstNode catchClause = node.parent; | 2053 AstNode catchClause = node.parent; |
| 2113 if (catchClause is CatchClause && | 2054 if (catchClause is CatchClause && |
| 2114 catchClause.exceptionParameter == node) { | 2055 catchClause.exceptionParameter == node) { |
| 2115 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2056 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2116 await changeBuilder.addFileEdit(file, fileStamp, | 2057 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2117 (DartFileEditBuilder builder) { | |
| 2118 builder.addDeletion( | 2058 builder.addDeletion( |
| 2119 range.startStart(catchClause.catchKeyword, catchClause.body)); | 2059 range.startStart(catchClause.catchKeyword, catchClause.body)); |
| 2120 }); | 2060 }); |
| 2121 _addFixFromBuilder( | 2061 _addFixFromBuilder( |
| 2122 changeBuilder, DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE); | 2062 changeBuilder, DartFixKind.REMOVE_UNUSED_CATCH_CLAUSE); |
| 2123 } | 2063 } |
| 2124 } | 2064 } |
| 2125 } | 2065 } |
| 2126 | 2066 |
| 2127 Future<Null> _addFix_removeUnusedCatchStack() async { | 2067 Future<Null> _addFix_removeUnusedCatchStack() async { |
| 2128 if (node is SimpleIdentifier) { | 2068 if (node is SimpleIdentifier) { |
| 2129 AstNode catchClause = node.parent; | 2069 AstNode catchClause = node.parent; |
| 2130 if (catchClause is CatchClause && | 2070 if (catchClause is CatchClause && |
| 2131 catchClause.stackTraceParameter == node && | 2071 catchClause.stackTraceParameter == node && |
| 2132 catchClause.exceptionParameter != null) { | 2072 catchClause.exceptionParameter != null) { |
| 2133 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2073 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2134 await changeBuilder.addFileEdit(file, fileStamp, | 2074 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2135 (DartFileEditBuilder builder) { | |
| 2136 builder | 2075 builder |
| 2137 .addDeletion(range.endEnd(catchClause.exceptionParameter, node)); | 2076 .addDeletion(range.endEnd(catchClause.exceptionParameter, node)); |
| 2138 }); | 2077 }); |
| 2139 _addFixFromBuilder( | 2078 _addFixFromBuilder( |
| 2140 changeBuilder, DartFixKind.REMOVE_UNUSED_CATCH_STACK); | 2079 changeBuilder, DartFixKind.REMOVE_UNUSED_CATCH_STACK); |
| 2141 } | 2080 } |
| 2142 } | 2081 } |
| 2143 } | 2082 } |
| 2144 | 2083 |
| 2145 Future<Null> _addFix_removeUnusedImport() async { | 2084 Future<Null> _addFix_removeUnusedImport() async { |
| 2146 // prepare ImportDirective | 2085 // prepare ImportDirective |
| 2147 ImportDirective importDirective = | 2086 ImportDirective importDirective = |
| 2148 node.getAncestor((node) => node is ImportDirective); | 2087 node.getAncestor((node) => node is ImportDirective); |
| 2149 if (importDirective == null) { | 2088 if (importDirective == null) { |
| 2150 return; | 2089 return; |
| 2151 } | 2090 } |
| 2152 // remove the whole line with import | 2091 // remove the whole line with import |
| 2153 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2092 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2154 await changeBuilder.addFileEdit(file, fileStamp, | 2093 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2155 (DartFileEditBuilder builder) { | |
| 2156 builder.addDeletion(utils.getLinesRange(range.node(importDirective))); | 2094 builder.addDeletion(utils.getLinesRange(range.node(importDirective))); |
| 2157 }); | 2095 }); |
| 2158 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_IMPORT); | 2096 _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_IMPORT); |
| 2159 } | 2097 } |
| 2160 | 2098 |
| 2161 Future<Null> _addFix_replaceVarWithDynamic() async { | 2099 Future<Null> _addFix_replaceVarWithDynamic() async { |
| 2162 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2100 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2163 await changeBuilder.addFileEdit(file, fileStamp, | 2101 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2164 (DartFileEditBuilder builder) { | |
| 2165 builder.addSimpleReplacement(range.error(error), 'dynamic'); | 2102 builder.addSimpleReplacement(range.error(error), 'dynamic'); |
| 2166 }); | 2103 }); |
| 2167 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_VAR_WITH_DYNAMIC); | 2104 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_VAR_WITH_DYNAMIC); |
| 2168 } | 2105 } |
| 2169 | 2106 |
| 2170 Future<Null> _addFix_replaceWithConditionalAssignment() async { | 2107 Future<Null> _addFix_replaceWithConditionalAssignment() async { |
| 2171 IfStatement ifStatement = node is IfStatement | 2108 IfStatement ifStatement = node is IfStatement |
| 2172 ? node | 2109 ? node |
| 2173 : node.getAncestor((node) => node is IfStatement); | 2110 : node.getAncestor((node) => node is IfStatement); |
| 2174 var thenStatement = ifStatement.thenStatement; | 2111 var thenStatement = ifStatement.thenStatement; |
| 2175 Statement uniqueStatement(Statement statement) { | 2112 Statement uniqueStatement(Statement statement) { |
| 2176 if (statement is Block) { | 2113 if (statement is Block) { |
| 2177 return uniqueStatement(statement.statements.first); | 2114 return uniqueStatement(statement.statements.first); |
| 2178 } | 2115 } |
| 2179 return statement; | 2116 return statement; |
| 2180 } | 2117 } |
| 2181 | 2118 |
| 2182 thenStatement = uniqueStatement(thenStatement); | 2119 thenStatement = uniqueStatement(thenStatement); |
| 2183 if (thenStatement is ExpressionStatement) { | 2120 if (thenStatement is ExpressionStatement) { |
| 2184 final expression = thenStatement.expression.unParenthesized; | 2121 final expression = thenStatement.expression.unParenthesized; |
| 2185 if (expression is AssignmentExpression) { | 2122 if (expression is AssignmentExpression) { |
| 2186 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2123 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2187 await changeBuilder.addFileEdit(file, fileStamp, | 2124 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2188 (DartFileEditBuilder builder) { | |
| 2189 builder.addReplacement(range.node(ifStatement), | 2125 builder.addReplacement(range.node(ifStatement), |
| 2190 (DartEditBuilder builder) { | 2126 (DartEditBuilder builder) { |
| 2191 builder.write(utils.getNodeText(expression.leftHandSide)); | 2127 builder.write(utils.getNodeText(expression.leftHandSide)); |
| 2192 builder.write(' ??= '); | 2128 builder.write(' ??= '); |
| 2193 builder.write(utils.getNodeText(expression.rightHandSide)); | 2129 builder.write(utils.getNodeText(expression.rightHandSide)); |
| 2194 builder.write(';'); | 2130 builder.write(';'); |
| 2195 }); | 2131 }); |
| 2196 }); | 2132 }); |
| 2197 _addFixFromBuilder( | 2133 _addFixFromBuilder( |
| 2198 changeBuilder, DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT); | 2134 changeBuilder, DartFixKind.REPLACE_WITH_CONDITIONAL_ASSIGNMENT); |
| 2199 } | 2135 } |
| 2200 } | 2136 } |
| 2201 } | 2137 } |
| 2202 | 2138 |
| 2203 Future<Null> _addFix_replaceWithConstInstanceCreation() async { | 2139 Future<Null> _addFix_replaceWithConstInstanceCreation() async { |
| 2204 if (coveredNode is InstanceCreationExpression) { | 2140 if (coveredNode is InstanceCreationExpression) { |
| 2205 var instanceCreation = coveredNode as InstanceCreationExpression; | 2141 var instanceCreation = coveredNode as InstanceCreationExpression; |
| 2206 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2142 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2207 await changeBuilder.addFileEdit(file, fileStamp, | 2143 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2208 (DartFileEditBuilder builder) { | |
| 2209 builder.addSimpleReplacement( | 2144 builder.addSimpleReplacement( |
| 2210 range.token(instanceCreation.keyword), 'const'); | 2145 range.token(instanceCreation.keyword), 'const'); |
| 2211 }); | 2146 }); |
| 2212 _addFixFromBuilder(changeBuilder, DartFixKind.USE_CONST); | 2147 _addFixFromBuilder(changeBuilder, DartFixKind.USE_CONST); |
| 2213 } | 2148 } |
| 2214 } | 2149 } |
| 2215 | 2150 |
| 2216 Future<Null> _addFix_replaceWithIdentifier() async { | 2151 Future<Null> _addFix_replaceWithIdentifier() async { |
| 2217 final FunctionTypedFormalParameter functionTyped = | 2152 final FunctionTypedFormalParameter functionTyped = |
| 2218 node.getAncestor((node) => node is FunctionTypedFormalParameter); | 2153 node.getAncestor((node) => node is FunctionTypedFormalParameter); |
| 2219 if (functionTyped != null) { | 2154 if (functionTyped != null) { |
| 2220 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2155 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2221 await changeBuilder.addFileEdit(file, fileStamp, | 2156 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2222 (DartFileEditBuilder builder) { | |
| 2223 builder.addSimpleReplacement(range.node(functionTyped), | 2157 builder.addSimpleReplacement(range.node(functionTyped), |
| 2224 utils.getNodeText(functionTyped.identifier)); | 2158 utils.getNodeText(functionTyped.identifier)); |
| 2225 }); | 2159 }); |
| 2226 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_IDENTIFIER); | 2160 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_IDENTIFIER); |
| 2227 } else { | 2161 } else { |
| 2228 await _addFix_removeTypeName(); | 2162 await _addFix_removeTypeName(); |
| 2229 } | 2163 } |
| 2230 } | 2164 } |
| 2231 | 2165 |
| 2232 Future<Null> _addFix_replaceWithLiteral() async { | 2166 Future<Null> _addFix_replaceWithLiteral() async { |
| 2233 final InstanceCreationExpression instanceCreation = | 2167 final InstanceCreationExpression instanceCreation = |
| 2234 node.getAncestor((node) => node is InstanceCreationExpression); | 2168 node.getAncestor((node) => node is InstanceCreationExpression); |
| 2235 final InterfaceType type = instanceCreation.staticType; | 2169 final InterfaceType type = instanceCreation.staticType; |
| 2236 final generics = instanceCreation.constructorName.type.typeArguments; | 2170 final generics = instanceCreation.constructorName.type.typeArguments; |
| 2237 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2171 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2238 await changeBuilder.addFileEdit(file, fileStamp, | 2172 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2239 (DartFileEditBuilder builder) { | |
| 2240 builder.addReplacement(range.node(instanceCreation), | 2173 builder.addReplacement(range.node(instanceCreation), |
| 2241 (DartEditBuilder builder) { | 2174 (DartEditBuilder builder) { |
| 2242 if (generics != null) { | 2175 if (generics != null) { |
| 2243 builder.write(utils.getNodeText(generics)); | 2176 builder.write(utils.getNodeText(generics)); |
| 2244 } | 2177 } |
| 2245 if (type.name == 'List') { | 2178 if (type.name == 'List') { |
| 2246 builder.write('[]'); | 2179 builder.write('[]'); |
| 2247 } else { | 2180 } else { |
| 2248 builder.write('{}'); | 2181 builder.write('{}'); |
| 2249 } | 2182 } |
| 2250 }); | 2183 }); |
| 2251 }); | 2184 }); |
| 2252 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_LITERAL); | 2185 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_LITERAL); |
| 2253 } | 2186 } |
| 2254 | 2187 |
| 2255 Future<Null> _addFix_replaceWithTearOff() async { | 2188 Future<Null> _addFix_replaceWithTearOff() async { |
| 2256 FunctionExpression ancestor = | 2189 FunctionExpression ancestor = |
| 2257 node.getAncestor((a) => a is FunctionExpression); | 2190 node.getAncestor((a) => a is FunctionExpression); |
| 2258 if (ancestor == null) { | 2191 if (ancestor == null) { |
| 2259 return; | 2192 return; |
| 2260 } | 2193 } |
| 2261 Future<Null> addFixOfExpression(InvocationExpression expression) async { | 2194 Future<Null> addFixOfExpression(InvocationExpression expression) async { |
| 2262 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2195 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2263 await changeBuilder.addFileEdit(file, fileStamp, | 2196 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2264 (DartFileEditBuilder builder) { | |
| 2265 builder.addReplacement(range.node(ancestor), (DartEditBuilder builder) { | 2197 builder.addReplacement(range.node(ancestor), (DartEditBuilder builder) { |
| 2266 if (expression is MethodInvocation && expression.target != null) { | 2198 if (expression is MethodInvocation && expression.target != null) { |
| 2267 builder.write(utils.getNodeText(expression.target)); | 2199 builder.write(utils.getNodeText(expression.target)); |
| 2268 builder.write('.'); | 2200 builder.write('.'); |
| 2269 } | 2201 } |
| 2270 builder.write(utils.getNodeText(expression.function)); | 2202 builder.write(utils.getNodeText(expression.function)); |
| 2271 }); | 2203 }); |
| 2272 }); | 2204 }); |
| 2273 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_TEAR_OFF); | 2205 _addFixFromBuilder(changeBuilder, DartFixKind.REPLACE_WITH_TEAR_OFF); |
| 2274 } | 2206 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2321 if (importElement.prefix?.name == prefixName) { | 2253 if (importElement.prefix?.name == prefixName) { |
| 2322 Map<String, Element> namespace = getImportNamespace(importElement); | 2254 Map<String, Element> namespace = getImportNamespace(importElement); |
| 2323 finder._updateList(namespace.values); | 2255 finder._updateList(namespace.values); |
| 2324 } | 2256 } |
| 2325 } | 2257 } |
| 2326 // If we have a close enough element, suggest to use it. | 2258 // If we have a close enough element, suggest to use it. |
| 2327 if (finder._element != null) { | 2259 if (finder._element != null) { |
| 2328 String closestName = finder._element.name; | 2260 String closestName = finder._element.name; |
| 2329 if (closestName != null) { | 2261 if (closestName != null) { |
| 2330 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2262 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2331 await changeBuilder.addFileEdit(file, fileStamp, | 2263 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2332 (DartFileEditBuilder builder) { | |
| 2333 builder.addSimpleReplacement(range.node(node), closestName); | 2264 builder.addSimpleReplacement(range.node(node), closestName); |
| 2334 }); | 2265 }); |
| 2335 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO, | 2266 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO, |
| 2336 args: [closestName]); | 2267 args: [closestName]); |
| 2337 } | 2268 } |
| 2338 } | 2269 } |
| 2339 } | 2270 } |
| 2340 } | 2271 } |
| 2341 | 2272 |
| 2342 Future<Null> _addFix_undefinedClassAccessor_useSimilar() async { | 2273 Future<Null> _addFix_undefinedClassAccessor_useSimilar() async { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2385 DartType type = target.bestType; | 2316 DartType type = target.bestType; |
| 2386 if (type is InterfaceType) { | 2317 if (type is InterfaceType) { |
| 2387 ClassElement classElement = type.element; | 2318 ClassElement classElement = type.element; |
| 2388 _updateFinderWithClassMembers(finder, classElement); | 2319 _updateFinderWithClassMembers(finder, classElement); |
| 2389 } | 2320 } |
| 2390 } | 2321 } |
| 2391 // if we have close enough element, suggest to use it | 2322 // if we have close enough element, suggest to use it |
| 2392 if (finder._element != null) { | 2323 if (finder._element != null) { |
| 2393 String closestName = finder._element.name; | 2324 String closestName = finder._element.name; |
| 2394 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2325 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2395 await changeBuilder.addFileEdit(file, fileStamp, | 2326 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2396 (DartFileEditBuilder builder) { | |
| 2397 builder.addSimpleReplacement(range.node(node), closestName); | 2327 builder.addSimpleReplacement(range.node(node), closestName); |
| 2398 }); | 2328 }); |
| 2399 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO, | 2329 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO, |
| 2400 args: [closestName]); | 2330 args: [closestName]); |
| 2401 } | 2331 } |
| 2402 } | 2332 } |
| 2403 } | 2333 } |
| 2404 | 2334 |
| 2405 Future<Null> _addFix_undefinedFunction_create() async { | 2335 Future<Null> _addFix_undefinedFunction_create() async { |
| 2406 // should be the name of the invocation | 2336 // should be the name of the invocation |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2417 // prepare environment | 2347 // prepare environment |
| 2418 int insertOffset; | 2348 int insertOffset; |
| 2419 String sourcePrefix; | 2349 String sourcePrefix; |
| 2420 AstNode enclosingMember = | 2350 AstNode enclosingMember = |
| 2421 node.getAncestor((node) => node is CompilationUnitMember); | 2351 node.getAncestor((node) => node is CompilationUnitMember); |
| 2422 insertOffset = enclosingMember.end; | 2352 insertOffset = enclosingMember.end; |
| 2423 sourcePrefix = '$eol$eol'; | 2353 sourcePrefix = '$eol$eol'; |
| 2424 utils.targetClassElement = null; | 2354 utils.targetClassElement = null; |
| 2425 // build method source | 2355 // build method source |
| 2426 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2356 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2427 await changeBuilder.addFileEdit(file, fileStamp, | 2357 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2428 (DartFileEditBuilder builder) { | |
| 2429 builder.addInsertion(insertOffset, (DartEditBuilder builder) { | 2358 builder.addInsertion(insertOffset, (DartEditBuilder builder) { |
| 2430 builder.write(sourcePrefix); | 2359 builder.write(sourcePrefix); |
| 2431 // append return type | 2360 // append return type |
| 2432 { | 2361 { |
| 2433 DartType type = _inferUndefinedExpressionType(invocation); | 2362 DartType type = _inferUndefinedExpressionType(invocation); |
| 2434 if (builder.writeType(type, groupName: 'RETURN_TYPE')) { | 2363 if (builder.writeType(type, groupName: 'RETURN_TYPE')) { |
| 2435 builder.write(' '); | 2364 builder.write(' '); |
| 2436 } | 2365 } |
| 2437 } | 2366 } |
| 2438 // append name | 2367 // append name |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2479 for (ImportElement importElement in unitLibraryElement.imports) { | 2408 for (ImportElement importElement in unitLibraryElement.imports) { |
| 2480 if (importElement.prefix?.name == prefixName) { | 2409 if (importElement.prefix?.name == prefixName) { |
| 2481 Map<String, Element> namespace = getImportNamespace(importElement); | 2410 Map<String, Element> namespace = getImportNamespace(importElement); |
| 2482 finder._updateList(namespace.values); | 2411 finder._updateList(namespace.values); |
| 2483 } | 2412 } |
| 2484 } | 2413 } |
| 2485 // If we have a close enough element, suggest to use it. | 2414 // If we have a close enough element, suggest to use it. |
| 2486 if (finder._element != null) { | 2415 if (finder._element != null) { |
| 2487 String closestName = finder._element.name; | 2416 String closestName = finder._element.name; |
| 2488 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2417 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2489 await changeBuilder.addFileEdit(file, fileStamp, | 2418 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2490 (DartFileEditBuilder builder) { | |
| 2491 builder.addSimpleReplacement(range.node(node), closestName); | 2419 builder.addSimpleReplacement(range.node(node), closestName); |
| 2492 }); | 2420 }); |
| 2493 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO, | 2421 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO, |
| 2494 args: [closestName]); | 2422 args: [closestName]); |
| 2495 } | 2423 } |
| 2496 } | 2424 } |
| 2497 } | 2425 } |
| 2498 | 2426 |
| 2499 Future<Null> _addFix_undefinedMethod_create() async { | 2427 Future<Null> _addFix_undefinedMethod_create() async { |
| 2500 if (node is SimpleIdentifier && node.parent is MethodInvocation) { | 2428 if (node is SimpleIdentifier && node.parent is MethodInvocation) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2538 } | 2466 } |
| 2539 // use different utils | 2467 // use different utils |
| 2540 CompilationUnitElement targetUnitElement = | 2468 CompilationUnitElement targetUnitElement = |
| 2541 getCompilationUnitElement(targetClassElement); | 2469 getCompilationUnitElement(targetClassElement); |
| 2542 CompilationUnit targetUnit = getParsedUnit(targetUnitElement); | 2470 CompilationUnit targetUnit = getParsedUnit(targetUnitElement); |
| 2543 utils = new CorrectionUtils(targetUnit); | 2471 utils = new CorrectionUtils(targetUnit); |
| 2544 } | 2472 } |
| 2545 ClassMemberLocation targetLocation = | 2473 ClassMemberLocation targetLocation = |
| 2546 utils.prepareNewMethodLocation(targetClassNode); | 2474 utils.prepareNewMethodLocation(targetClassNode); |
| 2547 String targetFile = targetElement.source.fullName; | 2475 String targetFile = targetElement.source.fullName; |
| 2548 int targetStamp = | |
| 2549 targetElement.context.getModificationStamp(targetElement.source); | |
| 2550 // build method source | 2476 // build method source |
| 2551 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2477 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2552 await changeBuilder.addFileEdit(targetFile, targetStamp, | 2478 await changeBuilder.addFileEdit(targetFile, |
| 2553 (DartFileEditBuilder builder) { | 2479 (DartFileEditBuilder builder) { |
| 2554 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { | 2480 builder.addInsertion(targetLocation.offset, (DartEditBuilder builder) { |
| 2555 builder.write(targetLocation.prefix); | 2481 builder.write(targetLocation.prefix); |
| 2556 // maybe "static" | 2482 // maybe "static" |
| 2557 if (staticModifier) { | 2483 if (staticModifier) { |
| 2558 builder.write('static '); | 2484 builder.write('static '); |
| 2559 } | 2485 } |
| 2560 // append return type | 2486 // append return type |
| 2561 { | 2487 { |
| 2562 DartType type = _inferUndefinedExpressionType(invocation); | 2488 DartType type = _inferUndefinedExpressionType(invocation); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2608 fields.map((field) => 'this.${field.name}').join(', '); | 2534 fields.map((field) => 'this.${field.name}').join(', '); |
| 2609 // prepare the last required parameter | 2535 // prepare the last required parameter |
| 2610 FormalParameter lastRequiredParameter; | 2536 FormalParameter lastRequiredParameter; |
| 2611 List<FormalParameter> parameters = constructor.parameters.parameters; | 2537 List<FormalParameter> parameters = constructor.parameters.parameters; |
| 2612 for (FormalParameter parameter in parameters) { | 2538 for (FormalParameter parameter in parameters) { |
| 2613 if (parameter.kind == ParameterKind.REQUIRED) { | 2539 if (parameter.kind == ParameterKind.REQUIRED) { |
| 2614 lastRequiredParameter = parameter; | 2540 lastRequiredParameter = parameter; |
| 2615 } | 2541 } |
| 2616 } | 2542 } |
| 2617 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2543 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2618 await changeBuilder.addFileEdit(file, fileStamp, | 2544 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2619 (DartFileEditBuilder builder) { | |
| 2620 // append new field formal initializers | 2545 // append new field formal initializers |
| 2621 if (lastRequiredParameter != null) { | 2546 if (lastRequiredParameter != null) { |
| 2622 builder.addSimpleInsertion( | 2547 builder.addSimpleInsertion( |
| 2623 lastRequiredParameter.end, ', $fieldParametersCode'); | 2548 lastRequiredParameter.end, ', $fieldParametersCode'); |
| 2624 } else { | 2549 } else { |
| 2625 int offset = constructor.parameters.leftParenthesis.end; | 2550 int offset = constructor.parameters.leftParenthesis.end; |
| 2626 if (parameters.isNotEmpty) { | 2551 if (parameters.isNotEmpty) { |
| 2627 fieldParametersCode += ', '; | 2552 fieldParametersCode += ', '; |
| 2628 } | 2553 } |
| 2629 builder.addSimpleInsertion(offset, fieldParametersCode); | 2554 builder.addSimpleInsertion(offset, fieldParametersCode); |
| 2630 } | 2555 } |
| 2631 }); | 2556 }); |
| 2632 _addFixFromBuilder(changeBuilder, DartFixKind.ADD_FIELD_FORMAL_PARAMETERS); | 2557 _addFixFromBuilder(changeBuilder, DartFixKind.ADD_FIELD_FORMAL_PARAMETERS); |
| 2633 } | 2558 } |
| 2634 | 2559 |
| 2635 Future<Null> _addFix_useEffectiveIntegerDivision() async { | 2560 Future<Null> _addFix_useEffectiveIntegerDivision() async { |
| 2636 for (AstNode n = node; n != null; n = n.parent) { | 2561 for (AstNode n = node; n != null; n = n.parent) { |
| 2637 if (n is MethodInvocation && | 2562 if (n is MethodInvocation && |
| 2638 n.offset == errorOffset && | 2563 n.offset == errorOffset && |
| 2639 n.length == errorLength) { | 2564 n.length == errorLength) { |
| 2640 Expression target = (n as MethodInvocation).target.unParenthesized; | 2565 Expression target = (n as MethodInvocation).target.unParenthesized; |
| 2641 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2566 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2642 await changeBuilder.addFileEdit(file, fileStamp, | 2567 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2643 (DartFileEditBuilder builder) { | |
| 2644 // replace "/" with "~/" | 2568 // replace "/" with "~/" |
| 2645 BinaryExpression binary = target as BinaryExpression; | 2569 BinaryExpression binary = target as BinaryExpression; |
| 2646 builder.addSimpleReplacement(range.token(binary.operator), '~/'); | 2570 builder.addSimpleReplacement(range.token(binary.operator), '~/'); |
| 2647 // remove everything before and after | 2571 // remove everything before and after |
| 2648 builder.addDeletion(range.startStart(n, binary.leftOperand)); | 2572 builder.addDeletion(range.startStart(n, binary.leftOperand)); |
| 2649 builder.addDeletion(range.endEnd(binary.rightOperand, n)); | 2573 builder.addDeletion(range.endEnd(binary.rightOperand, n)); |
| 2650 }); | 2574 }); |
| 2651 _addFixFromBuilder( | 2575 _addFixFromBuilder( |
| 2652 changeBuilder, DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION); | 2576 changeBuilder, DartFixKind.USE_EFFECTIVE_INTEGER_DIVISION); |
| 2653 // done | 2577 // done |
| 2654 break; | 2578 break; |
| 2655 } | 2579 } |
| 2656 } | 2580 } |
| 2657 } | 2581 } |
| 2658 | 2582 |
| 2659 /** | 2583 /** |
| 2660 * Adds a fix that replaces [target] with a reference to the class declaring | 2584 * Adds a fix that replaces [target] with a reference to the class declaring |
| 2661 * the given [element]. | 2585 * the given [element]. |
| 2662 */ | 2586 */ |
| 2663 Future<Null> _addFix_useStaticAccess(AstNode target, Element element) async { | 2587 Future<Null> _addFix_useStaticAccess(AstNode target, Element element) async { |
| 2664 Element declaringElement = element.enclosingElement; | 2588 Element declaringElement = element.enclosingElement; |
| 2665 if (declaringElement is ClassElement) { | 2589 if (declaringElement is ClassElement) { |
| 2666 DartType declaringType = declaringElement.type; | 2590 DartType declaringType = declaringElement.type; |
| 2667 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2591 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2668 await changeBuilder.addFileEdit(file, fileStamp, | 2592 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) { |
| 2669 (DartFileEditBuilder builder) { | |
| 2670 // replace "target" with class name | 2593 // replace "target" with class name |
| 2671 builder.addReplacement(range.node(target), (DartEditBuilder builder) { | 2594 builder.addReplacement(range.node(target), (DartEditBuilder builder) { |
| 2672 builder.writeType(declaringType); | 2595 builder.writeType(declaringType); |
| 2673 }); | 2596 }); |
| 2674 }); | 2597 }); |
| 2675 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO_STATIC_ACCESS, | 2598 _addFixFromBuilder(changeBuilder, DartFixKind.CHANGE_TO_STATIC_ACCESS, |
| 2676 args: [declaringType]); | 2599 args: [declaringType]); |
| 2677 } | 2600 } |
| 2678 } | 2601 } |
| 2679 | 2602 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2718 String name, | 2641 String name, |
| 2719 Source targetSource, | 2642 Source targetSource, |
| 2720 int insertOffset, | 2643 int insertOffset, |
| 2721 bool isStatic, | 2644 bool isStatic, |
| 2722 String prefix, | 2645 String prefix, |
| 2723 String sourcePrefix, | 2646 String sourcePrefix, |
| 2724 String sourceSuffix, | 2647 String sourceSuffix, |
| 2725 Element target) async { | 2648 Element target) async { |
| 2726 // build method source | 2649 // build method source |
| 2727 String targetFile = targetSource.fullName; | 2650 String targetFile = targetSource.fullName; |
| 2728 int timeStamp = target.context.getModificationStamp(targetSource); | |
| 2729 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); | 2651 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); |
| 2730 await changeBuilder.addFileEdit(targetFile, timeStamp, | 2652 await changeBuilder.addFileEdit(targetFile, (DartFileEditBuilder builder) { |
| 2731 (DartFileEditBuilder builder) { | |
| 2732 builder.addInsertion(insertOffset, (DartEditBuilder builder) { | 2653 builder.addInsertion(insertOffset, (DartEditBuilder builder) { |
| 2733 builder.write(sourcePrefix); | 2654 builder.write(sourcePrefix); |
| 2734 builder.write(prefix); | 2655 builder.write(prefix); |
| 2735 // may be static | 2656 // may be static |
| 2736 if (isStatic) { | 2657 if (isStatic) { |
| 2737 builder.write('static '); | 2658 builder.write('static '); |
| 2738 } | 2659 } |
| 2739 // append return type | 2660 // append return type |
| 2740 if (builder.writeType(functionType.returnType, | 2661 if (builder.writeType(functionType.returnType, |
| 2741 groupName: 'RETURN_TYPE')) { | 2662 groupName: 'RETURN_TYPE')) { |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3104 // This should be rare / never situation. | 3025 // This should be rare / never situation. |
| 3105 if (packageRoot == null) { | 3026 if (packageRoot == null) { |
| 3106 return true; | 3027 return true; |
| 3107 } | 3028 } |
| 3108 | 3029 |
| 3109 // We cannot use relative URIs to reference files outside of our package. | 3030 // We cannot use relative URIs to reference files outside of our package. |
| 3110 return resourceProvider.pathContext | 3031 return resourceProvider.pathContext |
| 3111 .isWithin(packageRoot.path, source.fullName); | 3032 .isWithin(packageRoot.path, source.fullName); |
| 3112 } | 3033 } |
| 3113 | 3034 |
| 3114 int _modificationStamp(String filePath) { | |
| 3115 // TODO(brianwilkerson) We have lost the ability for clients to know whether | |
| 3116 // it is safe to apply an edit. | |
| 3117 return driver.fsState.getFileForPath(filePath).exists ? 0 : -1; | |
| 3118 } | |
| 3119 | |
| 3120 /** | 3035 /** |
| 3121 * Removes any [ParenthesizedExpression] enclosing [expr]. | 3036 * Removes any [ParenthesizedExpression] enclosing [expr]. |
| 3122 * | 3037 * |
| 3123 * [exprPrecedence] - the effective precedence of [expr]. | 3038 * [exprPrecedence] - the effective precedence of [expr]. |
| 3124 */ | 3039 */ |
| 3125 void _removeEnclosingParentheses( | 3040 void _removeEnclosingParentheses( |
| 3126 DartFileEditBuilder builder, Expression expr, int exprPrecedence) { | 3041 DartFileEditBuilder builder, Expression expr, int exprPrecedence) { |
| 3127 while (expr.parent is ParenthesizedExpression) { | 3042 while (expr.parent is ParenthesizedExpression) { |
| 3128 ParenthesizedExpression parenthesized = | 3043 ParenthesizedExpression parenthesized = |
| 3129 expr.parent as ParenthesizedExpression; | 3044 expr.parent as ParenthesizedExpression; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3215 } | 3130 } |
| 3216 } | 3131 } |
| 3217 } | 3132 } |
| 3218 | 3133 |
| 3219 void _updateList(Iterable<Element> elements) { | 3134 void _updateList(Iterable<Element> elements) { |
| 3220 for (Element element in elements) { | 3135 for (Element element in elements) { |
| 3221 _update(element); | 3136 _update(element); |
| 3222 } | 3137 } |
| 3223 } | 3138 } |
| 3224 } | 3139 } |
| OLD | NEW |