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

Side by Side Diff: pkg/analysis_server/lib/src/services/correction/assist_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 7
8 import 'package:analysis_server/plugin/edit/assist/assist_core.dart'; 8 import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
9 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart'; 9 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart';
10 import 'package:analysis_server/src/services/correction/assist.dart'; 10 import 'package:analysis_server/src/services/correction/assist.dart';
(...skipping 27 matching lines...) Expand all
38 * The computer for Dart assists. 38 * The computer for Dart assists.
39 */ 39 */
40 class AssistProcessor { 40 class AssistProcessor {
41 /** 41 /**
42 * The analysis driver being used to perform analysis. 42 * The analysis driver being used to perform analysis.
43 */ 43 */
44 AnalysisDriver driver; 44 AnalysisDriver driver;
45 45
46 Source source; 46 Source source;
47 String file; 47 String file;
48 int fileStamp;
49 48
50 CompilationUnit unit; 49 CompilationUnit unit;
51 CompilationUnitElement unitElement; 50 CompilationUnitElement unitElement;
52 51
53 LibraryElement unitLibraryElement; 52 LibraryElement unitLibraryElement;
54 String unitLibraryFile; 53 String unitLibraryFile;
55 String unitLibraryFolder; 54 String unitLibraryFolder;
56 55
57 int selectionOffset; 56 int selectionOffset;
58 int selectionLength; 57 int selectionLength;
59 int selectionEnd; 58 int selectionEnd;
60 59
61 final List<Assist> assists = <Assist>[]; 60 final List<Assist> assists = <Assist>[];
62 61
63 Position exitPosition = null; 62 Position exitPosition = null;
64 63
65 CorrectionUtils utils; 64 CorrectionUtils utils;
66 65
67 AstNode node; 66 AstNode node;
68 67
69 TypeProvider _typeProvider; 68 TypeProvider _typeProvider;
70 69
71 AssistProcessor(DartAssistContext dartContext) { 70 AssistProcessor(DartAssistContext dartContext) {
72 driver = dartContext.analysisDriver; 71 driver = dartContext.analysisDriver;
73 // source 72 // source
74 source = dartContext.source; 73 source = dartContext.source;
75 file = dartContext.source.fullName; 74 file = dartContext.source.fullName;
76 fileStamp = _modificationStamp(file);
77 // unit 75 // unit
78 unit = dartContext.unit; 76 unit = dartContext.unit;
79 unitElement = dartContext.unit.element; 77 unitElement = dartContext.unit.element;
80 // library 78 // library
81 unitLibraryElement = resolutionMap 79 unitLibraryElement = resolutionMap
82 .elementDeclaredByCompilationUnit(dartContext.unit) 80 .elementDeclaredByCompilationUnit(dartContext.unit)
83 .library; 81 .library;
84 unitLibraryFile = unitLibraryElement.source.fullName; 82 unitLibraryFile = unitLibraryElement.source.fullName;
85 unitLibraryFolder = dirname(unitLibraryFile); 83 unitLibraryFolder = dirname(unitLibraryFile);
86 // selection 84 // selection
87 selectionOffset = dartContext.selectionOffset; 85 selectionOffset = dartContext.selectionOffset;
88 selectionLength = dartContext.selectionLength; 86 selectionLength = dartContext.selectionLength;
89 selectionEnd = selectionOffset + selectionLength; 87 selectionEnd = selectionOffset + selectionLength;
90 } 88 }
91 89
92 /** 90 /**
93 * Returns the EOL to use for this [CompilationUnit]. 91 * Returns the EOL to use for this [CompilationUnit].
94 */ 92 */
95 String get eol => utils.endOfLine; 93 String get eol => utils.endOfLine;
96 94
97 TypeProvider get typeProvider { 95 TypeProvider get typeProvider {
98 if (_typeProvider == null) { 96 if (_typeProvider == null) {
99 _typeProvider = unitElement.context.typeProvider; 97 _typeProvider = unitElement.context.typeProvider;
100 } 98 }
101 return _typeProvider; 99 return _typeProvider;
102 } 100 }
103 101
104 Future<List<Assist>> compute() async { 102 Future<List<Assist>> compute() async {
105 // If the source was changed between the constructor and running
106 // this asynchronous method, it is not safe to use the unit.
107 if (_modificationStamp(file) != fileStamp) {
108 return const <Assist>[];
109 }
110
111 try { 103 try {
112 utils = new CorrectionUtils(unit); 104 utils = new CorrectionUtils(unit);
113 } catch (e) { 105 } catch (e) {
114 throw new CancelCorrectionException(exception: e); 106 throw new CancelCorrectionException(exception: e);
115 } 107 }
116 108
117 node = new NodeLocator(selectionOffset, selectionEnd).searchWithin(unit); 109 node = new NodeLocator(selectionOffset, selectionEnd).searchWithin(unit);
118 if (node == null) { 110 if (node == null) {
119 return assists; 111 return assists;
120 } 112 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 _configureTargetLocation(node); 223 _configureTargetLocation(node);
232 Set<Source> librariesToImport = new Set<Source>(); 224 Set<Source> librariesToImport = new Set<Source>();
233 String typeSource = utils.getTypeSource(type, librariesToImport); 225 String typeSource = utils.getTypeSource(type, librariesToImport);
234 if (typeSource == null) { 226 if (typeSource == null) {
235 // The type source might be null if the type is private. 227 // The type source might be null if the type is private.
236 _coverageMarker(); 228 _coverageMarker();
237 return; 229 return;
238 } 230 }
239 231
240 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 232 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
241 await changeBuilder.addFileEdit(file, fileStamp, 233 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
242 (DartFileEditBuilder builder) {
243 Token keyword = declaredIdentifier.keyword; 234 Token keyword = declaredIdentifier.keyword;
244 if (keyword.keyword == Keyword.VAR) { 235 if (keyword.keyword == Keyword.VAR) {
245 builder.addSimpleReplacement(range.token(keyword), typeSource); 236 builder.addSimpleReplacement(range.token(keyword), typeSource);
246 } else { 237 } else {
247 builder.addSimpleInsertion( 238 builder.addSimpleInsertion(
248 declaredIdentifier.identifier.offset, '$typeSource '); 239 declaredIdentifier.identifier.offset, '$typeSource ');
249 } 240 }
250 builder.importLibraries(librariesToImport); 241 builder.importLibraries(librariesToImport);
251 }); 242 });
252 _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION); 243 _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION);
(...skipping 27 matching lines...) Expand all
280 _configureTargetLocation(node); 271 _configureTargetLocation(node);
281 Set<Source> librariesToImport = new Set<Source>(); 272 Set<Source> librariesToImport = new Set<Source>();
282 String typeSource = utils.getTypeSource(type, librariesToImport); 273 String typeSource = utils.getTypeSource(type, librariesToImport);
283 // type source might be null, if the type is private 274 // type source might be null, if the type is private
284 if (typeSource == null) { 275 if (typeSource == null) {
285 _coverageMarker(); 276 _coverageMarker();
286 return; 277 return;
287 } 278 }
288 279
289 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 280 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
290 await changeBuilder.addFileEdit(file, fileStamp, 281 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
291 (DartFileEditBuilder builder) {
292 builder.addSimpleInsertion(name.offset, '$typeSource '); 282 builder.addSimpleInsertion(name.offset, '$typeSource ');
293 builder.importLibraries(librariesToImport); 283 builder.importLibraries(librariesToImport);
294 }); 284 });
295 _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION); 285 _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION);
296 } 286 }
297 287
298 Future<Null> _addProposal_addTypeAnnotation_VariableDeclaration() async { 288 Future<Null> _addProposal_addTypeAnnotation_VariableDeclaration() async {
299 AstNode node = this.node; 289 AstNode node = this.node;
300 // prepare VariableDeclarationList 290 // prepare VariableDeclarationList
301 VariableDeclarationList declarationList = 291 VariableDeclarationList declarationList =
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 // type source might be null, if the type is private 330 // type source might be null, if the type is private
341 if (typeSource == null) { 331 if (typeSource == null) {
342 _coverageMarker(); 332 _coverageMarker();
343 return; 333 return;
344 } 334 }
345 335
346 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 336 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
347 if (unitLibraryFile == file) { 337 if (unitLibraryFile == file) {
348 // TODO(brianwilkerson) Make ChangeBuilder merge multiple edits to the 338 // TODO(brianwilkerson) Make ChangeBuilder merge multiple edits to the
349 // same file so that only the else block is necessary. 339 // same file so that only the else block is necessary.
350 await changeBuilder.addFileEdit(file, fileStamp, 340 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
351 (DartFileEditBuilder builder) {
352 Token keyword = declarationList.keyword; 341 Token keyword = declarationList.keyword;
353 if (keyword?.keyword == Keyword.VAR) { 342 if (keyword?.keyword == Keyword.VAR) {
354 builder.addSimpleReplacement(range.token(keyword), typeSource); 343 builder.addSimpleReplacement(range.token(keyword), typeSource);
355 } else { 344 } else {
356 builder.addSimpleInsertion(variable.offset, '$typeSource '); 345 builder.addSimpleInsertion(variable.offset, '$typeSource ');
357 } 346 }
358 builder.importLibraries(librariesToImport); 347 builder.importLibraries(librariesToImport);
359 }); 348 });
360 } else { 349 } else {
361 await changeBuilder.addFileEdit(file, fileStamp, 350 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
362 (DartFileEditBuilder builder) {
363 Token keyword = declarationList.keyword; 351 Token keyword = declarationList.keyword;
364 if (keyword?.keyword == Keyword.VAR) { 352 if (keyword?.keyword == Keyword.VAR) {
365 builder.addSimpleReplacement(range.token(keyword), typeSource); 353 builder.addSimpleReplacement(range.token(keyword), typeSource);
366 } else { 354 } else {
367 builder.addSimpleInsertion(variable.offset, '$typeSource '); 355 builder.addSimpleInsertion(variable.offset, '$typeSource ');
368 } 356 }
369 }); 357 });
370 await changeBuilder 358 await changeBuilder.addFileEdit(unitLibraryFile,
371 .addFileEdit(unitLibraryFile, _modificationStamp(unitLibraryFile), 359 (DartFileEditBuilder builder) {
372 (DartFileEditBuilder builder) {
373 builder.importLibraries(librariesToImport); 360 builder.importLibraries(librariesToImport);
374 }); 361 });
375 } 362 }
376 _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION); 363 _addAssistFromBuilder(changeBuilder, DartAssistKind.ADD_TYPE_ANNOTATION);
377 } 364 }
378 365
379 Future<Null> _addProposal_assignToLocalVariable() async { 366 Future<Null> _addProposal_assignToLocalVariable() async {
380 // prepare enclosing ExpressionStatement 367 // prepare enclosing ExpressionStatement
381 ExpressionStatement expressionStatement; 368 ExpressionStatement expressionStatement;
382 for (AstNode node = this.node; node != null; node = node.parent) { 369 for (AstNode node = this.node; node != null; node = node.parent) {
(...skipping 25 matching lines...) Expand all
408 // prepare excluded names 395 // prepare excluded names
409 Set<String> excluded = new Set<String>(); 396 Set<String> excluded = new Set<String>();
410 ScopedNameFinder scopedNameFinder = new ScopedNameFinder(offset); 397 ScopedNameFinder scopedNameFinder = new ScopedNameFinder(offset);
411 expression.accept(scopedNameFinder); 398 expression.accept(scopedNameFinder);
412 excluded.addAll(scopedNameFinder.locals.keys.toSet()); 399 excluded.addAll(scopedNameFinder.locals.keys.toSet());
413 List<String> suggestions = 400 List<String> suggestions =
414 getVariableNameSuggestionsForExpression(type, expression, excluded); 401 getVariableNameSuggestionsForExpression(type, expression, excluded);
415 402
416 if (suggestions.isNotEmpty) { 403 if (suggestions.isNotEmpty) {
417 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 404 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
418 await changeBuilder.addFileEdit(file, fileStamp, 405 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
419 (DartFileEditBuilder builder) {
420 builder.addInsertion(offset, (DartEditBuilder builder) { 406 builder.addInsertion(offset, (DartEditBuilder builder) {
421 builder.write('var '); 407 builder.write('var ');
422 builder.addSimpleLinkedEdit('NAME', suggestions[0], 408 builder.addSimpleLinkedEdit('NAME', suggestions[0],
423 kind: LinkedEditSuggestionKind.VARIABLE, 409 kind: LinkedEditSuggestionKind.VARIABLE,
424 suggestions: suggestions); 410 suggestions: suggestions);
425 builder.write(' = '); 411 builder.write(' = ');
426 }); 412 });
427 }); 413 });
428 _addAssistFromBuilder( 414 _addAssistFromBuilder(
429 changeBuilder, DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE); 415 changeBuilder, DartAssistKind.ASSIGN_TO_LOCAL_VARIABLE);
430 } 416 }
431 } 417 }
432 418
433 Future<Null> _addProposal_convertDocumentationIntoBlock() async { 419 Future<Null> _addProposal_convertDocumentationIntoBlock() async {
434 Comment comment = node.getAncestor((n) => n is Comment); 420 Comment comment = node.getAncestor((n) => n is Comment);
435 if (comment == null || !comment.isDocumentation) { 421 if (comment == null || !comment.isDocumentation) {
436 return; 422 return;
437 } 423 }
438 var tokens = comment.tokens; 424 var tokens = comment.tokens;
439 if (tokens.isEmpty || 425 if (tokens.isEmpty ||
440 tokens.any((Token token) => 426 tokens.any((Token token) =>
441 token is! DocumentationCommentToken || 427 token is! DocumentationCommentToken ||
442 token.type != TokenType.SINGLE_LINE_COMMENT)) { 428 token.type != TokenType.SINGLE_LINE_COMMENT)) {
443 return; 429 return;
444 } 430 }
445 String prefix = utils.getNodePrefix(comment); 431 String prefix = utils.getNodePrefix(comment);
446 432
447 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 433 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
448 await changeBuilder.addFileEdit(file, fileStamp, 434 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
449 (DartFileEditBuilder builder) {
450 builder.addReplacement(range.node(comment), (DartEditBuilder builder) { 435 builder.addReplacement(range.node(comment), (DartEditBuilder builder) {
451 builder.writeln('/**'); 436 builder.writeln('/**');
452 for (Token token in comment.tokens) { 437 for (Token token in comment.tokens) {
453 builder.write(prefix); 438 builder.write(prefix);
454 builder.write(' *'); 439 builder.write(' *');
455 builder.writeln(token.lexeme.substring('///'.length)); 440 builder.writeln(token.lexeme.substring('///'.length));
456 } 441 }
457 builder.write(prefix); 442 builder.write(prefix);
458 builder.write(' */'); 443 builder.write(' */');
459 }); 444 });
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 _coverageMarker(); 488 _coverageMarker();
504 return; 489 return;
505 } 490 }
506 line = line.substring(expectedPrefix.length).trim(); 491 line = line.substring(expectedPrefix.length).trim();
507 newLines.add('$linePrefix/// $line'); 492 newLines.add('$linePrefix/// $line');
508 linePrefix = eol + prefix; 493 linePrefix = eol + prefix;
509 } 494 }
510 } 495 }
511 496
512 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 497 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
513 await changeBuilder.addFileEdit(file, fileStamp, 498 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
514 (DartFileEditBuilder builder) {
515 builder.addReplacement(range.node(comment), (DartEditBuilder builder) { 499 builder.addReplacement(range.node(comment), (DartEditBuilder builder) {
516 for (String newLine in newLines) { 500 for (String newLine in newLines) {
517 builder.write(newLine); 501 builder.write(newLine);
518 } 502 }
519 }); 503 });
520 }); 504 });
521 _addAssistFromBuilder( 505 _addAssistFromBuilder(
522 changeBuilder, DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE); 506 changeBuilder, DartAssistKind.CONVERT_DOCUMENTATION_INTO_LINE);
523 } 507 }
524 508
(...skipping 26 matching lines...) Expand all
551 _coverageMarker(); 535 _coverageMarker();
552 return; 536 return;
553 } 537 }
554 } 538 }
555 InstanceCreationExpression childArg = getChildWidget(namedExp, false); 539 InstanceCreationExpression childArg = getChildWidget(namedExp, false);
556 if (childArg == null) { 540 if (childArg == null) {
557 _coverageMarker(); 541 _coverageMarker();
558 return; 542 return;
559 } 543 }
560 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 544 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
561 await changeBuilder.addFileEdit(file, fileStamp, 545 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
562 (DartFileEditBuilder builder) {
563 _convertFlutterChildToChildren(childArg, namedExp, eol, utils.getNodeText, 546 _convertFlutterChildToChildren(childArg, namedExp, eol, utils.getNodeText,
564 utils.getLinePrefix, utils.getIndent, utils.getText, builder); 547 utils.getLinePrefix, utils.getIndent, utils.getText, builder);
565 }); 548 });
566 _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_FLUTTER_CHILD); 549 _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_FLUTTER_CHILD);
567 } 550 }
568 551
569 Future<Null> _addProposal_convertIntoFinalField() async { 552 Future<Null> _addProposal_convertIntoFinalField() async {
570 // Find the enclosing getter. 553 // Find the enclosing getter.
571 MethodDeclaration getter; 554 MethodDeclaration getter;
572 for (AstNode n = node; n != null; n = n.parent) { 555 for (AstNode n = node; n != null; n = n.parent) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 beginNodeToReplace = getter.returnType; 604 beginNodeToReplace = getter.returnType;
622 code += ' ' + _getNodeText(getter.returnType); 605 code += ' ' + _getNodeText(getter.returnType);
623 } 606 }
624 code += ' ' + _getNodeText(getter.name); 607 code += ' ' + _getNodeText(getter.name);
625 if (expression is! NullLiteral) { 608 if (expression is! NullLiteral) {
626 code += ' = ' + _getNodeText(expression); 609 code += ' = ' + _getNodeText(expression);
627 } 610 }
628 code += ';'; 611 code += ';';
629 SourceRange replacementRange = range.startEnd(beginNodeToReplace, getter); 612 SourceRange replacementRange = range.startEnd(beginNodeToReplace, getter);
630 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 613 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
631 await changeBuilder.addFileEdit(file, fileStamp, 614 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
632 (DartFileEditBuilder builder) {
633 builder.addSimpleReplacement(replacementRange, code); 615 builder.addSimpleReplacement(replacementRange, code);
634 }); 616 });
635 _addAssistFromBuilder( 617 _addAssistFromBuilder(
636 changeBuilder, DartAssistKind.CONVERT_INTO_FINAL_FIELD); 618 changeBuilder, DartAssistKind.CONVERT_INTO_FINAL_FIELD);
637 } 619 }
638 } 620 }
639 621
640 Future<Null> _addProposal_convertIntoGetter() async { 622 Future<Null> _addProposal_convertIntoGetter() async {
641 // Find the enclosing field declaration. 623 // Find the enclosing field declaration.
642 FieldDeclaration fieldDeclaration; 624 FieldDeclaration fieldDeclaration;
(...skipping 30 matching lines...) Expand all
673 if (fieldList.type != null) { 655 if (fieldList.type != null) {
674 code += _getNodeText(fieldList.type) + ' '; 656 code += _getNodeText(fieldList.type) + ' ';
675 } 657 }
676 code += 'get'; 658 code += 'get';
677 code += ' ' + _getNodeText(field.name); 659 code += ' ' + _getNodeText(field.name);
678 code += ' => ' + _getNodeText(initializer); 660 code += ' => ' + _getNodeText(initializer);
679 code += ';'; 661 code += ';';
680 SourceRange replacementRange = 662 SourceRange replacementRange =
681 range.startEnd(fieldList.keyword, fieldDeclaration); 663 range.startEnd(fieldList.keyword, fieldDeclaration);
682 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 664 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
683 await changeBuilder.addFileEdit(file, fileStamp, 665 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
684 (DartFileEditBuilder builder) {
685 builder.addSimpleReplacement(replacementRange, code); 666 builder.addSimpleReplacement(replacementRange, code);
686 }); 667 });
687 _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_INTO_GETTER); 668 _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_INTO_GETTER);
688 } 669 }
689 670
690 Future<Null> _addProposal_convertToBlockFunctionBody() async { 671 Future<Null> _addProposal_convertToBlockFunctionBody() async {
691 FunctionBody body = getEnclosingFunctionBody(); 672 FunctionBody body = getEnclosingFunctionBody();
692 // prepare expression body 673 // prepare expression body
693 if (body is! ExpressionFunctionBody || body.isGenerator) { 674 if (body is! ExpressionFunctionBody || body.isGenerator) {
694 _coverageMarker(); 675 _coverageMarker();
695 return; 676 return;
696 } 677 }
697 Expression returnValue = (body as ExpressionFunctionBody).expression; 678 Expression returnValue = (body as ExpressionFunctionBody).expression;
698 DartType returnValueType = returnValue.staticType; 679 DartType returnValueType = returnValue.staticType;
699 String returnValueCode = _getNodeText(returnValue); 680 String returnValueCode = _getNodeText(returnValue);
700 // prepare prefix 681 // prepare prefix
701 String prefix = utils.getNodePrefix(body.parent); 682 String prefix = utils.getNodePrefix(body.parent);
702 String indent = utils.getIndent(1); 683 String indent = utils.getIndent(1);
703 684
704 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 685 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
705 await changeBuilder.addFileEdit(file, fileStamp, 686 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
706 (DartFileEditBuilder builder) {
707 builder.addReplacement(range.node(body), (DartEditBuilder builder) { 687 builder.addReplacement(range.node(body), (DartEditBuilder builder) {
708 if (body.isAsynchronous) { 688 if (body.isAsynchronous) {
709 builder.write('async '); 689 builder.write('async ');
710 } 690 }
711 builder.write('{$eol$prefix$indent'); 691 builder.write('{$eol$prefix$indent');
712 if (!returnValueType.isVoid) { 692 if (!returnValueType.isVoid) {
713 builder.write('return '); 693 builder.write('return ');
714 } 694 }
715 builder.write(returnValueCode); 695 builder.write(returnValueCode);
716 builder.write(';'); 696 builder.write(';');
(...skipping 25 matching lines...) Expand all
742 returnExpression = onlyStatement.expression; 722 returnExpression = onlyStatement.expression;
743 } else if (onlyStatement is ExpressionStatement) { 723 } else if (onlyStatement is ExpressionStatement) {
744 returnExpression = onlyStatement.expression; 724 returnExpression = onlyStatement.expression;
745 } 725 }
746 if (returnExpression == null) { 726 if (returnExpression == null) {
747 _coverageMarker(); 727 _coverageMarker();
748 return; 728 return;
749 } 729 }
750 730
751 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 731 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
752 await changeBuilder.addFileEdit(file, fileStamp, 732 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
753 (DartFileEditBuilder builder) {
754 builder.addReplacement(range.node(body), (DartEditBuilder builder) { 733 builder.addReplacement(range.node(body), (DartEditBuilder builder) {
755 if (body.isAsynchronous) { 734 if (body.isAsynchronous) {
756 builder.write('async '); 735 builder.write('async ');
757 } 736 }
758 builder.write('=> '); 737 builder.write('=> ');
759 builder.write(_getNodeText(returnExpression)); 738 builder.write(_getNodeText(returnExpression));
760 if (body.parent is! FunctionExpression || 739 if (body.parent is! FunctionExpression ||
761 body.parent.parent is FunctionDeclaration) { 740 body.parent.parent is FunctionDeclaration) {
762 builder.write(';'); 741 builder.write(';');
763 } 742 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
829 parameterInitializer = initializer; 808 parameterInitializer = initializer;
830 } 809 }
831 } 810 }
832 } 811 }
833 if (parameterInitializer == null) { 812 if (parameterInitializer == null) {
834 return; 813 return;
835 } 814 }
836 String fieldName = parameterInitializer.fieldName.name; 815 String fieldName = parameterInitializer.fieldName.name;
837 816
838 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 817 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
839 await changeBuilder.addFileEdit(file, fileStamp, 818 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
840 (DartFileEditBuilder builder) {
841 // replace parameter 819 // replace parameter
842 builder.addSimpleReplacement(range.node(parameter), 'this.$fieldName'); 820 builder.addSimpleReplacement(range.node(parameter), 'this.$fieldName');
843 // remove initializer 821 // remove initializer
844 int initializerIndex = initializers.indexOf(parameterInitializer); 822 int initializerIndex = initializers.indexOf(parameterInitializer);
845 if (initializers.length == 1) { 823 if (initializers.length == 1) {
846 builder 824 builder
847 .addDeletion(range.endEnd(parameterList, parameterInitializer)); 825 .addDeletion(range.endEnd(parameterList, parameterInitializer));
848 } else { 826 } else {
849 if (initializerIndex == 0) { 827 if (initializerIndex == 0) {
850 ConstructorInitializer next = initializers[initializerIndex + 1]; 828 ConstructorInitializer next = initializers[initializerIndex + 1];
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 _coverageMarker(); 898 _coverageMarker();
921 return; 899 return;
922 } 900 }
923 } 901 }
924 // prepare environment 902 // prepare environment
925 String prefix = utils.getNodePrefix(forEachStatement); 903 String prefix = utils.getNodePrefix(forEachStatement);
926 String indent = utils.getIndent(1); 904 String indent = utils.getIndent(1);
927 int firstBlockLine = utils.getLineContentEnd(body.leftBracket.end); 905 int firstBlockLine = utils.getLineContentEnd(body.leftBracket.end);
928 // add change 906 // add change
929 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 907 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
930 await changeBuilder.addFileEdit(file, fileStamp, 908 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
931 (DartFileEditBuilder builder) {
932 // TODO(brianwilkerson) Create linked positions for the loop variable. 909 // TODO(brianwilkerson) Create linked positions for the loop variable.
933 builder.addSimpleReplacement( 910 builder.addSimpleReplacement(
934 range.startEnd(forEachStatement, forEachStatement.rightParenthesis), 911 range.startEnd(forEachStatement, forEachStatement.rightParenthesis),
935 'for (int $indexName = 0; $indexName < $listName.length; $indexName++) '); 912 'for (int $indexName = 0; $indexName < $listName.length; $indexName++) ');
936 builder.addSimpleInsertion(firstBlockLine, 913 builder.addSimpleInsertion(firstBlockLine,
937 '$prefix$indent$loopVariable = $listName[$indexName];$eol'); 914 '$prefix$indent$loopVariable = $listName[$indexName];$eol');
938 }); 915 });
939 _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_INTO_FOR_INDEX); 916 _addAssistFromBuilder(changeBuilder, DartAssistKind.CONVERT_INTO_FOR_INDEX);
940 } 917 }
941 918
(...skipping 26 matching lines...) Expand all
968 _coverageMarker(); 945 _coverageMarker();
969 return; 946 return;
970 } 947 }
971 PrefixExpression prefExpression = parent2 as PrefixExpression; 948 PrefixExpression prefExpression = parent2 as PrefixExpression;
972 if (prefExpression.operator.type != TokenType.BANG) { 949 if (prefExpression.operator.type != TokenType.BANG) {
973 _coverageMarker(); 950 _coverageMarker();
974 return; 951 return;
975 } 952 }
976 953
977 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 954 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
978 await changeBuilder.addFileEdit(file, fileStamp, 955 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
979 (DartFileEditBuilder builder) {
980 if (getExpressionParentPrecedence(prefExpression) >= 956 if (getExpressionParentPrecedence(prefExpression) >=
981 TokenClass.RELATIONAL_OPERATOR.precedence) { 957 TokenClass.RELATIONAL_OPERATOR.precedence) {
982 builder.addDeletion(range.token(prefExpression.operator)); 958 builder.addDeletion(range.token(prefExpression.operator));
983 } else { 959 } else {
984 builder.addDeletion( 960 builder.addDeletion(
985 range.startEnd(prefExpression, parExpression.leftParenthesis)); 961 range.startEnd(prefExpression, parExpression.leftParenthesis));
986 builder.addDeletion( 962 builder.addDeletion(
987 range.startEnd(parExpression.rightParenthesis, prefExpression)); 963 range.startEnd(parExpression.rightParenthesis, prefExpression));
988 } 964 }
989 builder.addSimpleInsertion(isExpression.isOperator.end, '!'); 965 builder.addSimpleInsertion(isExpression.isOperator.end, '!');
(...skipping 30 matching lines...) Expand all
1020 _coverageMarker(); 996 _coverageMarker();
1021 return; 997 return;
1022 } 998 }
1023 IsExpression isExpression = operand as IsExpression; 999 IsExpression isExpression = operand as IsExpression;
1024 if (isExpression.notOperator != null) { 1000 if (isExpression.notOperator != null) {
1025 _coverageMarker(); 1001 _coverageMarker();
1026 return; 1002 return;
1027 } 1003 }
1028 1004
1029 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1005 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1030 await changeBuilder.addFileEdit(file, fileStamp, 1006 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1031 (DartFileEditBuilder builder) {
1032 if (getExpressionParentPrecedence(prefExpression) >= 1007 if (getExpressionParentPrecedence(prefExpression) >=
1033 TokenClass.RELATIONAL_OPERATOR.precedence) { 1008 TokenClass.RELATIONAL_OPERATOR.precedence) {
1034 builder.addDeletion(range.token(prefExpression.operator)); 1009 builder.addDeletion(range.token(prefExpression.operator));
1035 } else { 1010 } else {
1036 builder.addDeletion( 1011 builder.addDeletion(
1037 range.startEnd(prefExpression, parExpression.leftParenthesis)); 1012 range.startEnd(prefExpression, parExpression.leftParenthesis));
1038 builder.addDeletion( 1013 builder.addDeletion(
1039 range.startEnd(parExpression.rightParenthesis, prefExpression)); 1014 range.startEnd(parExpression.rightParenthesis, prefExpression));
1040 } 1015 }
1041 builder.addSimpleInsertion(isExpression.isOperator.end, '!'); 1016 builder.addSimpleInsertion(isExpression.isOperator.end, '!');
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 } 1063 }
1089 PrefixExpression prefixExpression = 1064 PrefixExpression prefixExpression =
1090 isEmptyAccess.parent as PrefixExpression; 1065 isEmptyAccess.parent as PrefixExpression;
1091 // should be ! 1066 // should be !
1092 if (prefixExpression.operator.type != TokenType.BANG) { 1067 if (prefixExpression.operator.type != TokenType.BANG) {
1093 _coverageMarker(); 1068 _coverageMarker();
1094 return; 1069 return;
1095 } 1070 }
1096 1071
1097 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1072 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1098 await changeBuilder.addFileEdit(file, fileStamp, 1073 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1099 (DartFileEditBuilder builder) {
1100 builder.addDeletion( 1074 builder.addDeletion(
1101 range.startStart(prefixExpression, prefixExpression.operand)); 1075 range.startStart(prefixExpression, prefixExpression.operand));
1102 builder.addSimpleReplacement(range.node(isEmptyIdentifier), 'isNotEmpty'); 1076 builder.addSimpleReplacement(range.node(isEmptyIdentifier), 'isNotEmpty');
1103 }); 1077 });
1104 _addAssistFromBuilder( 1078 _addAssistFromBuilder(
1105 changeBuilder, DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY); 1079 changeBuilder, DartAssistKind.CONVERT_INTO_IS_NOT_EMPTY);
1106 } 1080 }
1107 1081
1108 Future<Null> _addProposal_convertToNormalParameter() async { 1082 Future<Null> _addProposal_convertToNormalParameter() async {
1109 if (node is SimpleIdentifier && 1083 if (node is SimpleIdentifier &&
1110 node.parent is FieldFormalParameter && 1084 node.parent is FieldFormalParameter &&
1111 node.parent.parent is FormalParameterList && 1085 node.parent.parent is FormalParameterList &&
1112 node.parent.parent.parent is ConstructorDeclaration) { 1086 node.parent.parent.parent is ConstructorDeclaration) {
1113 ConstructorDeclaration constructor = node.parent.parent.parent; 1087 ConstructorDeclaration constructor = node.parent.parent.parent;
1114 FormalParameterList parameterList = node.parent.parent; 1088 FormalParameterList parameterList = node.parent.parent;
1115 FieldFormalParameter parameter = node.parent; 1089 FieldFormalParameter parameter = node.parent;
1116 ParameterElement parameterElement = parameter.element; 1090 ParameterElement parameterElement = parameter.element;
1117 String name = (node as SimpleIdentifier).name; 1091 String name = (node as SimpleIdentifier).name;
1118 // prepare type 1092 // prepare type
1119 DartType type = parameterElement.type; 1093 DartType type = parameterElement.type;
1120 Set<Source> librariesToImport = new Set<Source>(); 1094 Set<Source> librariesToImport = new Set<Source>();
1121 String typeCode = utils.getTypeSource(type, librariesToImport); 1095 String typeCode = utils.getTypeSource(type, librariesToImport);
1122 1096
1123 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1097 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1124 await changeBuilder.addFileEdit(file, fileStamp, 1098 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1125 (DartFileEditBuilder builder) {
1126 // replace parameter 1099 // replace parameter
1127 if (type.isDynamic) { 1100 if (type.isDynamic) {
1128 builder.addSimpleReplacement(range.node(parameter), name); 1101 builder.addSimpleReplacement(range.node(parameter), name);
1129 } else { 1102 } else {
1130 builder.addSimpleReplacement( 1103 builder.addSimpleReplacement(
1131 range.node(parameter), '$typeCode $name'); 1104 range.node(parameter), '$typeCode $name');
1132 } 1105 }
1133 // add field initializer 1106 // add field initializer
1134 List<ConstructorInitializer> initializers = constructor.initializers; 1107 List<ConstructorInitializer> initializers = constructor.initializers;
1135 if (initializers.isEmpty) { 1108 if (initializers.isEmpty) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 if (Identifier.isPrivateName(name)) { 1154 if (Identifier.isPrivateName(name)) {
1182 _coverageMarker(); 1155 _coverageMarker();
1183 return; 1156 return;
1184 } 1157 }
1185 // should be on the name 1158 // should be on the name
1186 if (nameNode != node) { 1159 if (nameNode != node) {
1187 _coverageMarker(); 1160 _coverageMarker();
1188 return; 1161 return;
1189 } 1162 }
1190 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1163 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1191 await changeBuilder.addFileEdit(file, fileStamp, 1164 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1192 (DartFileEditBuilder builder) {
1193 // rename field 1165 // rename field
1194 builder.addSimpleReplacement(range.node(nameNode), '_$name'); 1166 builder.addSimpleReplacement(range.node(nameNode), '_$name');
1195 // update references in constructors 1167 // update references in constructors
1196 ClassDeclaration classDeclaration = fieldDeclaration.parent; 1168 ClassDeclaration classDeclaration = fieldDeclaration.parent;
1197 for (ClassMember member in classDeclaration.members) { 1169 for (ClassMember member in classDeclaration.members) {
1198 if (member is ConstructorDeclaration) { 1170 if (member is ConstructorDeclaration) {
1199 for (FormalParameter parameter in member.parameters.parameters) { 1171 for (FormalParameter parameter in member.parameters.parameters) {
1200 ParameterElement parameterElement = parameter.element; 1172 ParameterElement parameterElement = parameter.element;
1201 if (parameterElement is FieldFormalParameterElement && 1173 if (parameterElement is FieldFormalParameterElement &&
1202 parameterElement.field == fieldElement) { 1174 parameterElement.field == fieldElement) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 if (operatorType == TokenType.LT) { 1230 if (operatorType == TokenType.LT) {
1259 newOperator = '>'; 1231 newOperator = '>';
1260 } else if (operatorType == TokenType.LT_EQ) { 1232 } else if (operatorType == TokenType.LT_EQ) {
1261 newOperator = '>='; 1233 newOperator = '>=';
1262 } else if (operatorType == TokenType.GT) { 1234 } else if (operatorType == TokenType.GT) {
1263 newOperator = '<'; 1235 newOperator = '<';
1264 } else if (operatorType == TokenType.GT_EQ) { 1236 } else if (operatorType == TokenType.GT_EQ) {
1265 newOperator = '<='; 1237 newOperator = '<=';
1266 } 1238 }
1267 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1239 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1268 await changeBuilder.addFileEdit(file, fileStamp, 1240 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1269 (DartFileEditBuilder builder) {
1270 builder.addSimpleReplacement(leftRange, _getRangeText(rightRange)); 1241 builder.addSimpleReplacement(leftRange, _getRangeText(rightRange));
1271 builder.addSimpleReplacement(rightRange, _getRangeText(leftRange)); 1242 builder.addSimpleReplacement(rightRange, _getRangeText(leftRange));
1272 // Optionally replace the operator. 1243 // Optionally replace the operator.
1273 if (newOperator != null) { 1244 if (newOperator != null) {
1274 builder.addSimpleReplacement(range.token(operator), newOperator); 1245 builder.addSimpleReplacement(range.token(operator), newOperator);
1275 } 1246 }
1276 }); 1247 });
1277 _addAssistFromBuilder(changeBuilder, DartAssistKind.EXCHANGE_OPERANDS); 1248 _addAssistFromBuilder(changeBuilder, DartAssistKind.EXCHANGE_OPERANDS);
1278 } 1249 }
1279 1250
(...skipping 26 matching lines...) Expand all
1306 referencedNames.add(element.displayName); 1277 referencedNames.add(element.displayName);
1307 } 1278 }
1308 }); 1279 });
1309 unit.accept(visitor); 1280 unit.accept(visitor);
1310 // ignore if unused 1281 // ignore if unused
1311 if (referencedNames.isEmpty) { 1282 if (referencedNames.isEmpty) {
1312 _coverageMarker(); 1283 _coverageMarker();
1313 return; 1284 return;
1314 } 1285 }
1315 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1286 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1316 await changeBuilder.addFileEdit(file, fileStamp, 1287 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1317 (DartFileEditBuilder builder) {
1318 String showCombinator = ' show ${referencedNames.join(', ')}'; 1288 String showCombinator = ' show ${referencedNames.join(', ')}';
1319 builder.addSimpleInsertion(importDirective.end - 1, showCombinator); 1289 builder.addSimpleInsertion(importDirective.end - 1, showCombinator);
1320 }); 1290 });
1321 _addAssistFromBuilder(changeBuilder, DartAssistKind.IMPORT_ADD_SHOW); 1291 _addAssistFromBuilder(changeBuilder, DartAssistKind.IMPORT_ADD_SHOW);
1322 } 1292 }
1323 1293
1324 Future<Null> _addProposal_introduceLocalTestedType() async { 1294 Future<Null> _addProposal_introduceLocalTestedType() async {
1325 AstNode node = this.node; 1295 AstNode node = this.node;
1326 if (node is IfStatement) { 1296 if (node is IfStatement) {
1327 node = (node as IfStatement).condition; 1297 node = (node as IfStatement).condition;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1366 Set<String> excluded = new Set<String>(); 1336 Set<String> excluded = new Set<String>();
1367 ScopedNameFinder scopedNameFinder = new ScopedNameFinder(offset); 1337 ScopedNameFinder scopedNameFinder = new ScopedNameFinder(offset);
1368 isExpression.accept(scopedNameFinder); 1338 isExpression.accept(scopedNameFinder);
1369 excluded.addAll(scopedNameFinder.locals.keys.toSet()); 1339 excluded.addAll(scopedNameFinder.locals.keys.toSet());
1370 // name(s) 1340 // name(s)
1371 List<String> suggestions = 1341 List<String> suggestions =
1372 getVariableNameSuggestionsForExpression(castType, null, excluded); 1342 getVariableNameSuggestionsForExpression(castType, null, excluded);
1373 1343
1374 if (suggestions.isNotEmpty) { 1344 if (suggestions.isNotEmpty) {
1375 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1345 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1376 await changeBuilder.addFileEdit(file, fileStamp, 1346 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1377 (DartFileEditBuilder builder) {
1378 builder.addInsertion(offset, (DartEditBuilder builder) { 1347 builder.addInsertion(offset, (DartEditBuilder builder) {
1379 builder.write(eol + prefix + statementPrefix); 1348 builder.write(eol + prefix + statementPrefix);
1380 builder.write(castTypeCode); 1349 builder.write(castTypeCode);
1381 builder.write(' '); 1350 builder.write(' ');
1382 builder.addSimpleLinkedEdit('NAME', suggestions[0], 1351 builder.addSimpleLinkedEdit('NAME', suggestions[0],
1383 kind: LinkedEditSuggestionKind.VARIABLE, 1352 kind: LinkedEditSuggestionKind.VARIABLE,
1384 suggestions: suggestions); 1353 suggestions: suggestions);
1385 builder.write(' = '); 1354 builder.write(' = ');
1386 builder.write(_getNodeText(isExpression.expression)); 1355 builder.write(_getNodeText(isExpression.expression));
1387 builder.write(';'); 1356 builder.write(';');
(...skipping 16 matching lines...) Expand all
1404 Statement elseStatement = ifStatement.elseStatement; 1373 Statement elseStatement = ifStatement.elseStatement;
1405 if (thenStatement == null || elseStatement == null) { 1374 if (thenStatement == null || elseStatement == null) {
1406 return; 1375 return;
1407 } 1376 }
1408 // prepare source 1377 // prepare source
1409 String invertedCondition = utils.invertCondition(condition); 1378 String invertedCondition = utils.invertCondition(condition);
1410 String thenSource = _getNodeText(thenStatement); 1379 String thenSource = _getNodeText(thenStatement);
1411 String elseSource = _getNodeText(elseStatement); 1380 String elseSource = _getNodeText(elseStatement);
1412 1381
1413 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1382 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1414 await changeBuilder.addFileEdit(file, fileStamp, 1383 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1415 (DartFileEditBuilder builder) {
1416 builder.addSimpleReplacement(range.node(condition), invertedCondition); 1384 builder.addSimpleReplacement(range.node(condition), invertedCondition);
1417 builder.addSimpleReplacement(range.node(thenStatement), elseSource); 1385 builder.addSimpleReplacement(range.node(thenStatement), elseSource);
1418 builder.addSimpleReplacement(range.node(elseStatement), thenSource); 1386 builder.addSimpleReplacement(range.node(elseStatement), thenSource);
1419 }); 1387 });
1420 _addAssistFromBuilder(changeBuilder, DartAssistKind.INVERT_IF_STATEMENT); 1388 _addAssistFromBuilder(changeBuilder, DartAssistKind.INVERT_IF_STATEMENT);
1421 } 1389 }
1422 1390
1423 Future<Null> _addProposal_joinIfStatementInner() async { 1391 Future<Null> _addProposal_joinIfStatementInner() async {
1424 // climb up condition to the (supposedly) "if" statement 1392 // climb up condition to the (supposedly) "if" statement
1425 AstNode node = this.node; 1393 AstNode node = this.node;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1466 condition = '$targetConditionSource && $innerConditionSource'; 1434 condition = '$targetConditionSource && $innerConditionSource';
1467 } 1435 }
1468 // replace target "if" statement 1436 // replace target "if" statement
1469 Statement innerThenStatement = innerIfStatement.thenStatement; 1437 Statement innerThenStatement = innerIfStatement.thenStatement;
1470 List<Statement> innerThenStatements = getStatements(innerThenStatement); 1438 List<Statement> innerThenStatements = getStatements(innerThenStatement);
1471 SourceRange lineRanges = utils.getLinesRangeStatements(innerThenStatements); 1439 SourceRange lineRanges = utils.getLinesRangeStatements(innerThenStatements);
1472 String oldSource = utils.getRangeText(lineRanges); 1440 String oldSource = utils.getRangeText(lineRanges);
1473 String newSource = utils.indentSourceLeftRight(oldSource, false); 1441 String newSource = utils.indentSourceLeftRight(oldSource, false);
1474 1442
1475 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1443 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1476 await changeBuilder.addFileEdit(file, fileStamp, 1444 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1477 (DartFileEditBuilder builder) {
1478 builder.addSimpleReplacement(range.node(targetIfStatement), 1445 builder.addSimpleReplacement(range.node(targetIfStatement),
1479 'if ($condition) {$eol$newSource$prefix}'); 1446 'if ($condition) {$eol$newSource$prefix}');
1480 }); 1447 });
1481 _addAssistFromBuilder(changeBuilder, DartAssistKind.JOIN_IF_WITH_INNER); 1448 _addAssistFromBuilder(changeBuilder, DartAssistKind.JOIN_IF_WITH_INNER);
1482 } 1449 }
1483 1450
1484 Future<Null> _addProposal_joinIfStatementOuter() async { 1451 Future<Null> _addProposal_joinIfStatementOuter() async {
1485 // climb up condition to the (supposedly) "if" statement 1452 // climb up condition to the (supposedly) "if" statement
1486 AstNode node = this.node; 1453 AstNode node = this.node;
1487 while (node is Expression) { 1454 while (node is Expression) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 String condition = '$outerConditionSource && $targetConditionSource'; 1498 String condition = '$outerConditionSource && $targetConditionSource';
1532 // replace outer "if" statement 1499 // replace outer "if" statement
1533 Statement targetThenStatement = targetIfStatement.thenStatement; 1500 Statement targetThenStatement = targetIfStatement.thenStatement;
1534 List<Statement> targetThenStatements = getStatements(targetThenStatement); 1501 List<Statement> targetThenStatements = getStatements(targetThenStatement);
1535 SourceRange lineRanges = 1502 SourceRange lineRanges =
1536 utils.getLinesRangeStatements(targetThenStatements); 1503 utils.getLinesRangeStatements(targetThenStatements);
1537 String oldSource = utils.getRangeText(lineRanges); 1504 String oldSource = utils.getRangeText(lineRanges);
1538 String newSource = utils.indentSourceLeftRight(oldSource, false); 1505 String newSource = utils.indentSourceLeftRight(oldSource, false);
1539 1506
1540 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1507 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1541 await changeBuilder.addFileEdit(file, fileStamp, 1508 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1542 (DartFileEditBuilder builder) {
1543 builder.addSimpleReplacement(range.node(outerIfStatement), 1509 builder.addSimpleReplacement(range.node(outerIfStatement),
1544 'if ($condition) {$eol$newSource$prefix}'); 1510 'if ($condition) {$eol$newSource$prefix}');
1545 }); 1511 });
1546 _addAssistFromBuilder(changeBuilder, DartAssistKind.JOIN_IF_WITH_OUTER); 1512 _addAssistFromBuilder(changeBuilder, DartAssistKind.JOIN_IF_WITH_OUTER);
1547 } 1513 }
1548 1514
1549 Future<Null> _addProposal_joinVariableDeclaration_onAssignment() async { 1515 Future<Null> _addProposal_joinVariableDeclaration_onAssignment() async {
1550 // check that node is LHS in assignment 1516 // check that node is LHS in assignment
1551 if (node is SimpleIdentifier && 1517 if (node is SimpleIdentifier &&
1552 node.parent is AssignmentExpression && 1518 node.parent is AssignmentExpression &&
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1602 Block block = assignStatement.parent as Block; 1568 Block block = assignStatement.parent as Block;
1603 // check that "declaration" and "assignment" statements are adjacent 1569 // check that "declaration" and "assignment" statements are adjacent
1604 List<Statement> statements = block.statements; 1570 List<Statement> statements = block.statements;
1605 if (statements.indexOf(assignStatement) == 1571 if (statements.indexOf(assignStatement) ==
1606 statements.indexOf(declStatement) + 1) {} else { 1572 statements.indexOf(declStatement) + 1) {} else {
1607 _coverageMarker(); 1573 _coverageMarker();
1608 return; 1574 return;
1609 } 1575 }
1610 1576
1611 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1577 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1612 await changeBuilder.addFileEdit(file, fileStamp, 1578 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1613 (DartFileEditBuilder builder) {
1614 builder.addSimpleReplacement( 1579 builder.addSimpleReplacement(
1615 range.endStart(declNode, assignExpression.operator), ' '); 1580 range.endStart(declNode, assignExpression.operator), ' ');
1616 }); 1581 });
1617 _addAssistFromBuilder( 1582 _addAssistFromBuilder(
1618 changeBuilder, DartAssistKind.JOIN_VARIABLE_DECLARATION); 1583 changeBuilder, DartAssistKind.JOIN_VARIABLE_DECLARATION);
1619 } 1584 }
1620 1585
1621 Future<Null> _addProposal_joinVariableDeclaration_onDeclaration() async { 1586 Future<Null> _addProposal_joinVariableDeclaration_onDeclaration() async {
1622 // prepare enclosing VariableDeclarationList 1587 // prepare enclosing VariableDeclarationList
1623 VariableDeclarationList declList = 1588 VariableDeclarationList declList =
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1666 } 1631 }
1667 assignExpression = expressionStatement.expression as AssignmentExpression; 1632 assignExpression = expressionStatement.expression as AssignmentExpression;
1668 } 1633 }
1669 // check that pure assignment 1634 // check that pure assignment
1670 if (assignExpression.operator.type != TokenType.EQ) { 1635 if (assignExpression.operator.type != TokenType.EQ) {
1671 _coverageMarker(); 1636 _coverageMarker();
1672 return; 1637 return;
1673 } 1638 }
1674 1639
1675 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1640 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1676 await changeBuilder.addFileEdit(file, fileStamp, 1641 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1677 (DartFileEditBuilder builder) {
1678 builder.addSimpleReplacement( 1642 builder.addSimpleReplacement(
1679 range.endStart(decl.name, assignExpression.operator), ' '); 1643 range.endStart(decl.name, assignExpression.operator), ' ');
1680 }); 1644 });
1681 _addAssistFromBuilder( 1645 _addAssistFromBuilder(
1682 changeBuilder, DartAssistKind.JOIN_VARIABLE_DECLARATION); 1646 changeBuilder, DartAssistKind.JOIN_VARIABLE_DECLARATION);
1683 } 1647 }
1684 1648
1685 Future<Null> _addProposal_moveFlutterWidgetDown() async { 1649 Future<Null> _addProposal_moveFlutterWidgetDown() async {
1686 InstanceCreationExpression exprGoingDown = identifyNewExpression(node); 1650 InstanceCreationExpression exprGoingDown = identifyNewExpression(node);
1687 if (exprGoingDown == null || 1651 if (exprGoingDown == null ||
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 } 1734 }
1771 // must be not after the name of the variable 1735 // must be not after the name of the variable
1772 VariableDeclaration firstVariable = declarationList.variables[0]; 1736 VariableDeclaration firstVariable = declarationList.variables[0];
1773 if (selectionOffset > firstVariable.name.end) { 1737 if (selectionOffset > firstVariable.name.end) {
1774 _coverageMarker(); 1738 _coverageMarker();
1775 return; 1739 return;
1776 } 1740 }
1777 // add edit 1741 // add edit
1778 Token keyword = declarationList.keyword; 1742 Token keyword = declarationList.keyword;
1779 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1743 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1780 await changeBuilder.addFileEdit(file, fileStamp, 1744 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1781 (DartFileEditBuilder builder) {
1782 SourceRange typeRange = range.startStart(typeNode, firstVariable); 1745 SourceRange typeRange = range.startStart(typeNode, firstVariable);
1783 if (keyword != null && keyword.lexeme != 'var') { 1746 if (keyword != null && keyword.lexeme != 'var') {
1784 builder.addSimpleReplacement(typeRange, ''); 1747 builder.addSimpleReplacement(typeRange, '');
1785 } else { 1748 } else {
1786 builder.addSimpleReplacement(typeRange, 'var '); 1749 builder.addSimpleReplacement(typeRange, 'var ');
1787 } 1750 }
1788 }); 1751 });
1789 _addAssistFromBuilder(changeBuilder, DartAssistKind.REMOVE_TYPE_ANNOTATION); 1752 _addAssistFromBuilder(changeBuilder, DartAssistKind.REMOVE_TYPE_ANNOTATION);
1790 } 1753 }
1791 1754
(...skipping 11 matching lines...) Expand all
1803 int newlineIdx = literalSrc.lastIndexOf(eol); 1766 int newlineIdx = literalSrc.lastIndexOf(eol);
1804 if (newlineIdx < 0 || newlineIdx == literalSrc.length - 1) { 1767 if (newlineIdx < 0 || newlineIdx == literalSrc.length - 1) {
1805 _coverageMarker(); 1768 _coverageMarker();
1806 return; // Lists need to be in multi-line format already. 1769 return; // Lists need to be in multi-line format already.
1807 } 1770 }
1808 String indentOld = utils.getLinePrefix(node.offset + 1 + newlineIdx); 1771 String indentOld = utils.getLinePrefix(node.offset + 1 + newlineIdx);
1809 String indentArg = '$indentOld${utils.getIndent(1)}'; 1772 String indentArg = '$indentOld${utils.getIndent(1)}';
1810 String indentList = '$indentOld${utils.getIndent(2)}'; 1773 String indentList = '$indentOld${utils.getIndent(2)}';
1811 1774
1812 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1775 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1813 await changeBuilder.addFileEdit(file, fileStamp, 1776 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1814 (DartFileEditBuilder builder) {
1815 builder.addReplacement(range.node(node), (DartEditBuilder builder) { 1777 builder.addReplacement(range.node(node), (DartEditBuilder builder) {
1816 builder.write('['); 1778 builder.write('[');
1817 builder.write(eol); 1779 builder.write(eol);
1818 builder.write(indentArg); 1780 builder.write(indentArg);
1819 builder.write('new '); 1781 builder.write('new ');
1820 builder.addSimpleLinkedEdit('WIDGET', 'widget'); 1782 builder.addSimpleLinkedEdit('WIDGET', 'widget');
1821 builder.write('('); 1783 builder.write('(');
1822 builder.write(eol); 1784 builder.write(eol);
1823 builder.write(indentList); 1785 builder.write(indentList);
1824 // Linked editing not needed since arg is always a list. 1786 // Linked editing not needed since arg is always a list.
(...skipping 15 matching lines...) Expand all
1840 1802
1841 Future<Null> _addProposal_reparentFlutterWidget() async { 1803 Future<Null> _addProposal_reparentFlutterWidget() async {
1842 InstanceCreationExpression newExpr = identifyNewExpression(node); 1804 InstanceCreationExpression newExpr = identifyNewExpression(node);
1843 if (newExpr == null || !isFlutterInstanceCreationExpression(newExpr)) { 1805 if (newExpr == null || !isFlutterInstanceCreationExpression(newExpr)) {
1844 _coverageMarker(); 1806 _coverageMarker();
1845 return; 1807 return;
1846 } 1808 }
1847 String newExprSrc = utils.getNodeText(newExpr); 1809 String newExprSrc = utils.getNodeText(newExpr);
1848 1810
1849 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1811 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1850 await changeBuilder.addFileEdit(file, fileStamp, 1812 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1851 (DartFileEditBuilder builder) {
1852 builder.addReplacement(range.node(newExpr), (DartEditBuilder builder) { 1813 builder.addReplacement(range.node(newExpr), (DartEditBuilder builder) {
1853 builder.write('new '); 1814 builder.write('new ');
1854 builder.addSimpleLinkedEdit('WIDGET', 'widget'); 1815 builder.addSimpleLinkedEdit('WIDGET', 'widget');
1855 builder.write('('); 1816 builder.write('(');
1856 if (newExprSrc.contains(eol)) { 1817 if (newExprSrc.contains(eol)) {
1857 int newlineIdx = newExprSrc.lastIndexOf(eol); 1818 int newlineIdx = newExprSrc.lastIndexOf(eol);
1858 int eolLen = eol.length; 1819 int eolLen = eol.length;
1859 if (newlineIdx == newExprSrc.length - eolLen) { 1820 if (newlineIdx == newExprSrc.length - eolLen) {
1860 newlineIdx -= eolLen; 1821 newlineIdx -= eolLen;
1861 } 1822 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1922 conditional = returnStatement.expression as ConditionalExpression; 1883 conditional = returnStatement.expression as ConditionalExpression;
1923 inReturn = true; 1884 inReturn = true;
1924 } 1885 }
1925 } 1886 }
1926 // prepare environment 1887 // prepare environment
1927 String indent = utils.getIndent(1); 1888 String indent = utils.getIndent(1);
1928 String prefix = utils.getNodePrefix(statement); 1889 String prefix = utils.getNodePrefix(statement);
1929 1890
1930 if (inVariable || inAssignment || inReturn) { 1891 if (inVariable || inAssignment || inReturn) {
1931 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1892 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
1932 await changeBuilder.addFileEdit(file, fileStamp, 1893 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
1933 (DartFileEditBuilder builder) {
1934 // Type v = Conditional; 1894 // Type v = Conditional;
1935 if (inVariable) { 1895 if (inVariable) {
1936 VariableDeclaration variable = 1896 VariableDeclaration variable =
1937 conditional.parent as VariableDeclaration; 1897 conditional.parent as VariableDeclaration;
1938 builder.addDeletion(range.endEnd(variable.name, conditional)); 1898 builder.addDeletion(range.endEnd(variable.name, conditional));
1939 String conditionSrc = _getNodeText(conditional.condition); 1899 String conditionSrc = _getNodeText(conditional.condition);
1940 String thenSrc = _getNodeText(conditional.thenExpression); 1900 String thenSrc = _getNodeText(conditional.thenExpression);
1941 String elseSrc = _getNodeText(conditional.elseExpression); 1901 String elseSrc = _getNodeText(conditional.elseExpression);
1942 String name = variable.name.name; 1902 String name = variable.name.name;
1943 String src = eol; 1903 String src = eol;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2012 if (thenStatement.expression is AssignmentExpression && 1972 if (thenStatement.expression is AssignmentExpression &&
2013 elseStatement.expression is AssignmentExpression) { 1973 elseStatement.expression is AssignmentExpression) {
2014 hasExpressionStatements = true; 1974 hasExpressionStatements = true;
2015 thenExpression = thenStatement.expression; 1975 thenExpression = thenStatement.expression;
2016 elseExpression = elseStatement.expression; 1976 elseExpression = elseStatement.expression;
2017 } 1977 }
2018 } 1978 }
2019 1979
2020 if (hasReturnStatements || hasExpressionStatements) { 1980 if (hasReturnStatements || hasExpressionStatements) {
2021 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 1981 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2022 await changeBuilder.addFileEdit(file, fileStamp, 1982 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2023 (DartFileEditBuilder builder) {
2024 // returns 1983 // returns
2025 if (hasReturnStatements) { 1984 if (hasReturnStatements) {
2026 String conditionSrc = _getNodeText(ifStatement.condition); 1985 String conditionSrc = _getNodeText(ifStatement.condition);
2027 String theSrc = _getNodeText(thenExpression); 1986 String theSrc = _getNodeText(thenExpression);
2028 String elseSrc = _getNodeText(elseExpression); 1987 String elseSrc = _getNodeText(elseExpression);
2029 builder.addSimpleReplacement(range.node(ifStatement), 1988 builder.addSimpleReplacement(range.node(ifStatement),
2030 'return $conditionSrc ? $theSrc : $elseSrc;'); 1989 'return $conditionSrc ? $theSrc : $elseSrc;');
2031 } 1990 }
2032 // assignments -> v = Conditional; 1991 // assignments -> v = Conditional;
2033 if (hasExpressionStatements) { 1992 if (hasExpressionStatements) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2097 String indent = utils.getIndent(1); 2056 String indent = utils.getIndent(1);
2098 // prepare "rightCondition" 2057 // prepare "rightCondition"
2099 String rightConditionSource; 2058 String rightConditionSource;
2100 { 2059 {
2101 SourceRange rightConditionRange = 2060 SourceRange rightConditionRange =
2102 range.startEnd(binaryExpression.rightOperand, condition); 2061 range.startEnd(binaryExpression.rightOperand, condition);
2103 rightConditionSource = _getRangeText(rightConditionRange); 2062 rightConditionSource = _getRangeText(rightConditionRange);
2104 } 2063 }
2105 2064
2106 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2065 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2107 await changeBuilder.addFileEdit(file, fileStamp, 2066 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2108 (DartFileEditBuilder builder) {
2109 // remove "&& rightCondition" 2067 // remove "&& rightCondition"
2110 builder 2068 builder
2111 .addDeletion(range.endEnd(binaryExpression.leftOperand, condition)); 2069 .addDeletion(range.endEnd(binaryExpression.leftOperand, condition));
2112 // update "then" statement 2070 // update "then" statement
2113 Statement thenStatement = ifStatement.thenStatement; 2071 Statement thenStatement = ifStatement.thenStatement;
2114 if (thenStatement is Block) { 2072 if (thenStatement is Block) {
2115 Block thenBlock = thenStatement; 2073 Block thenBlock = thenStatement;
2116 SourceRange thenBlockRange = range.node(thenBlock); 2074 SourceRange thenBlockRange = range.node(thenBlock);
2117 // insert inner "if" with right part of "condition" 2075 // insert inner "if" with right part of "condition"
2118 int thenBlockInsideOffset = thenBlockRange.offset + 1; 2076 int thenBlockInsideOffset = thenBlockRange.offset + 1;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 return; 2116 return;
2159 } 2117 }
2160 VariableDeclaration variable = variables[0]; 2118 VariableDeclaration variable = variables[0];
2161 // prepare initializer 2119 // prepare initializer
2162 Expression initializer = variable.initializer; 2120 Expression initializer = variable.initializer;
2163 if (initializer == null) { 2121 if (initializer == null) {
2164 _coverageMarker(); 2122 _coverageMarker();
2165 return; 2123 return;
2166 } 2124 }
2167 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2125 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2168 await changeBuilder.addFileEdit(file, fileStamp, 2126 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2169 (DartFileEditBuilder builder) {
2170 // remove initializer value 2127 // remove initializer value
2171 builder.addDeletion(range.endStart(variable.name, statement.semicolon)); 2128 builder.addDeletion(range.endStart(variable.name, statement.semicolon));
2172 // add assignment statement 2129 // add assignment statement
2173 String indent = utils.getNodePrefix(statement); 2130 String indent = utils.getNodePrefix(statement);
2174 String name = variable.name.name; 2131 String name = variable.name.name;
2175 String initSrc = _getNodeText(initializer); 2132 String initSrc = _getNodeText(initializer);
2176 SourceRange assignRange = range.endLength(statement, 0); 2133 SourceRange assignRange = range.endLength(statement, 0);
2177 builder.addSimpleReplacement( 2134 builder.addSimpleReplacement(
2178 assignRange, eol + indent + name + ' = ' + initSrc + ';'); 2135 assignRange, eol + indent + name + ' = ' + initSrc + ';');
2179 }); 2136 });
(...skipping 28 matching lines...) Expand all
2208 SourceRange statementsRange = 2165 SourceRange statementsRange =
2209 utils.getLinesRangeStatements(selectedStatements); 2166 utils.getLinesRangeStatements(selectedStatements);
2210 // prepare environment 2167 // prepare environment
2211 String indentOld = utils.getNodePrefix(firstStatement); 2168 String indentOld = utils.getNodePrefix(firstStatement);
2212 String indentNew = '$indentOld${utils.getIndent(1)}'; 2169 String indentNew = '$indentOld${utils.getIndent(1)}';
2213 String indentedCode = 2170 String indentedCode =
2214 utils.replaceSourceRangeIndent(statementsRange, indentOld, indentNew); 2171 utils.replaceSourceRangeIndent(statementsRange, indentOld, indentNew);
2215 // "block" 2172 // "block"
2216 { 2173 {
2217 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2174 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2218 await changeBuilder.addFileEdit(file, fileStamp, 2175 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2219 (DartFileEditBuilder builder) {
2220 builder.addSimpleInsertion(statementsRange.offset, '$indentOld{$eol'); 2176 builder.addSimpleInsertion(statementsRange.offset, '$indentOld{$eol');
2221 builder.addSimpleReplacement( 2177 builder.addSimpleReplacement(
2222 statementsRange, 2178 statementsRange,
2223 utils.replaceSourceRangeIndent( 2179 utils.replaceSourceRangeIndent(
2224 statementsRange, indentOld, indentNew)); 2180 statementsRange, indentOld, indentNew));
2225 builder.addSimpleInsertion(statementsRange.end, '$indentOld}$eol'); 2181 builder.addSimpleInsertion(statementsRange.end, '$indentOld}$eol');
2226 exitPosition = _newPosition(lastStatement.end); 2182 exitPosition = _newPosition(lastStatement.end);
2227 }); 2183 });
2228 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_BLOCK); 2184 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_BLOCK);
2229 } 2185 }
2230 // "if" 2186 // "if"
2231 { 2187 {
2232 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2188 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2233 await changeBuilder.addFileEdit(file, fileStamp, 2189 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2234 (DartFileEditBuilder builder) {
2235 builder.addReplacement(statementsRange, (DartEditBuilder builder) { 2190 builder.addReplacement(statementsRange, (DartEditBuilder builder) {
2236 builder.write(indentOld); 2191 builder.write(indentOld);
2237 builder.write('if ('); 2192 builder.write('if (');
2238 builder.addSimpleLinkedEdit('CONDITION', 'condition'); 2193 builder.addSimpleLinkedEdit('CONDITION', 'condition');
2239 builder.write(') {'); 2194 builder.write(') {');
2240 builder.write(eol); 2195 builder.write(eol);
2241 builder.write(indentedCode); 2196 builder.write(indentedCode);
2242 builder.write(indentOld); 2197 builder.write(indentOld);
2243 builder.write('}'); 2198 builder.write('}');
2244 builder.selectHere(); 2199 builder.selectHere();
2245 builder.write(eol); 2200 builder.write(eol);
2246 }); 2201 });
2247 }); 2202 });
2248 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_IF); 2203 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_IF);
2249 } 2204 }
2250 // "while" 2205 // "while"
2251 { 2206 {
2252 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2207 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2253 await changeBuilder.addFileEdit(file, fileStamp, 2208 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2254 (DartFileEditBuilder builder) {
2255 builder.addReplacement(statementsRange, (DartEditBuilder builder) { 2209 builder.addReplacement(statementsRange, (DartEditBuilder builder) {
2256 builder.write(indentOld); 2210 builder.write(indentOld);
2257 builder.write('while ('); 2211 builder.write('while (');
2258 builder.addSimpleLinkedEdit('CONDITION', 'condition'); 2212 builder.addSimpleLinkedEdit('CONDITION', 'condition');
2259 builder.write(') {'); 2213 builder.write(') {');
2260 builder.write(eol); 2214 builder.write(eol);
2261 builder.write(indentedCode); 2215 builder.write(indentedCode);
2262 builder.write(indentOld); 2216 builder.write(indentOld);
2263 builder.write('}'); 2217 builder.write('}');
2264 builder.selectHere(); 2218 builder.selectHere();
2265 builder.write(eol); 2219 builder.write(eol);
2266 }); 2220 });
2267 }); 2221 });
2268 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_WHILE); 2222 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_WHILE);
2269 } 2223 }
2270 // "for-in" 2224 // "for-in"
2271 { 2225 {
2272 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2226 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2273 await changeBuilder.addFileEdit(file, fileStamp, 2227 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2274 (DartFileEditBuilder builder) {
2275 builder.addReplacement(statementsRange, (DartEditBuilder builder) { 2228 builder.addReplacement(statementsRange, (DartEditBuilder builder) {
2276 builder.write(indentOld); 2229 builder.write(indentOld);
2277 builder.write('for (var '); 2230 builder.write('for (var ');
2278 builder.addSimpleLinkedEdit('NAME', 'item'); 2231 builder.addSimpleLinkedEdit('NAME', 'item');
2279 builder.write(' in '); 2232 builder.write(' in ');
2280 builder.addSimpleLinkedEdit('ITERABLE', 'iterable'); 2233 builder.addSimpleLinkedEdit('ITERABLE', 'iterable');
2281 builder.write(') {'); 2234 builder.write(') {');
2282 builder.write(eol); 2235 builder.write(eol);
2283 builder.write(indentedCode); 2236 builder.write(indentedCode);
2284 builder.write(indentOld); 2237 builder.write(indentOld);
2285 builder.write('}'); 2238 builder.write('}');
2286 builder.selectHere(); 2239 builder.selectHere();
2287 builder.write(eol); 2240 builder.write(eol);
2288 }); 2241 });
2289 }); 2242 });
2290 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_FOR_IN); 2243 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_FOR_IN);
2291 } 2244 }
2292 // "for" 2245 // "for"
2293 { 2246 {
2294 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2247 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2295 await changeBuilder.addFileEdit(file, fileStamp, 2248 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2296 (DartFileEditBuilder builder) {
2297 builder.addReplacement(statementsRange, (DartEditBuilder builder) { 2249 builder.addReplacement(statementsRange, (DartEditBuilder builder) {
2298 builder.write(indentOld); 2250 builder.write(indentOld);
2299 builder.write('for (var '); 2251 builder.write('for (var ');
2300 builder.addSimpleLinkedEdit('VAR', 'v'); 2252 builder.addSimpleLinkedEdit('VAR', 'v');
2301 builder.write(' = '); 2253 builder.write(' = ');
2302 builder.addSimpleLinkedEdit('INIT', 'init'); 2254 builder.addSimpleLinkedEdit('INIT', 'init');
2303 builder.write('; '); 2255 builder.write('; ');
2304 builder.addSimpleLinkedEdit('CONDITION', 'condition'); 2256 builder.addSimpleLinkedEdit('CONDITION', 'condition');
2305 builder.write('; '); 2257 builder.write('; ');
2306 builder.addSimpleLinkedEdit('INCREMENT', 'increment'); 2258 builder.addSimpleLinkedEdit('INCREMENT', 'increment');
2307 builder.write(') {'); 2259 builder.write(') {');
2308 builder.write(eol); 2260 builder.write(eol);
2309 builder.write(indentedCode); 2261 builder.write(indentedCode);
2310 builder.write(indentOld); 2262 builder.write(indentOld);
2311 builder.write('}'); 2263 builder.write('}');
2312 builder.selectHere(); 2264 builder.selectHere();
2313 builder.write(eol); 2265 builder.write(eol);
2314 }); 2266 });
2315 }); 2267 });
2316 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_FOR); 2268 _addAssistFromBuilder(changeBuilder, DartAssistKind.SURROUND_WITH_FOR);
2317 } 2269 }
2318 // "do-while" 2270 // "do-while"
2319 { 2271 {
2320 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2272 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2321 await changeBuilder.addFileEdit(file, fileStamp, 2273 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2322 (DartFileEditBuilder builder) {
2323 builder.addReplacement(statementsRange, (DartEditBuilder builder) { 2274 builder.addReplacement(statementsRange, (DartEditBuilder builder) {
2324 builder.write(indentOld); 2275 builder.write(indentOld);
2325 builder.write('do {'); 2276 builder.write('do {');
2326 builder.write(eol); 2277 builder.write(eol);
2327 builder.write(indentedCode); 2278 builder.write(indentedCode);
2328 builder.write(indentOld); 2279 builder.write(indentOld);
2329 builder.write('} while ('); 2280 builder.write('} while (');
2330 builder.addSimpleLinkedEdit('CONDITION', 'condition'); 2281 builder.addSimpleLinkedEdit('CONDITION', 'condition');
2331 builder.write(');'); 2282 builder.write(');');
2332 builder.selectHere(); 2283 builder.selectHere();
2333 builder.write(eol); 2284 builder.write(eol);
2334 }); 2285 });
2335 }); 2286 });
2336 _addAssistFromBuilder( 2287 _addAssistFromBuilder(
2337 changeBuilder, DartAssistKind.SURROUND_WITH_DO_WHILE); 2288 changeBuilder, DartAssistKind.SURROUND_WITH_DO_WHILE);
2338 } 2289 }
2339 // "try-catch" 2290 // "try-catch"
2340 { 2291 {
2341 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2292 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2342 await changeBuilder.addFileEdit(file, fileStamp, 2293 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2343 (DartFileEditBuilder builder) {
2344 builder.addReplacement(statementsRange, (DartEditBuilder builder) { 2294 builder.addReplacement(statementsRange, (DartEditBuilder builder) {
2345 builder.write(indentOld); 2295 builder.write(indentOld);
2346 builder.write('try {'); 2296 builder.write('try {');
2347 builder.write(eol); 2297 builder.write(eol);
2348 builder.write(indentedCode); 2298 builder.write(indentedCode);
2349 builder.write(indentOld); 2299 builder.write(indentOld);
2350 builder.write('} on '); 2300 builder.write('} on ');
2351 builder.addSimpleLinkedEdit('EXCEPTION_TYPE', 'Exception'); 2301 builder.addSimpleLinkedEdit('EXCEPTION_TYPE', 'Exception');
2352 builder.write(' catch ('); 2302 builder.write(' catch (');
2353 builder.addSimpleLinkedEdit('EXCEPTION_VAR', 'e'); 2303 builder.addSimpleLinkedEdit('EXCEPTION_VAR', 'e');
2354 builder.write(') {'); 2304 builder.write(') {');
2355 builder.write(eol); 2305 builder.write(eol);
2356 // 2306 //
2357 builder.write(indentNew); 2307 builder.write(indentNew);
2358 builder.addSimpleLinkedEdit('CATCH', '// TODO'); 2308 builder.addSimpleLinkedEdit('CATCH', '// TODO');
2359 builder.selectHere(); 2309 builder.selectHere();
2360 builder.write(eol); 2310 builder.write(eol);
2361 // 2311 //
2362 builder.write(indentOld); 2312 builder.write(indentOld);
2363 builder.write('}'); 2313 builder.write('}');
2364 builder.write(eol); 2314 builder.write(eol);
2365 }); 2315 });
2366 }); 2316 });
2367 _addAssistFromBuilder( 2317 _addAssistFromBuilder(
2368 changeBuilder, DartAssistKind.SURROUND_WITH_TRY_CATCH); 2318 changeBuilder, DartAssistKind.SURROUND_WITH_TRY_CATCH);
2369 } 2319 }
2370 // "try-finally" 2320 // "try-finally"
2371 { 2321 {
2372 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2322 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2373 await changeBuilder.addFileEdit(file, fileStamp, 2323 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2374 (DartFileEditBuilder builder) {
2375 builder.addReplacement(statementsRange, (DartEditBuilder builder) { 2324 builder.addReplacement(statementsRange, (DartEditBuilder builder) {
2376 builder.write(indentOld); 2325 builder.write(indentOld);
2377 builder.write('try {'); 2326 builder.write('try {');
2378 builder.write(eol); 2327 builder.write(eol);
2379 // 2328 //
2380 builder.write(indentedCode); 2329 builder.write(indentedCode);
2381 // 2330 //
2382 builder.write(indentOld); 2331 builder.write(indentOld);
2383 builder.write('} finally {'); 2332 builder.write('} finally {');
2384 builder.write(eol); 2333 builder.write(eol);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2462 return utils.getNodeText(node); 2411 return utils.getNodeText(node);
2463 } 2412 }
2464 2413
2465 /** 2414 /**
2466 * Returns the text of the given range in the unit. 2415 * Returns the text of the given range in the unit.
2467 */ 2416 */
2468 String _getRangeText(SourceRange range) { 2417 String _getRangeText(SourceRange range) {
2469 return utils.getRangeText(range); 2418 return utils.getRangeText(range);
2470 } 2419 }
2471 2420
2472 int _modificationStamp(String filePath) {
2473 // TODO(brianwilkerson) We have lost the ability for clients to know whether
2474 // it is safe to apply an edit.
2475 return driver.fsState.getFileForPath(filePath).exists ? 0 : -1;
2476 }
2477
2478 Position _newPosition(int offset) { 2421 Position _newPosition(int offset) {
2479 return new Position(file, offset); 2422 return new Position(file, offset);
2480 } 2423 }
2481 2424
2482 Future<Null> _swapFlutterWidgets( 2425 Future<Null> _swapFlutterWidgets(
2483 InstanceCreationExpression exprGoingDown, 2426 InstanceCreationExpression exprGoingDown,
2484 InstanceCreationExpression exprGoingUp, 2427 InstanceCreationExpression exprGoingUp,
2485 NamedExpression stableChild, 2428 NamedExpression stableChild,
2486 AssistKind assistKind) async { 2429 AssistKind assistKind) async {
2487 String currentSource = unitElement.context.getContents(source).data; 2430 String currentSource = unitElement.context.getContents(source).data;
2488 // TODO(messick) Find a better way to get LineInfo for the source. 2431 // TODO(messick) Find a better way to get LineInfo for the source.
2489 LineInfo lineInfo = new LineInfo.fromContent(currentSource); 2432 LineInfo lineInfo = new LineInfo.fromContent(currentSource);
2490 int currLn = lineInfo.getLocation(exprGoingUp.offset).lineNumber; 2433 int currLn = lineInfo.getLocation(exprGoingUp.offset).lineNumber;
2491 int lnOffset = lineInfo.getOffsetOfLine(currLn); 2434 int lnOffset = lineInfo.getOffsetOfLine(currLn);
2492 2435
2493 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver); 2436 DartChangeBuilder changeBuilder = new DartChangeBuilder(driver);
2494 await changeBuilder.addFileEdit(file, fileStamp, 2437 await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
2495 (DartFileEditBuilder builder) {
2496 builder.addReplacement(range.node(exprGoingDown), 2438 builder.addReplacement(range.node(exprGoingDown),
2497 (DartEditBuilder builder) { 2439 (DartEditBuilder builder) {
2498 String argSrc = 2440 String argSrc =
2499 utils.getText(exprGoingUp.offset, lnOffset - exprGoingUp.offset); 2441 utils.getText(exprGoingUp.offset, lnOffset - exprGoingUp.offset);
2500 builder.write(argSrc); // Append child new-expr plus rest of line. 2442 builder.write(argSrc); // Append child new-expr plus rest of line.
2501 2443
2502 String getSrc(Expression expr) { 2444 String getSrc(Expression expr) {
2503 int startLn = lineInfo.getLocation(expr.offset).lineNumber; 2445 int startLn = lineInfo.getLocation(expr.offset).lineNumber;
2504 int startOffset = lineInfo.getOffsetOfLine(startLn - 1); 2446 int startOffset = lineInfo.getOffsetOfLine(startLn - 1);
2505 int endLn = 2447 int endLn =
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2636 class _SimpleIdentifierRecursiveAstVisitor extends RecursiveAstVisitor { 2578 class _SimpleIdentifierRecursiveAstVisitor extends RecursiveAstVisitor {
2637 final _SimpleIdentifierVisitor visitor; 2579 final _SimpleIdentifierVisitor visitor;
2638 2580
2639 _SimpleIdentifierRecursiveAstVisitor(this.visitor); 2581 _SimpleIdentifierRecursiveAstVisitor(this.visitor);
2640 2582
2641 @override 2583 @override
2642 visitSimpleIdentifier(SimpleIdentifier node) { 2584 visitSimpleIdentifier(SimpleIdentifier node) {
2643 visitor(node); 2585 visitor(node);
2644 } 2586 }
2645 } 2587 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698