OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:async'; | 5 import 'dart:async'; |
6 import 'dart:collection'; | 6 import 'dart:collection'; |
7 | 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |