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

Side by Side Diff: pkg/analysis_services/test/correction/fix_test.dart

Issue 484733003: Import analysis_services.dart into analysis_server.dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 library test.services.correction.fix;
6
7 import 'package:analysis_services/correction/change.dart';
8 import 'package:analysis_services/correction/fix.dart';
9 import 'package:analysis_services/index/index.dart';
10 import 'package:analysis_services/index/local_memory_index.dart';
11 import 'package:analysis_services/src/search/search_engine.dart';
12 import 'package:analysis_testing/abstract_context.dart';
13 import 'package:analysis_testing/abstract_single_unit.dart';
14 import 'package:analysis_testing/reflective_tests.dart';
15 import 'package:analyzer/file_system/file_system.dart';
16 import 'package:analyzer/source/package_map_resolver.dart';
17 import 'package:analyzer/src/generated/error.dart';
18 import 'package:analyzer/src/generated/source.dart';
19 import 'package:unittest/unittest.dart';
20
21
22 main() {
23 groupSep = ' | ';
24 runReflectiveTests(FixProcessorTest);
25 }
26
27
28 @ReflectiveTestCase()
29 class FixProcessorTest extends AbstractSingleUnitTest {
30 Index index;
31 SearchEngineImpl searchEngine;
32
33 Fix fix;
34 Change change;
35 String resultCode;
36
37 void assertHasFix(FixKind kind, String expected) {
38 AnalysisError error = _findErrorToFix();
39 fix = _assertHasFix(kind, error);
40 change = fix.change;
41 // apply to "file"
42 List<FileEdit> fileEdits = change.fileEdits;
43 expect(fileEdits, hasLength(1));
44 resultCode = Edit.applySequence(testCode, change.fileEdits[0].edits);
45 // verify
46 expect(resultCode, expected);
47 }
48
49 void assertHasPositionGroup(String id, List<Position> expectedPositions) {
50 List<LinkedEditGroup> linkedPositionGroups = change.linkedEditGroups;
51 for (LinkedEditGroup group in linkedPositionGroups) {
52 if (group.id == id) {
53 expect(group.positions, unorderedEquals(expectedPositions));
54 return;
55 }
56 }
57 fail('No PositionGroup with id=$id found in $linkedPositionGroups');
58 }
59
60 void assertNoFix(FixKind kind) {
61 AnalysisError error = _findErrorToFix();
62 List<Fix> fixes = computeFixes(searchEngine, testUnit, error);
63 for (Fix fix in fixes) {
64 if (fix.kind == kind) {
65 throw fail('Unexpected fix $kind in\n${fixes.join('\n')}');
66 }
67 }
68 }
69
70 void assert_undefinedFunction_create_returnType_bool(String lineWithTest) {
71 _indexTestUnit('''
72 main() {
73 bool b = true;
74 $lineWithTest
75 }
76 ''');
77 assertHasFix(FixKind.CREATE_FUNCTION, '''
78 main() {
79 bool b = true;
80 $lineWithTest
81 }
82
83 bool test() {
84 }
85 ''');
86 }
87
88 Position expectedPosition(String search) {
89 int offset = resultCode.indexOf(search);
90 int length = getLeadingIdentifierLength(search);
91 return new Position(testFile, offset);
92 }
93
94 List<Position> expectedPositions(List<String> patterns) {
95 List<Position> positions = <Position>[];
96 patterns.forEach((String search) {
97 positions.add(expectedPosition(search));
98 });
99 return positions;
100 }
101
102 void setUp() {
103 super.setUp();
104 index = createLocalMemoryIndex();
105 searchEngine = new SearchEngineImpl(index);
106 verifyNoTestUnitErrors = false;
107 }
108
109 void test_boolean() {
110 _indexTestUnit('''
111 main() {
112 boolean v;
113 }
114 ''');
115 assertHasFix(FixKind.REPLACE_BOOLEAN_WITH_BOOL, '''
116 main() {
117 bool v;
118 }
119 ''');
120 }
121
122 void test_changeToStaticAccess_method() {
123 _indexTestUnit('''
124 class A {
125 static foo() {}
126 }
127 main(A a) {
128 a.foo();
129 }
130 ''');
131 assertHasFix(FixKind.CHANGE_TO_STATIC_ACCESS, '''
132 class A {
133 static foo() {}
134 }
135 main(A a) {
136 A.foo();
137 }
138 ''');
139 }
140
141 void test_changeToStaticAccess_method_prefixLibrary() {
142 _indexTestUnit('''
143 import 'dart:async' as pref;
144 main(pref.Future f) {
145 f.wait([]);
146 }
147 ''');
148 assertHasFix(FixKind.CHANGE_TO_STATIC_ACCESS, '''
149 import 'dart:async' as pref;
150 main(pref.Future f) {
151 pref.Future.wait([]);
152 }
153 ''');
154 }
155
156 void test_changeToStaticAccess_property() {
157 _indexTestUnit('''
158 class A {
159 static get foo => 42;
160 }
161 main(A a) {
162 a.foo;
163 }
164 ''');
165 assertHasFix(FixKind.CHANGE_TO_STATIC_ACCESS, '''
166 class A {
167 static get foo => 42;
168 }
169 main(A a) {
170 A.foo;
171 }
172 ''');
173 }
174
175 void test_createClass() {
176 _indexTestUnit('''
177 main() {
178 Test v = null;
179 }
180 ''');
181 assertHasFix(FixKind.CREATE_CLASS, '''
182 main() {
183 Test v = null;
184 }
185
186 class Test {
187 }
188 ''');
189 assertHasPositionGroup('NAME', expectedPositions(['Test v =', 'Test {']));
190 }
191
192 void test_createConstructorSuperExplicit() {
193 _indexTestUnit('''
194 class A {
195 A(bool p1, int p2, double p3, String p4, {p5});
196 }
197 class B extends A {
198 B() {}
199 }
200 ''');
201 assertHasFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
202 class A {
203 A(bool p1, int p2, double p3, String p4, {p5});
204 }
205 class B extends A {
206 B() : super(false, 0, 0.0, '') {}
207 }
208 ''');
209 }
210
211 void test_createConstructorSuperExplicit_hasInitializers() {
212 _indexTestUnit('''
213 class A {
214 A(int p);
215 }
216 class B extends A {
217 int field;
218 B() : field = 42 {}
219 }
220 ''');
221 assertHasFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
222 class A {
223 A(int p);
224 }
225 class B extends A {
226 int field;
227 B() : field = 42, super(0) {}
228 }
229 ''');
230 }
231
232 void test_createConstructorSuperExplicit_named() {
233 _indexTestUnit('''
234 class A {
235 A.named(int p);
236 }
237 class B extends A {
238 B() {}
239 }
240 ''');
241 assertHasFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION, '''
242 class A {
243 A.named(int p);
244 }
245 class B extends A {
246 B() : super.named(0) {}
247 }
248 ''');
249 }
250
251 void test_createConstructorSuperExplicit_named_private() {
252 _indexTestUnit('''
253 class A {
254 A._named(int p);
255 }
256 class B extends A {
257 B() {}
258 }
259 ''');
260 assertNoFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION);
261 }
262
263 void test_createConstructorSuperImplicit() {
264 _indexTestUnit('''
265 class A {
266 A(p1, int p2, List<String> p3, [int p4]);
267 }
268 class B extends A {
269 int existingField;
270
271 void existingMethod() {}
272 }
273 ''');
274 assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
275 class A {
276 A(p1, int p2, List<String> p3, [int p4]);
277 }
278 class B extends A {
279 int existingField;
280
281 B(p1, int p2, List<String> p3) : super(p1, p2, p3);
282
283 void existingMethod() {}
284 }
285 ''');
286 }
287
288 void test_createConstructorSuperImplicit_fieldInitializer() {
289 _indexTestUnit('''
290 class A {
291 int _field;
292 A(this._field);
293 }
294 class B extends A {
295 int existingField;
296
297 void existingMethod() {}
298 }
299 ''');
300 assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
301 class A {
302 int _field;
303 A(this._field);
304 }
305 class B extends A {
306 int existingField;
307
308 B(int field) : super(field);
309
310 void existingMethod() {}
311 }
312 ''');
313 }
314
315 void test_createConstructorSuperImplicit_named() {
316 _indexTestUnit('''
317 class A {
318 A.named(p1, int p2);
319 }
320 class B extends A {
321 int existingField;
322
323 void existingMethod() {}
324 }
325 ''');
326 assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
327 class A {
328 A.named(p1, int p2);
329 }
330 class B extends A {
331 int existingField;
332
333 B.named(p1, int p2) : super.named(p1, p2);
334
335 void existingMethod() {}
336 }
337 ''');
338 }
339
340 void test_createConstructorSuperImplicit_private() {
341 _indexTestUnit('''
342 class A {
343 A._named(p);
344 }
345 class B extends A {
346 }
347 ''');
348 assertNoFix(FixKind.CREATE_CONSTRUCTOR_SUPER);
349 }
350
351 void test_createConstructor_insteadOfSyntheticDefault() {
352 _indexTestUnit('''
353 class A {
354 int field;
355
356 method() {}
357 }
358 main() {
359 new A(1, 2.0);
360 }
361 ''');
362 assertHasFix(FixKind.CREATE_CONSTRUCTOR, '''
363 class A {
364 int field;
365
366 A(int i, double d) {
367 }
368
369 method() {}
370 }
371 main() {
372 new A(1, 2.0);
373 }
374 ''');
375 }
376
377 void test_createConstructor_named() {
378 _indexTestUnit('''
379 class A {
380 method() {}
381 }
382 main() {
383 new A.named(1, 2.0);
384 }
385 ''');
386 assertHasFix(FixKind.CREATE_CONSTRUCTOR, '''
387 class A {
388 A.named(int i, double d) {
389 }
390
391 method() {}
392 }
393 main() {
394 new A.named(1, 2.0);
395 }
396 ''');
397 }
398
399 void test_createMissingOverrides_functionType() {
400 _indexTestUnit('''
401 abstract class A {
402 forEach(int f(double p1, String p2));
403 }
404
405 class B extends A {
406 }
407 ''');
408 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
409 abstract class A {
410 forEach(int f(double p1, String p2));
411 }
412
413 class B extends A {
414 @override
415 forEach(int f(double p1, String p2)) {
416 // TODO: implement forEach
417 }
418 }
419 ''');
420 }
421
422 void test_createMissingOverrides_generics() {
423 _indexTestUnit('''
424 class Iterator<T> {
425 }
426
427 abstract class IterableMixin<T> {
428 Iterator<T> get iterator;
429 }
430
431 class Test extends IterableMixin<int> {
432 }
433 ''');
434 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
435 class Iterator<T> {
436 }
437
438 abstract class IterableMixin<T> {
439 Iterator<T> get iterator;
440 }
441
442 class Test extends IterableMixin<int> {
443 // TODO: implement iterator
444 @override
445 Iterator<int> get iterator => null;
446 }
447 ''');
448 }
449
450 void test_createMissingOverrides_getter() {
451 _indexTestUnit('''
452 abstract class A {
453 get g1;
454 int get g2;
455 }
456
457 class B extends A {
458 }
459 ''');
460 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
461 abstract class A {
462 get g1;
463 int get g2;
464 }
465
466 class B extends A {
467 // TODO: implement g1
468 @override
469 get g1 => null;
470
471 // TODO: implement g2
472 @override
473 int get g2 => null;
474 }
475 ''');
476 }
477
478 void test_createMissingOverrides_importPrefix() {
479 _indexTestUnit('''
480 import 'dart:async' as aaa;
481 abstract class A {
482 Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
483 }
484
485 class B extends A {
486 }
487 ''');
488 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
489 import 'dart:async' as aaa;
490 abstract class A {
491 Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
492 }
493
494 class B extends A {
495 @override
496 Map<aaa.Future, List<aaa.Future>> g(aaa.Future p) {
497 // TODO: implement g
498 }
499 }
500 ''');
501 }
502
503 void test_createMissingOverrides_method() {
504 _indexTestUnit('''
505 abstract class A {
506 m1();
507 int m2();
508 String m3(int p1, double p2, Map<int, List<String>> p3);
509 String m4(p1, p2);
510 String m5(p1, [int p2 = 2, int p3, p4 = 4]);
511 String m6(p1, {int p2: 2, int p3, p4: 4});
512 }
513
514 class B extends A {
515 }
516 ''');
517 String expectedCode = '''
518 abstract class A {
519 m1();
520 int m2();
521 String m3(int p1, double p2, Map<int, List<String>> p3);
522 String m4(p1, p2);
523 String m5(p1, [int p2 = 2, int p3, p4 = 4]);
524 String m6(p1, {int p2: 2, int p3, p4: 4});
525 }
526
527 class B extends A {
528 @override
529 m1() {
530 // TODO: implement m1
531 }
532
533 @override
534 int m2() {
535 // TODO: implement m2
536 }
537
538 @override
539 String m3(int p1, double p2, Map<int, List<String>> p3) {
540 // TODO: implement m3
541 }
542
543 @override
544 String m4(p1, p2) {
545 // TODO: implement m4
546 }
547
548 @override
549 String m5(p1, [int p2 = 2, int p3, p4 = 4]) {
550 // TODO: implement m5
551 }
552
553 @override
554 String m6(p1, {int p2: 2, int p3, p4: 4}) {
555 // TODO: implement m6
556 }
557 }
558 ''';
559 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, expectedCode);
560 // end position should be on "m1", not on "m2", "m3", etc
561 {
562 Position endPosition = change.selection;
563 expect(endPosition, isNotNull);
564 expect(endPosition.file, testFile);
565 int endOffset = endPosition.offset;
566 String endString = expectedCode.substring(endOffset, endOffset + 25);
567 expect(endString, contains('m1'));
568 expect(endString, isNot(contains('m2')));
569 expect(endString, isNot(contains('m3')));
570 expect(endString, isNot(contains('m4')));
571 expect(endString, isNot(contains('m5')));
572 expect(endString, isNot(contains('m6')));
573 }
574 }
575
576 void test_createMissingOverrides_operator() {
577 _indexTestUnit('''
578 abstract class A {
579 int operator [](int index);
580 void operator []=(int index, String value);
581 }
582
583 class B extends A {
584 }
585 ''');
586 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
587 abstract class A {
588 int operator [](int index);
589 void operator []=(int index, String value);
590 }
591
592 class B extends A {
593 @override
594 int operator [](int index) {
595 // TODO: implement []
596 }
597
598 @override
599 void operator []=(int index, String value) {
600 // TODO: implement []=
601 }
602 }
603 ''');
604 }
605
606 void test_createMissingOverrides_setter() {
607 _indexTestUnit('''
608 abstract class A {
609 set s1(x);
610 set s2(int x);
611 void set s3(String x);
612 }
613
614 class B extends A {
615 }
616 ''');
617 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
618 abstract class A {
619 set s1(x);
620 set s2(int x);
621 void set s3(String x);
622 }
623
624 class B extends A {
625 @override
626 set s1(x) {
627 // TODO: implement s1
628 }
629
630 @override
631 set s2(int x) {
632 // TODO: implement s2
633 }
634
635 @override
636 void set s3(String x) {
637 // TODO: implement s3
638 }
639 }
640 ''');
641 }
642
643 void test_createNoSuchMethod() {
644 _indexTestUnit('''
645 abstract class A {
646 m1();
647 int m2();
648 }
649
650 class B extends A {
651 existing() {}
652 }
653 ''');
654 assertHasFix(FixKind.CREATE_NO_SUCH_METHOD, '''
655 abstract class A {
656 m1();
657 int m2();
658 }
659
660 class B extends A {
661 existing() {}
662
663 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
664 }
665 ''');
666 }
667
668 void test_creationFunction_forFunctionType_cascadeSecond() {
669 _indexTestUnit('''
670 class A {
671 B ma() => null;
672 }
673 class B {
674 useFunction(int g(double a, String b)) {}
675 }
676
677 main() {
678 A a = new A();
679 a..ma().useFunction(test);
680 }
681 ''');
682 assertHasFix(FixKind.CREATE_FUNCTION, '''
683 class A {
684 B ma() => null;
685 }
686 class B {
687 useFunction(int g(double a, String b)) {}
688 }
689
690 main() {
691 A a = new A();
692 a..ma().useFunction(test);
693 }
694
695 int test(double a, String b) {
696 }
697 ''');
698 }
699
700 void test_creationFunction_forFunctionType_dynamicArgument() {
701 _indexTestUnit('''
702 main() {
703 useFunction(test);
704 }
705 useFunction(int g(a, b)) {}
706 ''');
707 assertHasFix(FixKind.CREATE_FUNCTION, '''
708 main() {
709 useFunction(test);
710 }
711 useFunction(int g(a, b)) {}
712
713 int test(a, b) {
714 }
715 ''');
716 }
717
718 void test_creationFunction_forFunctionType_function() {
719 _indexTestUnit('''
720 main() {
721 useFunction(test);
722 }
723 useFunction(int g(double a, String b)) {}
724 ''');
725 assertHasFix(FixKind.CREATE_FUNCTION, '''
726 main() {
727 useFunction(test);
728 }
729 useFunction(int g(double a, String b)) {}
730
731 int test(double a, String b) {
732 }
733 ''');
734 }
735
736 void test_creationFunction_forFunctionType_method_enclosingClass_static() {
737 _indexTestUnit('''
738 class A {
739 static foo() {
740 useFunction(test);
741 }
742 }
743 useFunction(int g(double a, String b)) {}
744 ''');
745 assertHasFix(FixKind.CREATE_METHOD, '''
746 class A {
747 static foo() {
748 useFunction(test);
749 }
750
751 static int test(double a, String b) {
752 }
753 }
754 useFunction(int g(double a, String b)) {}
755 ''');
756 }
757
758 void test_creationFunction_forFunctionType_method_enclosingClass_static2() {
759 _indexTestUnit('''
760 class A {
761 var f;
762 A() : f = useFunction(test);
763 }
764 useFunction(int g(double a, String b)) {}
765 ''');
766 assertHasFix(FixKind.CREATE_METHOD, '''
767 class A {
768 var f;
769 A() : f = useFunction(test);
770
771 static int test(double a, String b) {
772 }
773 }
774 useFunction(int g(double a, String b)) {}
775 ''');
776 }
777
778 void test_creationFunction_forFunctionType_method_targetClass() {
779 _indexTestUnit('''
780 main(A a) {
781 useFunction(a.test);
782 }
783 class A {
784 }
785 useFunction(int g(double a, String b)) {}
786 ''');
787 assertHasFix(FixKind.CREATE_METHOD, '''
788 main(A a) {
789 useFunction(a.test);
790 }
791 class A {
792 int test(double a, String b) {
793 }
794 }
795 useFunction(int g(double a, String b)) {}
796 ''');
797 }
798
799 void
800 test_creationFunction_forFunctionType_method_targetClass_hasOtherMember() {
801 _indexTestUnit('''
802 main(A a) {
803 useFunction(a.test);
804 }
805 class A {
806 m() {}
807 }
808 useFunction(int g(double a, String b)) {}
809 ''');
810 assertHasFix(FixKind.CREATE_METHOD, '''
811 main(A a) {
812 useFunction(a.test);
813 }
814 class A {
815 m() {}
816
817 int test(double a, String b) {
818 }
819 }
820 useFunction(int g(double a, String b)) {}
821 ''');
822 }
823
824 void test_creationFunction_forFunctionType_notFunctionType() {
825 _indexTestUnit('''
826 main(A a) {
827 useFunction(a.test);
828 }
829 typedef A();
830 useFunction(g) {}
831 ''');
832 assertNoFix(FixKind.CREATE_METHOD);
833 assertNoFix(FixKind.CREATE_FUNCTION);
834 }
835
836 void test_creationFunction_forFunctionType_unknownTarget() {
837 _indexTestUnit('''
838 main(A a) {
839 useFunction(a.test);
840 }
841 class A {
842 }
843 useFunction(g) {}
844 ''');
845 assertNoFix(FixKind.CREATE_METHOD);
846 }
847
848 void test_expectedToken_semicolon() {
849 _indexTestUnit('''
850 main() {
851 print(0)
852 }
853 ''');
854 assertHasFix(FixKind.INSERT_SEMICOLON, '''
855 main() {
856 print(0);
857 }
858 ''');
859 }
860
861 void test_importLibraryPackage_withType() {
862 provider.newFile('/packages/my_pkg/lib/my_lib.dart', '''
863 library my_lib;
864 class Test {}
865 ''');
866 {
867 Folder myPkgFolder = provider.getResource('/packages/my_pkg/lib');
868 UriResolver pkgResolver = new PackageMapUriResolver(provider, {
869 'my_pkg': [myPkgFolder]
870 });
871 context.sourceFactory = new SourceFactory(
872 [AbstractContextTest.SDK_RESOLVER, resourceResolver, pkgResolver]);
873 }
874 // force 'my_pkg' resolution
875 addSource('/tmp/other.dart', "import 'package:my_pkg/my_lib.dart';");
876 // try to find a fix
877 _indexTestUnit('''
878 main() {
879 Test test = null;
880 }
881 ''');
882 performAllAnalysisTasks();
883 assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
884 import 'package:my_pkg/my_lib.dart';
885
886 main() {
887 Test test = null;
888 }
889 ''');
890 }
891
892 void test_importLibraryPrefix_withTopLevelVariable() {
893 _indexTestUnit('''
894 import 'dart:math' as pref;
895 main() {
896 print(pref.E);
897 print(PI);
898 }
899 ''');
900 assertHasFix(FixKind.IMPORT_LIBRARY_PREFIX, '''
901 import 'dart:math' as pref;
902 main() {
903 print(pref.E);
904 print(pref.PI);
905 }
906 ''');
907 }
908
909 void test_importLibraryPrefix_withType() {
910 _indexTestUnit('''
911 import 'dart:async' as pref;
912 main() {
913 pref.Stream s = null;
914 Future f = null;
915 }
916 ''');
917 assertHasFix(FixKind.IMPORT_LIBRARY_PREFIX, '''
918 import 'dart:async' as pref;
919 main() {
920 pref.Stream s = null;
921 pref.Future f = null;
922 }
923 ''');
924 }
925
926 void test_importLibraryProject_withFunction() {
927 addSource('/lib.dart', '''
928 library lib;
929 myFunction() {}
930 ''');
931 _indexTestUnit('''
932 main() {
933 myFunction();
934 }
935 ''');
936 performAllAnalysisTasks();
937 assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
938 import 'lib.dart';
939
940 main() {
941 myFunction();
942 }
943 ''');
944 }
945
946 void test_importLibraryProject_withTopLevelVariable() {
947 addSource('/lib.dart', '''
948 library lib;
949 int MY_VAR = 42;
950 ''');
951 _indexTestUnit('''
952 main() {
953 print(MY_VAR);
954 }
955 ''');
956 performAllAnalysisTasks();
957 assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
958 import 'lib.dart';
959
960 main() {
961 print(MY_VAR);
962 }
963 ''');
964 }
965
966 void test_importLibraryProject_withType_inParentFolder() {
967 testFile = '/project/bin/test.dart';
968 addSource('/project/lib.dart', '''
969 library lib;
970 class Test {}
971 ''');
972 _indexTestUnit('''
973 main() {
974 Test t = null;
975 }
976 ''');
977 performAllAnalysisTasks();
978 assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
979 import '../lib.dart';
980
981 main() {
982 Test t = null;
983 }
984 ''');
985 }
986
987 void test_importLibraryProject_withType_inRelativeFolder() {
988 testFile = '/project/bin/test.dart';
989 addSource('/project/lib/sub/folder/lib.dart', '''
990 library lib;
991 class Test {}
992 ''');
993 _indexTestUnit('''
994 main() {
995 Test t = null;
996 }
997 ''');
998 performAllAnalysisTasks();
999 assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
1000 import '../lib/sub/folder/lib.dart';
1001
1002 main() {
1003 Test t = null;
1004 }
1005 ''');
1006 }
1007
1008 void test_importLibraryProject_withType_inSameFolder() {
1009 testFile = '/project/bin/test.dart';
1010 addSource('/project/bin/lib.dart', '''
1011 library lib;
1012 class Test {}
1013 ''');
1014 _indexTestUnit('''
1015 main() {
1016 Test t = null;
1017 }
1018 ''');
1019 performAllAnalysisTasks();
1020 assertHasFix(FixKind.IMPORT_LIBRARY_PROJECT, '''
1021 import 'lib.dart';
1022
1023 main() {
1024 Test t = null;
1025 }
1026 ''');
1027 }
1028
1029 void test_importLibrarySdk_withTopLevelVariable() {
1030 _ensureSdkMathLibraryResolved();
1031 _indexTestUnit('''
1032 main() {
1033 print(PI);
1034 }
1035 ''');
1036 performAllAnalysisTasks();
1037 assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
1038 import 'dart:math';
1039
1040 main() {
1041 print(PI);
1042 }
1043 ''');
1044 }
1045
1046 void test_importLibrarySdk_withType_invocationTarget() {
1047 _ensureSdkAsyncLibraryResolved();
1048 _indexTestUnit('''
1049 main() {
1050 Future.wait(null);
1051 }
1052 ''');
1053 assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
1054 import 'dart:async';
1055
1056 main() {
1057 Future.wait(null);
1058 }
1059 ''');
1060 }
1061
1062 void test_importLibrarySdk_withType_typeAnnotation() {
1063 _ensureSdkAsyncLibraryResolved();
1064 _indexTestUnit('''
1065 main() {
1066 Future f = null;
1067 }
1068 ''');
1069 assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
1070 import 'dart:async';
1071
1072 main() {
1073 Future f = null;
1074 }
1075 ''');
1076 }
1077
1078 void test_importLibrarySdk_withType_typeAnnotation_PrefixedIdentifier() {
1079 _ensureSdkAsyncLibraryResolved();
1080 _indexTestUnit('''
1081 main() {
1082 Future.wait;
1083 }
1084 ''');
1085 assertHasFix(FixKind.IMPORT_LIBRARY_SDK, '''
1086 import 'dart:async';
1087
1088 main() {
1089 Future.wait;
1090 }
1091 ''');
1092 }
1093
1094 void test_importLibraryShow() {
1095 _indexTestUnit('''
1096 import 'dart:async' show Stream;
1097 main() {
1098 Stream s = null;
1099 Future f = null;
1100 }
1101 ''');
1102 assertHasFix(FixKind.IMPORT_LIBRARY_SHOW, '''
1103 import 'dart:async' show Future, Stream;
1104 main() {
1105 Stream s = null;
1106 Future f = null;
1107 }
1108 ''');
1109 }
1110
1111 void test_isNotNull() {
1112 _indexTestUnit('''
1113 main(p) {
1114 p is! Null;
1115 }
1116 ''');
1117 assertHasFix(FixKind.USE_NOT_EQ_NULL, '''
1118 main(p) {
1119 p != null;
1120 }
1121 ''');
1122 }
1123
1124 void test_isNull() {
1125 _indexTestUnit('''
1126 main(p) {
1127 p is Null;
1128 }
1129 ''');
1130 assertHasFix(FixKind.USE_EQ_EQ_NULL, '''
1131 main(p) {
1132 p == null;
1133 }
1134 ''');
1135 }
1136
1137 void test_makeEnclosingClassAbstract_declaresAbstractMethod() {
1138 _indexTestUnit('''
1139 class A {
1140 m();
1141 }
1142 ''');
1143 assertHasFix(FixKind.MAKE_CLASS_ABSTRACT, '''
1144 abstract class A {
1145 m();
1146 }
1147 ''');
1148 }
1149
1150 void test_makeEnclosingClassAbstract_inheritsAbstractMethod() {
1151 _indexTestUnit('''
1152 abstract class A {
1153 m();
1154 }
1155 class B extends A {
1156 }
1157 ''');
1158 assertHasFix(FixKind.MAKE_CLASS_ABSTRACT, '''
1159 abstract class A {
1160 m();
1161 }
1162 abstract class B extends A {
1163 }
1164 ''');
1165 }
1166
1167 void test_removeParentheses_inGetterDeclaration() {
1168 _indexTestUnit('''
1169 class A {
1170 int get foo() => 0;
1171 }
1172 ''');
1173 assertHasFix(FixKind.REMOVE_PARAMETERS_IN_GETTER_DECLARATION, '''
1174 class A {
1175 int get foo => 0;
1176 }
1177 ''');
1178 }
1179
1180 void test_removeParentheses_inGetterInvocation() {
1181 _indexTestUnit('''
1182 class A {
1183 int get foo => 0;
1184 }
1185 main(A a) {
1186 a.foo();
1187 }
1188 ''');
1189 assertHasFix(FixKind.REMOVE_PARENTHESIS_IN_GETTER_INVOCATION, '''
1190 class A {
1191 int get foo => 0;
1192 }
1193 main(A a) {
1194 a.foo;
1195 }
1196 ''');
1197 }
1198
1199 void test_removeUnnecessaryCast_assignment() {
1200 _indexTestUnit('''
1201 main(Object p) {
1202 if (p is String) {
1203 String v = ((p as String));
1204 }
1205 }
1206 ''');
1207 assertHasFix(FixKind.REMOVE_UNNECASSARY_CAST, '''
1208 main(Object p) {
1209 if (p is String) {
1210 String v = p;
1211 }
1212 }
1213 ''');
1214 }
1215
1216 void test_removeUnusedImport() {
1217 _indexTestUnit('''
1218 import 'dart:math';
1219 main() {
1220 }
1221 ''');
1222 assertHasFix(FixKind.REMOVE_UNUSED_IMPORT, '''
1223 main() {
1224 }
1225 ''');
1226 }
1227
1228 void test_removeUnusedImport_anotherImportOnLine() {
1229 _indexTestUnit('''
1230 import 'dart:math'; import 'dart:async';
1231
1232 main() {
1233 Future f;
1234 }
1235 ''');
1236 assertHasFix(FixKind.REMOVE_UNUSED_IMPORT, '''
1237 import 'dart:async';
1238
1239 main() {
1240 Future f;
1241 }
1242 ''');
1243 }
1244
1245 void test_removeUnusedImport_severalLines() {
1246 _indexTestUnit('''
1247 import
1248 'dart:math';
1249 main() {
1250 }
1251 ''');
1252 assertHasFix(FixKind.REMOVE_UNUSED_IMPORT, '''
1253 main() {
1254 }
1255 ''');
1256 }
1257
1258 void test_replaceWithConstInstanceCreation() {
1259 _indexTestUnit('''
1260 class A {
1261 const A();
1262 }
1263 const a = new A();
1264 ''');
1265 assertHasFix(FixKind.USE_CONST, '''
1266 class A {
1267 const A();
1268 }
1269 const a = const A();
1270 ''');
1271 }
1272
1273 void test_undefinedClass_useSimilar_fromImport() {
1274 _indexTestUnit('''
1275 main() {
1276 Stirng s = 'abc';
1277 }
1278 ''');
1279 assertHasFix(FixKind.CHANGE_TO, '''
1280 main() {
1281 String s = 'abc';
1282 }
1283 ''');
1284 }
1285
1286 void test_undefinedClass_useSimilar_fromThisLibrary() {
1287 _indexTestUnit('''
1288 class MyClass {}
1289 main() {
1290 MyCalss v = null;
1291 }
1292 ''');
1293 assertHasFix(FixKind.CHANGE_TO, '''
1294 class MyClass {}
1295 main() {
1296 MyClass v = null;
1297 }
1298 ''');
1299 }
1300
1301 void test_undefinedFunction_create_fromFunction() {
1302 _indexTestUnit('''
1303 main() {
1304 int v = myUndefinedFunction(1, 2.0, '3');
1305 }
1306 ''');
1307 assertHasFix(FixKind.CREATE_FUNCTION, '''
1308 main() {
1309 int v = myUndefinedFunction(1, 2.0, '3');
1310 }
1311
1312 int myUndefinedFunction(int i, double d, String s) {
1313 }
1314 ''');
1315 }
1316
1317 void test_undefinedFunction_create_fromMethod() {
1318 _indexTestUnit('''
1319 class A {
1320 main() {
1321 int v = myUndefinedFunction(1, 2.0, '3');
1322 }
1323 }
1324 ''');
1325 assertHasFix(FixKind.CREATE_FUNCTION, '''
1326 class A {
1327 main() {
1328 int v = myUndefinedFunction(1, 2.0, '3');
1329 }
1330 }
1331
1332 int myUndefinedFunction(int i, double d, String s) {
1333 }
1334 ''');
1335 }
1336
1337 void test_undefinedFunction_create_returnType_bool_expressions() {
1338 assert_undefinedFunction_create_returnType_bool("!test();");
1339 assert_undefinedFunction_create_returnType_bool("b && test();");
1340 assert_undefinedFunction_create_returnType_bool("test() && b;");
1341 assert_undefinedFunction_create_returnType_bool("b || test();");
1342 assert_undefinedFunction_create_returnType_bool("test() || b;");
1343 }
1344
1345 void test_undefinedFunction_create_returnType_bool_statements() {
1346 assert_undefinedFunction_create_returnType_bool("assert ( test() );");
1347 assert_undefinedFunction_create_returnType_bool("if ( test() ) {}");
1348 assert_undefinedFunction_create_returnType_bool("while ( test() ) {}");
1349 assert_undefinedFunction_create_returnType_bool("do {} while ( test() );");
1350 }
1351
1352 void test_undefinedFunction_create_returnType_fromAssignment_eq() {
1353 _indexTestUnit('''
1354 main() {
1355 int v;
1356 v = myUndefinedFunction();
1357 }
1358 ''');
1359 assertHasFix(FixKind.CREATE_FUNCTION, '''
1360 main() {
1361 int v;
1362 v = myUndefinedFunction();
1363 }
1364
1365 int myUndefinedFunction() {
1366 }
1367 ''');
1368 }
1369
1370 void test_undefinedFunction_create_returnType_fromAssignment_plusEq() {
1371 _indexTestUnit('''
1372 main() {
1373 int v;
1374 v += myUndefinedFunction();
1375 }
1376 ''');
1377 assertHasFix(FixKind.CREATE_FUNCTION, '''
1378 main() {
1379 int v;
1380 v += myUndefinedFunction();
1381 }
1382
1383 num myUndefinedFunction() {
1384 }
1385 ''');
1386 }
1387
1388 void test_undefinedFunction_create_returnType_fromBinary_right() {
1389 _indexTestUnit('''
1390 main() {
1391 0 + myUndefinedFunction();
1392 }
1393 ''');
1394 assertHasFix(FixKind.CREATE_FUNCTION, '''
1395 main() {
1396 0 + myUndefinedFunction();
1397 }
1398
1399 num myUndefinedFunction() {
1400 }
1401 ''');
1402 }
1403
1404 void test_undefinedFunction_create_returnType_fromInitializer() {
1405 _indexTestUnit('''
1406 main() {
1407 int v = myUndefinedFunction();
1408 }
1409 ''');
1410 assertHasFix(FixKind.CREATE_FUNCTION, '''
1411 main() {
1412 int v = myUndefinedFunction();
1413 }
1414
1415 int myUndefinedFunction() {
1416 }
1417 ''');
1418 }
1419
1420 void test_undefinedFunction_create_returnType_fromInvocationArgument() {
1421 _indexTestUnit('''
1422 foo(int p) {}
1423 main() {
1424 foo( myUndefinedFunction() );
1425 }
1426 ''');
1427 assertHasFix(FixKind.CREATE_FUNCTION, '''
1428 foo(int p) {}
1429 main() {
1430 foo( myUndefinedFunction() );
1431 }
1432
1433 int myUndefinedFunction() {
1434 }
1435 ''');
1436 }
1437
1438 void test_undefinedFunction_create_returnType_fromReturn() {
1439 _indexTestUnit('''
1440 int main() {
1441 return myUndefinedFunction();
1442 }
1443 ''');
1444 assertHasFix(FixKind.CREATE_FUNCTION, '''
1445 int main() {
1446 return myUndefinedFunction();
1447 }
1448
1449 int myUndefinedFunction() {
1450 }
1451 ''');
1452 }
1453
1454 void test_undefinedFunction_create_returnType_void() {
1455 _indexTestUnit('''
1456 main() {
1457 myUndefinedFunction();
1458 }
1459 ''');
1460 assertHasFix(FixKind.CREATE_FUNCTION, '''
1461 main() {
1462 myUndefinedFunction();
1463 }
1464
1465 void myUndefinedFunction() {
1466 }
1467 ''');
1468 }
1469
1470 void test_undefinedFunction_useSimilar_fromImport() {
1471 _indexTestUnit('''
1472 main() {
1473 pritn(0);
1474 }
1475 ''');
1476 assertHasFix(FixKind.CHANGE_TO, '''
1477 main() {
1478 print(0);
1479 }
1480 ''');
1481 }
1482
1483 void test_undefinedFunction_useSimilar_thisLibrary() {
1484 _indexTestUnit('''
1485 myFunction() {}
1486 main() {
1487 myFuntcion();
1488 }
1489 ''');
1490 assertHasFix(FixKind.CHANGE_TO, '''
1491 myFunction() {}
1492 main() {
1493 myFunction();
1494 }
1495 ''');
1496 }
1497
1498 void test_undefinedMethod_createQualified_fromClass() {
1499 _indexTestUnit('''
1500 class A {
1501 }
1502 main() {
1503 A.myUndefinedMethod();
1504 }
1505 ''');
1506 assertHasFix(FixKind.CREATE_METHOD, '''
1507 class A {
1508 static void myUndefinedMethod() {
1509 }
1510 }
1511 main() {
1512 A.myUndefinedMethod();
1513 }
1514 ''');
1515 }
1516
1517 void test_undefinedMethod_createQualified_fromClass_hasOtherMember() {
1518 _indexTestUnit('''
1519 class A {
1520 foo() {}
1521 }
1522 main() {
1523 A.myUndefinedMethod();
1524 }
1525 ''');
1526 assertHasFix(FixKind.CREATE_METHOD, '''
1527 class A {
1528 foo() {}
1529
1530 static void myUndefinedMethod() {
1531 }
1532 }
1533 main() {
1534 A.myUndefinedMethod();
1535 }
1536 ''');
1537 }
1538
1539 void test_undefinedMethod_createQualified_fromInstance() {
1540 _indexTestUnit('''
1541 class A {
1542 }
1543 main(A a) {
1544 a.myUndefinedMethod();
1545 }
1546 ''');
1547 assertHasFix(FixKind.CREATE_METHOD, '''
1548 class A {
1549 void myUndefinedMethod() {
1550 }
1551 }
1552 main(A a) {
1553 a.myUndefinedMethod();
1554 }
1555 ''');
1556 }
1557
1558 void test_undefinedMethod_createQualified_targetIsFunctionType() {
1559 _indexTestUnit('''
1560 typedef A();
1561 main() {
1562 A.myUndefinedMethod();
1563 }
1564 ''');
1565 assertNoFix(FixKind.CREATE_METHOD);
1566 }
1567
1568 void test_undefinedMethod_createQualified_targetIsUnresolved() {
1569 _indexTestUnit('''
1570 main() {
1571 NoSuchClass.myUndefinedMethod();
1572 }
1573 ''');
1574 assertNoFix(FixKind.CREATE_METHOD);
1575 }
1576
1577 void test_undefinedMethod_createUnqualified_parameters() {
1578 _indexTestUnit('''
1579 class A {
1580 main() {
1581 myUndefinedMethod(0, 1.0, '3');
1582 }
1583 }
1584 ''');
1585 assertHasFix(FixKind.CREATE_METHOD, '''
1586 class A {
1587 main() {
1588 myUndefinedMethod(0, 1.0, '3');
1589 }
1590
1591 void myUndefinedMethod(int i, double d, String s) {
1592 }
1593 }
1594 ''');
1595 // linked positions
1596 _assertHasLinkedPositions(
1597 'NAME',
1598 ['myUndefinedMethod(0', 'myUndefinedMethod(int']);
1599 _assertHasLinkedPositions('RETURN_TYPE', ['void myUndefinedMethod(']);
1600 _assertHasLinkedPositions('TYPE0', ['int i']);
1601 _assertHasLinkedPositions('TYPE1', ['double d']);
1602 _assertHasLinkedPositions('TYPE2', ['String s']);
1603 _assertHasLinkedPositions('ARG0', ['i,']);
1604 _assertHasLinkedPositions('ARG1', ['d,']);
1605 _assertHasLinkedPositions('ARG2', ['s)']);
1606 // linked proposals
1607 _assertHasLinkedSuggestions(
1608 'TYPE0',
1609 expectedSuggestions(
1610 LinkedEditSuggestionKind.TYPE,
1611 ['int', 'num', 'Object', 'Comparable']));
1612 _assertHasLinkedSuggestions(
1613 'TYPE1',
1614 expectedSuggestions(
1615 LinkedEditSuggestionKind.TYPE,
1616 ['double', 'num', 'Object', 'Comparable']));
1617 _assertHasLinkedSuggestions(
1618 'TYPE2',
1619 expectedSuggestions(
1620 LinkedEditSuggestionKind.TYPE,
1621 ['String', 'Object', 'Comparable']));
1622 }
1623
1624 List<LinkedEditSuggestion> expectedSuggestions(LinkedEditSuggestionKind kind,
1625 List<String> values) {
1626 return values.map((value) {
1627 return new LinkedEditSuggestion(kind, value);
1628 }).toList();
1629 }
1630
1631 void test_undefinedMethod_createUnqualified_returnType() {
1632 _indexTestUnit('''
1633 class A {
1634 main() {
1635 int v = myUndefinedMethod();
1636 }
1637 }
1638 ''');
1639 assertHasFix(FixKind.CREATE_METHOD, '''
1640 class A {
1641 main() {
1642 int v = myUndefinedMethod();
1643 }
1644
1645 int myUndefinedMethod() {
1646 }
1647 }
1648 ''');
1649 // linked positions
1650 _assertHasLinkedPositions(
1651 'NAME',
1652 ['myUndefinedMethod();', 'myUndefinedMethod() {']);
1653 _assertHasLinkedPositions('RETURN_TYPE', ['int myUndefinedMethod(']);
1654 }
1655
1656 void test_undefinedMethod_createUnqualified_staticFromField() {
1657 _indexTestUnit('''
1658 class A {
1659 static var f = myUndefinedMethod();
1660 }
1661 ''');
1662 assertHasFix(FixKind.CREATE_METHOD, '''
1663 class A {
1664 static var f = myUndefinedMethod();
1665
1666 static myUndefinedMethod() {
1667 }
1668 }
1669 ''');
1670 }
1671
1672 void test_undefinedMethod_createUnqualified_staticFromMethod() {
1673 _indexTestUnit('''
1674 class A {
1675 static main() {
1676 myUndefinedMethod();
1677 }
1678 }
1679 ''');
1680 assertHasFix(FixKind.CREATE_METHOD, '''
1681 class A {
1682 static main() {
1683 myUndefinedMethod();
1684 }
1685
1686 static void myUndefinedMethod() {
1687 }
1688 }
1689 ''');
1690 }
1691
1692 void test_undefinedMethod_hint_createQualified_fromInstance() {
1693 _indexTestUnit('''
1694 class A {
1695 }
1696 main() {
1697 var a = new A();
1698 a.myUndefinedMethod();
1699 }
1700 ''');
1701 assertHasFix(FixKind.CREATE_METHOD, '''
1702 class A {
1703 void myUndefinedMethod() {
1704 }
1705 }
1706 main() {
1707 var a = new A();
1708 a.myUndefinedMethod();
1709 }
1710 ''');
1711 }
1712
1713 void test_undefinedMethod_useSimilar_ignoreOperators() {
1714 _indexTestUnit('''
1715 main(Object object) {
1716 object.then();
1717 }
1718 ''');
1719 assertNoFix(FixKind.CHANGE_TO);
1720 }
1721
1722 void test_undefinedMethod_useSimilar_qualified() {
1723 _indexTestUnit('''
1724 class A {
1725 myMethod() {}
1726 }
1727 main() {
1728 A a = new A();
1729 a.myMehtod();
1730 }
1731 ''');
1732 assertHasFix(FixKind.CHANGE_TO, '''
1733 class A {
1734 myMethod() {}
1735 }
1736 main() {
1737 A a = new A();
1738 a.myMethod();
1739 }
1740 ''');
1741 }
1742
1743 void test_undefinedMethod_useSimilar_unqualified_superClass() {
1744 _indexTestUnit('''
1745 class A {
1746 myMethod() {}
1747 }
1748 class B extends A {
1749 main() {
1750 myMehtod();
1751 }
1752 }
1753 ''');
1754 assertHasFix(FixKind.CHANGE_TO, '''
1755 class A {
1756 myMethod() {}
1757 }
1758 class B extends A {
1759 main() {
1760 myMethod();
1761 }
1762 }
1763 ''');
1764 }
1765
1766 void test_undefinedMethod_useSimilar_unqualified_thisClass() {
1767 _indexTestUnit('''
1768 class A {
1769 myMethod() {}
1770 main() {
1771 myMehtod();
1772 }
1773 }
1774 ''');
1775 assertHasFix(FixKind.CHANGE_TO, '''
1776 class A {
1777 myMethod() {}
1778 main() {
1779 myMethod();
1780 }
1781 }
1782 ''');
1783 }
1784
1785 void test_useEffectiveIntegerDivision() {
1786 _indexTestUnit('''
1787 main() {
1788 var a = 5;
1789 var b = 2;
1790 print((a / b).toInt());
1791 }
1792 ''');
1793 assertHasFix(FixKind.USE_EFFECTIVE_INTEGER_DIVISION, '''
1794 main() {
1795 var a = 5;
1796 var b = 2;
1797 print(a ~/ b);
1798 }
1799 ''');
1800 }
1801
1802 /**
1803 * Computes fixes and verifies that there is a fix of the given kind.
1804 */
1805 Fix _assertHasFix(FixKind kind, AnalysisError error) {
1806 List<Fix> fixes = computeFixes(searchEngine, testUnit, error);
1807 for (Fix fix in fixes) {
1808 if (fix.kind == kind) {
1809 return fix;
1810 }
1811 }
1812 throw fail('Expected to find fix $kind in\n${fixes.join('\n')}');
1813 }
1814
1815 void _assertHasLinkedPositions(String groupId, List<String> expectedStrings) {
1816 List<Position> expectedPositions = _findResultPositions(expectedStrings);
1817 List<LinkedEditGroup> groups = change.linkedEditGroups;
1818 for (LinkedEditGroup group in groups) {
1819 if (group.id == groupId) {
1820 List<Position> actualPositions = group.positions;
1821 expect(actualPositions, unorderedEquals(expectedPositions));
1822 return;
1823 }
1824 }
1825 fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
1826 }
1827
1828 void _assertHasLinkedSuggestions(String groupId,
1829 List<LinkedEditSuggestion> expected) {
1830 List<LinkedEditGroup> groups = change.linkedEditGroups;
1831 for (LinkedEditGroup group in groups) {
1832 if (group.id == groupId) {
1833 expect(group.suggestions, expected);
1834 return;
1835 }
1836 }
1837 fail('No group with ID=$groupId foind in\n${groups.join('\n')}');
1838 }
1839
1840 /**
1841 * We search for elements only already resolved lbiraries, and we use
1842 * `dart:async` elements in tests.
1843 */
1844 void _ensureSdkAsyncLibraryResolved() {
1845 resolveLibraryUnit(addSource('/other.dart', 'import "dart:async";'));
1846 }
1847
1848 /**
1849 * We search for elements only already resolved lbiraries, and we use
1850 * `dart:async` elements in tests.
1851 */
1852 void _ensureSdkMathLibraryResolved() {
1853 resolveLibraryUnit(addSource('/other.dart', 'import "dart:math";'));
1854 }
1855
1856 AnalysisError _findErrorToFix() {
1857 List<AnalysisError> errors = context.computeErrors(testSource);
1858 expect(
1859 errors,
1860 hasLength(1),
1861 reason: 'Exactly 1 error expected, but ${errors.length} found:\n' +
1862 errors.join('\n'));
1863 return errors[0];
1864 }
1865
1866 List<Position> _findResultPositions(List<String> searchStrings) {
1867 List<Position> positions = <Position>[];
1868 for (String search in searchStrings) {
1869 int offset = resultCode.indexOf(search);
1870 int length = getLeadingIdentifierLength(search);
1871 positions.add(new Position(testFile, offset));
1872 }
1873 return positions;
1874 }
1875
1876 void _indexTestUnit(String code) {
1877 resolveTestUnit(code);
1878 index.indexUnit(context, testUnit);
1879 }
1880 }
OLDNEW
« no previous file with comments | « pkg/analysis_services/test/correction/change_test.dart ('k') | pkg/analysis_services/test/correction/levenshtein_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698