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 |