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

Side by Side Diff: pkg/analysis_server/lib/src/services/correction/fix_internal.dart

Issue 2962223002: Remove timeStamp from the ChangeBuilder API (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698