| 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 library test.services.correction.assist; | 5 library test.services.correction.assist; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/edit/assist/assist_core.dart'; | 9 import 'package:analysis_server/plugin/edit/assist/assist_core.dart'; |
| 10 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart'; | 10 import 'package:analysis_server/plugin/edit/assist/assist_dart.dart'; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 class AssistProcessorTest extends AbstractSingleUnitTest { | 37 class AssistProcessorTest extends AbstractSingleUnitTest { |
| 38 int offset; | 38 int offset; |
| 39 int length; | 39 int length; |
| 40 | 40 |
| 41 ServerPlugin plugin; | 41 ServerPlugin plugin; |
| 42 Assist assist; | 42 Assist assist; |
| 43 SourceChange change; | 43 SourceChange change; |
| 44 String resultCode; | 44 String resultCode; |
| 45 LinkedEditGroup linkedPositionGroup; | 45 LinkedEditGroup linkedPositionGroup; |
| 46 | 46 |
| 47 String flutterPkgLibPath = '/packages/flutter/lib'; |
| 48 |
| 49 String get _flutter_framework_code => ''' |
| 50 class Widget {} |
| 51 class RenderObjectWidget extends Widget {} |
| 52 class StatelessWidget extends Widget {} |
| 53 class SingleChildRenderObjectWidget extends RenderObjectWidget {} |
| 54 class Transform extends SingleChildRenderObjectWidget {} |
| 55 class ClipRect extends SingleChildRenderObjectWidget { ClipRect.rect(){} } |
| 56 class AspectRatio extends SingleChildRenderObjectWidget {} |
| 57 class Container extends StatelessWidget { Container({child: null}){}} |
| 58 class DefaultTextStyle extends StatelessWidget { DefaultTextStyle({child: null})
{}} |
| 59 class Row extends Widget { Row({children: null}){}} |
| 60 '''; |
| 61 |
| 47 /** | 62 /** |
| 48 * Asserts that there is an [Assist] of the given [kind] at [offset] which | 63 * Asserts that there is an [Assist] of the given [kind] at [offset] which |
| 49 * produces the [expected] code when applied to [testCode]. | 64 * produces the [expected] code when applied to [testCode]. |
| 50 */ | 65 */ |
| 51 assertHasAssist(AssistKind kind, String expected) async { | 66 assertHasAssist(AssistKind kind, String expected) async { |
| 52 assist = await _assertHasAssist(kind); | 67 assist = await _assertHasAssist(kind); |
| 53 change = assist.change; | 68 change = assist.change; |
| 54 // apply to "file" | 69 // apply to "file" |
| 55 List<SourceFileEdit> fileEdits = change.edits; | 70 List<SourceFileEdit> fileEdits = change.edits; |
| 56 expect(fileEdits, hasLength(1)); | 71 expect(fileEdits, hasLength(1)); |
| (...skipping 3541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3598 final int V = 1; | 3613 final int V = 1; |
| 3599 '''); | 3614 '''); |
| 3600 await assertHasAssistAt( | 3615 await assertHasAssistAt( |
| 3601 'int ', | 3616 'int ', |
| 3602 DartAssistKind.REMOVE_TYPE_ANNOTATION, | 3617 DartAssistKind.REMOVE_TYPE_ANNOTATION, |
| 3603 ''' | 3618 ''' |
| 3604 final V = 1; | 3619 final V = 1; |
| 3605 '''); | 3620 '''); |
| 3606 } | 3621 } |
| 3607 | 3622 |
| 3608 test_reparentFlutterWidget_OK_singleLine1() async { | 3623 test_reparentFlutterList_BAD_multiLine() async { |
| 3624 _configureFlutterPkg({ |
| 3625 'src/widgets/framework.dart': _flutter_framework_code, |
| 3626 }); |
| 3627 await resolveTestUnit(''' |
| 3628 import 'package:flutter/src/widgets/framework.dart'; |
| 3629 build() { |
| 3630 return new Container( |
| 3631 child: new Row( |
| 3632 children: [/*caret*/ |
| 3633 // start |
| 3634 new Transform(), |
| 3635 new Object(), |
| 3636 new AspectRatio(), |
| 3637 // end |
| 3638 ], |
| 3639 ), |
| 3640 ); |
| 3641 } |
| 3642 '''); |
| 3643 _setCaretLocation(); |
| 3644 await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_LIST); |
| 3645 } |
| 3646 |
| 3647 test_reparentFlutterList_BAD_singleLine() async { |
| 3609 _configureFlutterPkg({ | 3648 _configureFlutterPkg({ |
| 3610 'src/widgets/framework.dart': _flutter_framework_code, | 3649 'src/widgets/framework.dart': _flutter_framework_code, |
| 3611 }); | 3650 }); |
| 3612 await resolveTestUnit(''' | 3651 await resolveTestUnit(''' |
| 3613 import 'package:flutter/src/widgets/framework.dart'; | 3652 import 'package:flutter/src/widgets/framework.dart'; |
| 3614 class FakeFlutter { | 3653 class FakeFlutter { |
| 3615 main() { | 3654 main() { |
| 3655 var obj; |
| 3616 // start | 3656 // start |
| 3617 return /*caret*/new Container(); | 3657 return new Row(children: [/*caret*/ new Transform()]); |
| 3618 // end | 3658 // end |
| 3619 } | 3659 } |
| 3620 } | 3660 } |
| 3621 '''); | 3661 '''); |
| 3622 _setCaretLocation(); | 3662 _setCaretLocation(); |
| 3623 await assertHasAssist( | 3663 await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_LIST); |
| 3624 DartAssistKind.REPARENT_FLUTTER_WIDGET, | |
| 3625 ''' | |
| 3626 import 'package:flutter/src/widgets/framework.dart'; | |
| 3627 class FakeFlutter { | |
| 3628 main() { | |
| 3629 // start | |
| 3630 return /*caret*/new widget(child: new Container()); | |
| 3631 // end | |
| 3632 } | |
| 3633 } | |
| 3634 '''); | |
| 3635 } | 3664 } |
| 3636 | 3665 |
| 3637 test_reparentFlutterWidget_OK_singleLine2() async { | 3666 test_reparentFlutterList_OK_multiLine() async { |
| 3638 _configureFlutterPkg({ | 3667 _configureFlutterPkg({ |
| 3639 'src/widgets/framework.dart': _flutter_framework_code, | 3668 'src/widgets/framework.dart': _flutter_framework_code, |
| 3640 }); | 3669 }); |
| 3641 await resolveTestUnit(''' | 3670 await resolveTestUnit(''' |
| 3642 import 'package:flutter/src/widgets/framework.dart'; | 3671 import 'package:flutter/src/widgets/framework.dart'; |
| 3643 class FakeFlutter { | 3672 build() { |
| 3644 main() { | 3673 return new Container( |
| 3674 child: new Row( |
| 3645 // start | 3675 // start |
| 3646 return new ClipRect./*caret*/rect(); | 3676 children: [/*caret*/ |
| 3677 new Transform(), |
| 3678 new Transform(), |
| 3679 new AspectRatio(), |
| 3680 ], |
| 3647 // end | 3681 // end |
| 3648 } | 3682 ), |
| 3683 ); |
| 3649 } | 3684 } |
| 3650 '''); | 3685 '''); |
| 3651 _setCaretLocation(); | 3686 _setCaretLocation(); |
| 3652 await assertHasAssist( | 3687 await assertHasAssist( |
| 3653 DartAssistKind.REPARENT_FLUTTER_WIDGET, | 3688 DartAssistKind.REPARENT_FLUTTER_LIST, |
| 3654 ''' | 3689 ''' |
| 3655 import 'package:flutter/src/widgets/framework.dart'; | 3690 import 'package:flutter/src/widgets/framework.dart'; |
| 3656 class FakeFlutter { | 3691 build() { |
| 3657 main() { | 3692 return new Container( |
| 3693 child: new Row( |
| 3658 // start | 3694 // start |
| 3659 return new widget(child: new ClipRect./*caret*/rect()); | 3695 children: [ |
| 3696 new widget( |
| 3697 children: [/*caret*/ |
| 3698 new Transform(), |
| 3699 new Transform(), |
| 3700 new AspectRatio(), |
| 3701 ], |
| 3702 ), |
| 3703 ], |
| 3660 // end | 3704 // end |
| 3661 } | 3705 ), |
| 3706 ); |
| 3662 } | 3707 } |
| 3663 '''); | 3708 '''); |
| 3664 } | 3709 } |
| 3665 | 3710 |
| 3711 test_reparentFlutterWidget_BAD_minimal() async { |
| 3712 _configureFlutterPkg({ |
| 3713 'src/widgets/framework.dart': _flutter_framework_code, |
| 3714 }); |
| 3715 await resolveTestUnit(''' |
| 3716 /*caret*/x(){} |
| 3717 '''); |
| 3718 _setCaretLocation(); |
| 3719 await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET); |
| 3720 } |
| 3721 |
| 3666 test_reparentFlutterWidget_BAD_singleLine() async { | 3722 test_reparentFlutterWidget_BAD_singleLine() async { |
| 3667 _configureFlutterPkg({ | 3723 _configureFlutterPkg({ |
| 3668 'src/widgets/framework.dart': _flutter_framework_code, | 3724 'src/widgets/framework.dart': _flutter_framework_code, |
| 3669 }); | 3725 }); |
| 3670 await resolveTestUnit(''' | 3726 await resolveTestUnit(''' |
| 3671 import 'package:flutter/src/widgets/framework.dart'; | 3727 import 'package:flutter/src/widgets/framework.dart'; |
| 3672 class FakeFlutter { | 3728 class FakeFlutter { |
| 3673 main() { | 3729 main() { |
| 3674 var obj; | 3730 var obj; |
| 3675 // start | 3731 // start |
| 3676 return new Container(child: obj.xyz./*caret*/abc); | 3732 return new Container(child: obj.xyz./*caret*/abc); |
| 3677 // end | 3733 // end |
| 3678 } | 3734 } |
| 3679 } | 3735 } |
| 3680 '''); | 3736 '''); |
| 3681 _setCaretLocation(); | 3737 _setCaretLocation(); |
| 3682 await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET); | 3738 await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET); |
| 3683 } | 3739 } |
| 3684 | 3740 |
| 3685 test_reparentFlutterWidget_OK_multiLines1() async { | 3741 test_reparentFlutterWidget_OK_multiLines() async { |
| 3686 _configureFlutterPkg({ | 3742 _configureFlutterPkg({ |
| 3687 'src/widgets/framework.dart': _flutter_framework_code, | 3743 'src/widgets/framework.dart': _flutter_framework_code, |
| 3688 }); | 3744 }); |
| 3689 await resolveTestUnit(''' | 3745 await resolveTestUnit(''' |
| 3690 import 'package:flutter/src/widgets/framework.dart'; | 3746 import 'package:flutter/src/widgets/framework.dart'; |
| 3691 class FakeFlutter { | 3747 class FakeFlutter { |
| 3692 main() { | 3748 main() { |
| 3693 return new Container( | 3749 return new Container( |
| 3694 // start | 3750 // start |
| 3695 child: new /*caret*/DefaultTextStyle( | 3751 child: new /*caret*/DefaultTextStyle( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3724 ), | 3780 ), |
| 3725 ), | 3781 ), |
| 3726 ), | 3782 ), |
| 3727 // end | 3783 // end |
| 3728 ); | 3784 ); |
| 3729 } | 3785 } |
| 3730 } | 3786 } |
| 3731 '''); | 3787 '''); |
| 3732 } | 3788 } |
| 3733 | 3789 |
| 3790 test_reparentFlutterWidget_OK_singleLine1() async { |
| 3791 _configureFlutterPkg({ |
| 3792 'src/widgets/framework.dart': _flutter_framework_code, |
| 3793 }); |
| 3794 await resolveTestUnit(''' |
| 3795 import 'package:flutter/src/widgets/framework.dart'; |
| 3796 class FakeFlutter { |
| 3797 main() { |
| 3798 // start |
| 3799 return /*caret*/new Container(); |
| 3800 // end |
| 3801 } |
| 3802 } |
| 3803 '''); |
| 3804 _setCaretLocation(); |
| 3805 await assertHasAssist( |
| 3806 DartAssistKind.REPARENT_FLUTTER_WIDGET, |
| 3807 ''' |
| 3808 import 'package:flutter/src/widgets/framework.dart'; |
| 3809 class FakeFlutter { |
| 3810 main() { |
| 3811 // start |
| 3812 return /*caret*/new widget(child: new Container()); |
| 3813 // end |
| 3814 } |
| 3815 } |
| 3816 '''); |
| 3817 } |
| 3818 |
| 3819 test_reparentFlutterWidget_OK_singleLine2() async { |
| 3820 _configureFlutterPkg({ |
| 3821 'src/widgets/framework.dart': _flutter_framework_code, |
| 3822 }); |
| 3823 await resolveTestUnit(''' |
| 3824 import 'package:flutter/src/widgets/framework.dart'; |
| 3825 class FakeFlutter { |
| 3826 main() { |
| 3827 // start |
| 3828 return new ClipRect./*caret*/rect(); |
| 3829 // end |
| 3830 } |
| 3831 } |
| 3832 '''); |
| 3833 _setCaretLocation(); |
| 3834 await assertHasAssist( |
| 3835 DartAssistKind.REPARENT_FLUTTER_WIDGET, |
| 3836 ''' |
| 3837 import 'package:flutter/src/widgets/framework.dart'; |
| 3838 class FakeFlutter { |
| 3839 main() { |
| 3840 // start |
| 3841 return new widget(child: new ClipRect./*caret*/rect()); |
| 3842 // end |
| 3843 } |
| 3844 } |
| 3845 '''); |
| 3846 } |
| 3847 |
| 3734 test_replaceConditionalWithIfElse_BAD_noEnclosingStatement() async { | 3848 test_replaceConditionalWithIfElse_BAD_noEnclosingStatement() async { |
| 3735 await resolveTestUnit(''' | 3849 await resolveTestUnit(''' |
| 3736 var v = true ? 111 : 222; | 3850 var v = true ? 111 : 222; |
| 3737 '''); | 3851 '''); |
| 3738 await assertNoAssistAt( | 3852 await assertNoAssistAt( |
| 3739 '? 111', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE); | 3853 '? 111', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE); |
| 3740 } | 3854 } |
| 3741 | 3855 |
| 3742 test_replaceConditionalWithIfElse_BAD_notConditional() async { | 3856 test_replaceConditionalWithIfElse_BAD_notConditional() async { |
| 3743 await resolveTestUnit(''' | 3857 await resolveTestUnit(''' |
| (...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4329 DartAssistContext assistContext = new _DartAssistContextForValues( | 4443 DartAssistContext assistContext = new _DartAssistContextForValues( |
| 4330 testUnitElement.source, | 4444 testUnitElement.source, |
| 4331 offset, | 4445 offset, |
| 4332 length, | 4446 length, |
| 4333 testUnitElement.context, | 4447 testUnitElement.context, |
| 4334 testUnit); | 4448 testUnit); |
| 4335 AssistProcessor processor = new AssistProcessor(assistContext); | 4449 AssistProcessor processor = new AssistProcessor(assistContext); |
| 4336 return await processor.compute(); | 4450 return await processor.compute(); |
| 4337 } | 4451 } |
| 4338 | 4452 |
| 4339 List<Position> _findResultPositions(List<String> searchStrings) { | |
| 4340 List<Position> positions = <Position>[]; | |
| 4341 for (String search in searchStrings) { | |
| 4342 int offset = resultCode.indexOf(search); | |
| 4343 positions.add(new Position(testFile, offset)); | |
| 4344 } | |
| 4345 return positions; | |
| 4346 } | |
| 4347 | |
| 4348 String flutterPkgLibPath = '/packages/flutter/lib'; | |
| 4349 | |
| 4350 /** | 4453 /** |
| 4351 * Configures the [SourceFactory] to have the `flutter` package in | 4454 * Configures the [SourceFactory] to have the `flutter` package in |
| 4352 * `/packages/flutter/lib` folder. | 4455 * `/packages/flutter/lib` folder. |
| 4353 */ | 4456 */ |
| 4354 void _configureFlutterPkg(Map<String, String> pathToCode) { | 4457 void _configureFlutterPkg(Map<String, String> pathToCode) { |
| 4355 pathToCode.forEach((path, code) { | 4458 pathToCode.forEach((path, code) { |
| 4356 provider.newFile('$flutterPkgLibPath/$path', code); | 4459 provider.newFile('$flutterPkgLibPath/$path', code); |
| 4357 }); | 4460 }); |
| 4358 // configure SourceFactory | 4461 // configure SourceFactory |
| 4359 Folder myPkgFolder = provider.getResource(flutterPkgLibPath); | 4462 Folder myPkgFolder = provider.getResource(flutterPkgLibPath); |
| 4360 UriResolver pkgResolver = new PackageMapUriResolver(provider, { | 4463 UriResolver pkgResolver = new PackageMapUriResolver(provider, { |
| 4361 'flutter': [myPkgFolder] | 4464 'flutter': [myPkgFolder] |
| 4362 }); | 4465 }); |
| 4363 SourceFactory sourceFactory = new SourceFactory( | 4466 SourceFactory sourceFactory = new SourceFactory( |
| 4364 [new DartUriResolver(sdk), pkgResolver, resourceResolver]); | 4467 [new DartUriResolver(sdk), pkgResolver, resourceResolver]); |
| 4365 if (enableNewAnalysisDriver) { | 4468 if (enableNewAnalysisDriver) { |
| 4366 driver.configure(sourceFactory: sourceFactory); | 4469 driver.configure(sourceFactory: sourceFactory); |
| 4367 } else { | 4470 } else { |
| 4368 context.sourceFactory = sourceFactory; | 4471 context.sourceFactory = sourceFactory; |
| 4369 } | 4472 } |
| 4370 // force 'flutter' resolution | 4473 // force 'flutter' resolution |
| 4371 addSource( | 4474 addSource( |
| 4372 '/tmp/other.dart', | 4475 '/tmp/other.dart', |
| 4373 pathToCode.keys | 4476 pathToCode.keys |
| 4374 .map((path) => "import 'package:flutter/$path';") | 4477 .map((path) => "import 'package:flutter/$path';") |
| 4375 .join('\n')); | 4478 .join('\n')); |
| 4376 } | 4479 } |
| 4377 | 4480 |
| 4378 String get _flutter_framework_code => ''' | 4481 List<Position> _findResultPositions(List<String> searchStrings) { |
| 4379 class Widget {} | 4482 List<Position> positions = <Position>[]; |
| 4380 class RenderObjectWidget extends Widget {} | 4483 for (String search in searchStrings) { |
| 4381 class StatelessWidget extends Widget {} | 4484 int offset = resultCode.indexOf(search); |
| 4382 class SingleChildRenderObjectWidget extends RenderObjectWidget {} | 4485 positions.add(new Position(testFile, offset)); |
| 4383 class Transform extends SingleChildRenderObjectWidget {} | 4486 } |
| 4384 class ClipRect extends SingleChildRenderObjectWidget { ClipRect.rect(){} } | 4487 return positions; |
| 4385 class AspectRatio extends SingleChildRenderObjectWidget {} | |
| 4386 class Container extends StatelessWidget { Container({child: null}){}} | |
| 4387 class DefaultTextStyle extends StatelessWidget { DefaultTextStyle({child: null})
{}} | |
| 4388 class Row extends Widget { Row({children: null}){}} | |
| 4389 '''; | |
| 4390 | |
| 4391 void _setStartEndSelection() { | |
| 4392 offset = findOffset('// start\n') + '// start\n'.length; | |
| 4393 length = findOffset('// end') - offset; | |
| 4394 } | 4488 } |
| 4395 | 4489 |
| 4396 void _setCaretLocation() { | 4490 void _setCaretLocation() { |
| 4397 offset = findOffset('/*caret*/') + '/*caret*/'.length; | 4491 offset = findOffset('/*caret*/') + '/*caret*/'.length; |
| 4398 length = 0; | 4492 length = 0; |
| 4399 } | 4493 } |
| 4494 |
| 4495 void _setStartEndSelection() { |
| 4496 offset = findOffset('// start\n') + '// start\n'.length; |
| 4497 length = findOffset('// end') - offset; |
| 4498 } |
| 4400 } | 4499 } |
| 4401 | 4500 |
| 4402 @reflectiveTest | 4501 @reflectiveTest |
| 4403 class AssistProcessorTest_Driver extends AssistProcessorTest { | 4502 class AssistProcessorTest_Driver extends AssistProcessorTest { |
| 4404 @override | 4503 @override |
| 4405 bool get enableNewAnalysisDriver => true; | 4504 bool get enableNewAnalysisDriver => true; |
| 4406 } | 4505 } |
| 4407 | 4506 |
| 4408 class _DartAssistContextForValues implements DartAssistContext { | 4507 class _DartAssistContextForValues implements DartAssistContext { |
| 4409 @override | 4508 @override |
| 4410 final Source source; | 4509 final Source source; |
| 4411 | 4510 |
| 4412 @override | 4511 @override |
| 4413 final int selectionOffset; | 4512 final int selectionOffset; |
| 4414 | 4513 |
| 4415 @override | 4514 @override |
| 4416 final int selectionLength; | 4515 final int selectionLength; |
| 4417 | 4516 |
| 4418 @override | 4517 @override |
| 4419 final AnalysisContext analysisContext; | 4518 final AnalysisContext analysisContext; |
| 4420 | 4519 |
| 4421 @override | 4520 @override |
| 4422 final CompilationUnit unit; | 4521 final CompilationUnit unit; |
| 4423 | 4522 |
| 4424 _DartAssistContextForValues(this.source, this.selectionOffset, | 4523 _DartAssistContextForValues(this.source, this.selectionOffset, |
| 4425 this.selectionLength, this.analysisContext, this.unit); | 4524 this.selectionLength, this.analysisContext, this.unit); |
| 4426 } | 4525 } |
| OLD | NEW |