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

Side by Side Diff: pkg/analysis_server/test/services/correction/assist_test.dart

Issue 2701023002: Add assist to reparent list of Flutter widgets (Closed)
Patch Set: Change menu label Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/analysis_server/lib/src/services/correction/assist_internal.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/lib/src/services/correction/assist_internal.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698