| 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'; |
| 11 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 11 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
| 12 import 'package:analysis_server/src/plugin/server_plugin.dart'; | 12 import 'package:analysis_server/src/plugin/server_plugin.dart'; |
| 13 import 'package:analysis_server/src/services/correction/assist.dart'; | 13 import 'package:analysis_server/src/services/correction/assist.dart'; |
| 14 import 'package:analysis_server/src/services/correction/assist_internal.dart'; | 14 import 'package:analysis_server/src/services/correction/assist_internal.dart'; |
| 15 import 'package:analyzer/dart/ast/ast.dart'; | 15 import 'package:analyzer/dart/ast/ast.dart'; |
| 16 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; | 16 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; |
| 17 import 'package:analyzer/dart/element/element.dart'; | 17 import 'package:analyzer/dart/element/element.dart'; |
| 18 import 'package:analyzer/file_system/file_system.dart'; |
| 19 import 'package:analyzer/source/package_map_resolver.dart'; |
| 18 import 'package:analyzer/src/generated/engine.dart'; | 20 import 'package:analyzer/src/generated/engine.dart'; |
| 19 import 'package:analyzer/src/generated/source.dart'; | 21 import 'package:analyzer/src/generated/source.dart'; |
| 20 import 'package:plugin/manager.dart'; | 22 import 'package:plugin/manager.dart'; |
| 21 import 'package:plugin/plugin.dart'; | 23 import 'package:plugin/plugin.dart'; |
| 22 import 'package:test/test.dart'; | 24 import 'package:test/test.dart'; |
| 23 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 25 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 24 | 26 |
| 25 import '../../abstract_single_unit.dart'; | 27 import '../../abstract_single_unit.dart'; |
| 26 | 28 |
| 27 main() { | 29 main() { |
| (...skipping 3568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3596 final int V = 1; | 3598 final int V = 1; |
| 3597 '''); | 3599 '''); |
| 3598 await assertHasAssistAt( | 3600 await assertHasAssistAt( |
| 3599 'int ', | 3601 'int ', |
| 3600 DartAssistKind.REMOVE_TYPE_ANNOTATION, | 3602 DartAssistKind.REMOVE_TYPE_ANNOTATION, |
| 3601 ''' | 3603 ''' |
| 3602 final V = 1; | 3604 final V = 1; |
| 3603 '''); | 3605 '''); |
| 3604 } | 3606 } |
| 3605 | 3607 |
| 3608 test_reparentFlutterWidget_OK_singleLine1() async { |
| 3609 _configureFlutterPkg({ |
| 3610 'src/widgets/framework.dart': _flutter_framework_code, |
| 3611 }); |
| 3612 await resolveTestUnit(''' |
| 3613 import 'package:flutter/src/widgets/framework.dart'; |
| 3614 class FakeFlutter { |
| 3615 main() { |
| 3616 // start |
| 3617 return /*caret*/new Container(); |
| 3618 // end |
| 3619 } |
| 3620 } |
| 3621 '''); |
| 3622 _setCaretLocation(); |
| 3623 await assertHasAssist( |
| 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 } |
| 3636 |
| 3637 test_reparentFlutterWidget_OK_singleLine2() async { |
| 3638 _configureFlutterPkg({ |
| 3639 'src/widgets/framework.dart': _flutter_framework_code, |
| 3640 }); |
| 3641 await resolveTestUnit(''' |
| 3642 import 'package:flutter/src/widgets/framework.dart'; |
| 3643 class FakeFlutter { |
| 3644 main() { |
| 3645 // start |
| 3646 return new ClipRect./*caret*/rect(); |
| 3647 // end |
| 3648 } |
| 3649 } |
| 3650 '''); |
| 3651 _setCaretLocation(); |
| 3652 await assertHasAssist( |
| 3653 DartAssistKind.REPARENT_FLUTTER_WIDGET, |
| 3654 ''' |
| 3655 import 'package:flutter/src/widgets/framework.dart'; |
| 3656 class FakeFlutter { |
| 3657 main() { |
| 3658 // start |
| 3659 return new widget(child: new ClipRect./*caret*/rect()); |
| 3660 // end |
| 3661 } |
| 3662 } |
| 3663 '''); |
| 3664 } |
| 3665 |
| 3666 test_reparentFlutterWidget_BAD_singleLine() async { |
| 3667 _configureFlutterPkg({ |
| 3668 'src/widgets/framework.dart': _flutter_framework_code, |
| 3669 }); |
| 3670 await resolveTestUnit(''' |
| 3671 import 'package:flutter/src/widgets/framework.dart'; |
| 3672 class FakeFlutter { |
| 3673 main() { |
| 3674 var obj; |
| 3675 // start |
| 3676 return new Container(child: obj.xyz./*caret*/abc); |
| 3677 // end |
| 3678 } |
| 3679 } |
| 3680 '''); |
| 3681 _setCaretLocation(); |
| 3682 await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET); |
| 3683 } |
| 3684 |
| 3685 test_reparentFlutterWidget_OK_multiLines1() async { |
| 3686 _configureFlutterPkg({ |
| 3687 'src/widgets/framework.dart': _flutter_framework_code, |
| 3688 }); |
| 3689 await resolveTestUnit(''' |
| 3690 import 'package:flutter/src/widgets/framework.dart'; |
| 3691 class FakeFlutter { |
| 3692 main() { |
| 3693 return new Container( |
| 3694 // start |
| 3695 child: new /*caret*/DefaultTextStyle( |
| 3696 child: new Row( |
| 3697 children: <Widget>[ |
| 3698 new Container( |
| 3699 ), |
| 3700 ], |
| 3701 ), |
| 3702 ), |
| 3703 // end |
| 3704 ); |
| 3705 } |
| 3706 } |
| 3707 '''); |
| 3708 _setCaretLocation(); |
| 3709 await assertHasAssist( |
| 3710 DartAssistKind.REPARENT_FLUTTER_WIDGET, |
| 3711 ''' |
| 3712 import 'package:flutter/src/widgets/framework.dart'; |
| 3713 class FakeFlutter { |
| 3714 main() { |
| 3715 return new Container( |
| 3716 // start |
| 3717 child: new widget( |
| 3718 child: new /*caret*/DefaultTextStyle( |
| 3719 child: new Row( |
| 3720 children: <Widget>[ |
| 3721 new Container( |
| 3722 ), |
| 3723 ], |
| 3724 ), |
| 3725 ), |
| 3726 ), |
| 3727 // end |
| 3728 ); |
| 3729 } |
| 3730 } |
| 3731 '''); |
| 3732 } |
| 3733 |
| 3606 test_replaceConditionalWithIfElse_BAD_noEnclosingStatement() async { | 3734 test_replaceConditionalWithIfElse_BAD_noEnclosingStatement() async { |
| 3607 await resolveTestUnit(''' | 3735 await resolveTestUnit(''' |
| 3608 var v = true ? 111 : 222; | 3736 var v = true ? 111 : 222; |
| 3609 '''); | 3737 '''); |
| 3610 await assertNoAssistAt( | 3738 await assertNoAssistAt( |
| 3611 '? 111', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE); | 3739 '? 111', DartAssistKind.REPLACE_CONDITIONAL_WITH_IF_ELSE); |
| 3612 } | 3740 } |
| 3613 | 3741 |
| 3614 test_replaceConditionalWithIfElse_BAD_notConditional() async { | 3742 test_replaceConditionalWithIfElse_BAD_notConditional() async { |
| 3615 await resolveTestUnit(''' | 3743 await resolveTestUnit(''' |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4210 | 4338 |
| 4211 List<Position> _findResultPositions(List<String> searchStrings) { | 4339 List<Position> _findResultPositions(List<String> searchStrings) { |
| 4212 List<Position> positions = <Position>[]; | 4340 List<Position> positions = <Position>[]; |
| 4213 for (String search in searchStrings) { | 4341 for (String search in searchStrings) { |
| 4214 int offset = resultCode.indexOf(search); | 4342 int offset = resultCode.indexOf(search); |
| 4215 positions.add(new Position(testFile, offset)); | 4343 positions.add(new Position(testFile, offset)); |
| 4216 } | 4344 } |
| 4217 return positions; | 4345 return positions; |
| 4218 } | 4346 } |
| 4219 | 4347 |
| 4348 String flutterPkgLibPath = '/packages/flutter/lib'; |
| 4349 |
| 4350 /** |
| 4351 * Configures the [SourceFactory] to have the `flutter` package in |
| 4352 * `/packages/flutter/lib` folder. |
| 4353 */ |
| 4354 void _configureFlutterPkg(Map<String, String> pathToCode) { |
| 4355 pathToCode.forEach((path, code) { |
| 4356 provider.newFile('$flutterPkgLibPath/$path', code); |
| 4357 }); |
| 4358 // configure SourceFactory |
| 4359 Folder myPkgFolder = provider.getResource(flutterPkgLibPath); |
| 4360 UriResolver pkgResolver = new PackageMapUriResolver(provider, { |
| 4361 'flutter': [myPkgFolder] |
| 4362 }); |
| 4363 SourceFactory sourceFactory = new SourceFactory( |
| 4364 [new DartUriResolver(sdk), pkgResolver, resourceResolver]); |
| 4365 if (enableNewAnalysisDriver) { |
| 4366 driver.configure(sourceFactory: sourceFactory); |
| 4367 } else { |
| 4368 context.sourceFactory = sourceFactory; |
| 4369 } |
| 4370 // force 'flutter' resolution |
| 4371 addSource( |
| 4372 '/tmp/other.dart', |
| 4373 pathToCode.keys |
| 4374 .map((path) => "import 'package:flutter/$path';") |
| 4375 .join('\n')); |
| 4376 } |
| 4377 |
| 4378 String get _flutter_framework_code => ''' |
| 4379 class Widget {} |
| 4380 class RenderObjectWidget extends Widget {} |
| 4381 class StatelessWidget extends Widget {} |
| 4382 class SingleChildRenderObjectWidget extends RenderObjectWidget {} |
| 4383 class Transform extends SingleChildRenderObjectWidget {} |
| 4384 class ClipRect extends SingleChildRenderObjectWidget { ClipRect.rect(){} } |
| 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 |
| 4220 void _setStartEndSelection() { | 4391 void _setStartEndSelection() { |
| 4221 offset = findOffset('// start\n') + '// start\n'.length; | 4392 offset = findOffset('// start\n') + '// start\n'.length; |
| 4222 length = findOffset('// end') - offset; | 4393 length = findOffset('// end') - offset; |
| 4223 } | 4394 } |
| 4395 |
| 4396 void _setCaretLocation() { |
| 4397 offset = findOffset('/*caret*/') + '/*caret*/'.length; |
| 4398 length = 0; |
| 4399 } |
| 4224 } | 4400 } |
| 4225 | 4401 |
| 4226 @reflectiveTest | 4402 @reflectiveTest |
| 4227 class AssistProcessorTest_Driver extends AssistProcessorTest { | 4403 class AssistProcessorTest_Driver extends AssistProcessorTest { |
| 4228 @override | 4404 @override |
| 4229 bool get enableNewAnalysisDriver => true; | 4405 bool get enableNewAnalysisDriver => true; |
| 4230 } | 4406 } |
| 4231 | 4407 |
| 4232 class _DartAssistContextForValues implements DartAssistContext { | 4408 class _DartAssistContextForValues implements DartAssistContext { |
| 4233 @override | 4409 @override |
| 4234 final Source source; | 4410 final Source source; |
| 4235 | 4411 |
| 4236 @override | 4412 @override |
| 4237 final int selectionOffset; | 4413 final int selectionOffset; |
| 4238 | 4414 |
| 4239 @override | 4415 @override |
| 4240 final int selectionLength; | 4416 final int selectionLength; |
| 4241 | 4417 |
| 4242 @override | 4418 @override |
| 4243 final AnalysisContext analysisContext; | 4419 final AnalysisContext analysisContext; |
| 4244 | 4420 |
| 4245 @override | 4421 @override |
| 4246 final CompilationUnit unit; | 4422 final CompilationUnit unit; |
| 4247 | 4423 |
| 4248 _DartAssistContextForValues(this.source, this.selectionOffset, | 4424 _DartAssistContextForValues(this.source, this.selectionOffset, |
| 4249 this.selectionLength, this.analysisContext, this.unit); | 4425 this.selectionLength, this.analysisContext, this.unit); |
| 4250 } | 4426 } |
| OLD | NEW |