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

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

Issue 418203002: Implement more fixes. (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
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 // This code was auto-generated, is not intended to be edited, and is subject to 5 // This code was auto-generated, is not intended to be edited, and is subject to
6 // significant change. Please see the README file for more information. 6 // significant change. Please see the README file for more information.
7 7
8 library test.services.correction.fix; 8 library test.services.correction.fix;
9 9
10 import 'package:analysis_services/correction/change.dart'; 10 import 'package:analysis_services/correction/change.dart';
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 if (group.id == id) { 52 if (group.id == id) {
53 expect(group.positions, unorderedEquals(expectedPositions)); 53 expect(group.positions, unorderedEquals(expectedPositions));
54 return; 54 return;
55 } 55 }
56 } 56 }
57 fail('No PositionGroup with id=$id found in $linkedPositionGroups'); 57 fail('No PositionGroup with id=$id found in $linkedPositionGroups');
58 } 58 }
59 59
60 void assertNoFix(FixKind kind) { 60 void assertNoFix(FixKind kind) {
61 AnalysisError error = _findErrorToFix(); 61 AnalysisError error = _findErrorToFix();
62 List<Fix> fixes = computeFixes(searchEngine, testFile, testUnit, error); 62 List<Fix> fixes = computeFixes(searchEngine, testUnit, error);
63 for (Fix fix in fixes) { 63 for (Fix fix in fixes) {
64 if (fix.kind == kind) { 64 if (fix.kind == kind) {
65 throw fail('Unexpected fix $kind in\n${fixes.join('\n')}'); 65 throw fail('Unexpected fix $kind in\n${fixes.join('\n')}');
66 } 66 }
67 } 67 }
68 } 68 }
69 69
70 Position expectedPosition(String search) { 70 Position expectedPosition(String search) {
71 int offset = resultCode.indexOf(search); 71 int offset = resultCode.indexOf(search);
72 int length = getLeadingIdentifierLength(search); 72 int length = getLeadingIdentifierLength(search);
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 class A { 235 class A {
236 A._named(int p); 236 A._named(int p);
237 } 237 }
238 class B extends A { 238 class B extends A {
239 B() {} 239 B() {}
240 } 240 }
241 '''); 241 ''');
242 assertNoFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION); 242 assertNoFix(FixKind.ADD_SUPER_CONSTRUCTOR_INVOCATION);
243 } 243 }
244 244
245 void test_createConstructorSuperImplicit() {
246 _indexTestUnit('''
247 class A {
248 A(p1, int p2, List<String> p3, [int p4]);
249 }
250 class B extends A {
251 int existingField;
252
253 void existingMethod() {}
254 }
255 ''');
256 assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
257 class A {
258 A(p1, int p2, List<String> p3, [int p4]);
259 }
260 class B extends A {
261 int existingField;
262
263 B(p1, int p2, List<String> p3) : super(p1, p2, p3);
264
265 void existingMethod() {}
266 }
267 ''');
268 }
269
270 void test_createConstructorSuperImplicit_fieldInitializer() {
271 _indexTestUnit('''
272 class A {
273 int _field;
274 A(this._field);
275 }
276 class B extends A {
277 int existingField;
278
279 void existingMethod() {}
280 }
281 ''');
282 assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
283 class A {
284 int _field;
285 A(this._field);
286 }
287 class B extends A {
288 int existingField;
289
290 B(int field) : super(field);
291
292 void existingMethod() {}
293 }
294 ''');
295 }
296
297 void test_createConstructorSuperImplicit_named() {
298 _indexTestUnit('''
299 class A {
300 A.named(p1, int p2);
301 }
302 class B extends A {
303 int existingField;
304
305 void existingMethod() {}
306 }
307 ''');
308 assertHasFix(FixKind.CREATE_CONSTRUCTOR_SUPER, '''
309 class A {
310 A.named(p1, int p2);
311 }
312 class B extends A {
313 int existingField;
314
315 B.named(p1, int p2) : super.named(p1, p2);
316
317 void existingMethod() {}
318 }
319 ''');
320 }
321
322 void test_createConstructorSuperImplicit_private() {
323 _indexTestUnit('''
324 class A {
325 A._named(p);
326 }
327 class B extends A {
328 }
329 ''');
330 assertNoFix(FixKind.CREATE_CONSTRUCTOR_SUPER);
331 }
332
245 void test_createConstructor_insteadOfSyntheticDefault() { 333 void test_createConstructor_insteadOfSyntheticDefault() {
246 _indexTestUnit(''' 334 _indexTestUnit('''
247 class A { 335 class A {
248 int field; 336 int field;
249 337
250 method() {} 338 method() {}
251 } 339 }
252 main() { 340 main() {
253 new A(1, 2.0); 341 new A(1, 2.0);
254 } 342 }
(...skipping 28 matching lines...) Expand all
283 } 371 }
284 372
285 method() {} 373 method() {}
286 } 374 }
287 main() { 375 main() {
288 new A.named(1, 2.0); 376 new A.named(1, 2.0);
289 } 377 }
290 '''); 378 ''');
291 } 379 }
292 380
381 void test_createMissingOverrides_functionType() {
382 _indexTestUnit('''
383 abstract class A {
384 forEach(int f(double p1, String p2));
385 }
386
387 class B extends A {
388 }
389 ''');
390 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
391 abstract class A {
392 forEach(int f(double p1, String p2));
393 }
394
395 class B extends A {
396 @override
397 forEach(int f(double p1, String p2)) {
398 // TODO: implement forEach
399 }
400 }
401 ''');
402 }
403
404 void test_createMissingOverrides_generics() {
405 _indexTestUnit('''
406 class Iterator<T> {
407 }
408
409 abstract class IterableMixin<T> {
410 Iterator<T> get iterator;
411 }
412
413 class Test extends IterableMixin<int> {
414 }
415 ''');
416 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
417 class Iterator<T> {
418 }
419
420 abstract class IterableMixin<T> {
421 Iterator<T> get iterator;
422 }
423
424 class Test extends IterableMixin<int> {
425 // TODO: implement iterator
426 @override
427 Iterator<int> get iterator => null;
428 }
429 ''');
430 }
431
432 void test_createMissingOverrides_getter() {
433 _indexTestUnit('''
434 abstract class A {
435 get g1;
436 int get g2;
437 }
438
439 class B extends A {
440 }
441 ''');
442 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
443 abstract class A {
444 get g1;
445 int get g2;
446 }
447
448 class B extends A {
449 // TODO: implement g1
450 @override
451 get g1 => null;
452
453 // TODO: implement g2
454 @override
455 int get g2 => null;
456 }
457 ''');
458 }
459
460 void test_createMissingOverrides_importPrefix() {
461 _indexTestUnit('''
462 import 'dart:async' as aaa;
463 abstract class A {
464 Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
465 }
466
467 class B extends A {
468 }
469 ''');
470 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
471 import 'dart:async' as aaa;
472 abstract class A {
473 Map<aaa.Future, List<aaa.Future>> g(aaa.Future p);
474 }
475
476 class B extends A {
477 @override
478 Map<aaa.Future, List<aaa.Future>> g(aaa.Future p) {
479 // TODO: implement g
480 }
481 }
482 ''');
483 }
484
485 void test_createMissingOverrides_method() {
486 _indexTestUnit('''
487 abstract class A {
488 m1();
489 int m2();
490 String m3(int p1, double p2, Map<int, List<String>> p3);
491 String m4(p1, p2);
492 String m5(p1, [int p2 = 2, int p3, p4 = 4]);
493 String m6(p1, {int p2: 2, int p3, p4: 4});
494 }
495
496 class B extends A {
497 }
498 ''');
499 String expectedCode = '''
500 abstract class A {
501 m1();
502 int m2();
503 String m3(int p1, double p2, Map<int, List<String>> p3);
504 String m4(p1, p2);
505 String m5(p1, [int p2 = 2, int p3, p4 = 4]);
506 String m6(p1, {int p2: 2, int p3, p4: 4});
507 }
508
509 class B extends A {
510 @override
511 m1() {
512 // TODO: implement m1
513 }
514
515 @override
516 int m2() {
517 // TODO: implement m2
518 }
519
520 @override
521 String m3(int p1, double p2, Map<int, List<String>> p3) {
522 // TODO: implement m3
523 }
524
525 @override
526 String m4(p1, p2) {
527 // TODO: implement m4
528 }
529
530 @override
531 String m5(p1, [int p2 = 2, int p3, p4 = 4]) {
532 // TODO: implement m5
533 }
534
535 @override
536 String m6(p1, {int p2: 2, int p3, p4: 4}) {
537 // TODO: implement m6
538 }
539 }
540 ''';
541 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, expectedCode);
542 // end position should be on "m1", not on "m2", "m3", etc
543 {
544 Position endPosition = change.endPosition;
545 expect(endPosition, isNotNull);
546 expect(endPosition.file, testFile);
547 int endOffset = endPosition.offset;
548 String endString = expectedCode.substring(endOffset, endOffset + 25);
549 expect(endString, contains('m1'));
550 expect(endString, isNot(contains('m2')));
551 expect(endString, isNot(contains('m3')));
552 expect(endString, isNot(contains('m4')));
553 expect(endString, isNot(contains('m5')));
554 expect(endString, isNot(contains('m6')));
555 }
556 }
557
558 void test_createMissingOverrides_operator() {
559 _indexTestUnit('''
560 abstract class A {
561 int operator [](int index);
562 void operator []=(int index, String value);
563 }
564
565 class B extends A {
566 }
567 ''');
568 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
569 abstract class A {
570 int operator [](int index);
571 void operator []=(int index, String value);
572 }
573
574 class B extends A {
575 @override
576 int operator [](int index) {
577 // TODO: implement []
578 }
579
580 @override
581 void operator []=(int index, String value) {
582 // TODO: implement []=
583 }
584 }
585 ''');
586 }
587
588 void test_createMissingOverrides_setter() {
589 _indexTestUnit('''
590 abstract class A {
591 set s1(x);
592 set s2(int x);
593 void set s3(String x);
594 }
595
596 class B extends A {
597 }
598 ''');
599 assertHasFix(FixKind.CREATE_MISSING_OVERRIDES, '''
600 abstract class A {
601 set s1(x);
602 set s2(int x);
603 void set s3(String x);
604 }
605
606 class B extends A {
607 @override
608 set s1(x) {
609 // TODO: implement s1
610 }
611
612 @override
613 set s2(int x) {
614 // TODO: implement s2
615 }
616
617 @override
618 void set s3(String x) {
619 // TODO: implement s3
620 }
621 }
622 ''');
623 }
624
625 void test_createNoSuchMethod() {
626 _indexTestUnit('''
627 abstract class A {
628 m1();
629 int m2();
630 }
631
632 class B extends A {
633 existing() {}
634 }
635 ''');
636 assertHasFix(FixKind.CREATE_NO_SUCH_METHOD, '''
637 abstract class A {
638 m1();
639 int m2();
640 }
641
642 class B extends A {
643 existing() {}
644
645 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
646 }
647 ''');
648 }
649
650 void test_creationFunction_forFunctionType_cascadeSecond() {
651 _indexTestUnit('''
652 class A {
653 B ma() => null;
654 }
655 class B {
656 useFunction(int g(double a, String b)) {}
657 }
658
659 main() {
660 A a = new A();
661 a..ma().useFunction(test);
662 }
663 ''');
664 assertHasFix(FixKind.CREATE_FUNCTION, '''
665 class A {
666 B ma() => null;
667 }
668 class B {
669 useFunction(int g(double a, String b)) {}
670 }
671
672 main() {
673 A a = new A();
674 a..ma().useFunction(test);
675 }
676
677 int test(double a, String b) {
678 }
679 ''');
680 }
681
682 void test_creationFunction_forFunctionType_function() {
683 _indexTestUnit('''
684 main() {
685 useFunction(test);
686 }
687 useFunction(int g(double a, String b)) {}
688 ''');
689 assertHasFix(FixKind.CREATE_FUNCTION, '''
690 main() {
691 useFunction(test);
692 }
693 useFunction(int g(double a, String b)) {}
694
695 int test(double a, String b) {
696 }
697 ''');
698 }
699
700 void test_creationFunction_forFunctionType_method_enclosingClass_static() {
701 _indexTestUnit('''
702 class A {
703 static foo() {
704 useFunction(test);
705 }
706 }
707 useFunction(int g(double a, String b)) {}
708 ''');
709 assertHasFix(FixKind.CREATE_METHOD, '''
710 class A {
711 static foo() {
712 useFunction(test);
713 }
714
715 static int test(double a, String b) {
716 }
717 }
718 useFunction(int g(double a, String b)) {}
719 ''');
720 }
721
722 void test_creationFunction_forFunctionType_method_targetClass() {
723 _indexTestUnit('''
724 main(A a) {
725 useFunction(a.test);
726 }
727 class A {
728 }
729 useFunction(int g(double a, String b)) {}
730 ''');
731 assertHasFix(FixKind.CREATE_METHOD, '''
732 main(A a) {
733 useFunction(a.test);
734 }
735 class A {
736 int test(double a, String b) {
737 }
738 }
739 useFunction(int g(double a, String b)) {}
740 ''');
741 }
742
743 void
744 test_creationFunction_forFunctionType_method_targetClass_hasOtherMember() {
745 _indexTestUnit('''
746 main(A a) {
747 useFunction(a.test);
748 }
749 class A {
750 m() {}
751 }
752 useFunction(int g(double a, String b)) {}
753 ''');
754 assertHasFix(FixKind.CREATE_METHOD, '''
755 main(A a) {
756 useFunction(a.test);
757 }
758 class A {
759 m() {}
760
761 int test(double a, String b) {
762 }
763 }
764 useFunction(int g(double a, String b)) {}
765 ''');
766 }
767
768 void test_creationFunction_forFunctionType_notFunctionType() {
769 _indexTestUnit('''
770 main(A a) {
771 useFunction(a.test);
772 }
773 typedef A();
774 useFunction(g) {}
775 ''');
776 assertNoFix(FixKind.CREATE_METHOD);
777 assertNoFix(FixKind.CREATE_FUNCTION);
778 }
779
780 void test_creationFunction_forFunctionType_unknownTarget() {
781 _indexTestUnit('''
782 main(A a) {
783 useFunction(a.test);
784 }
785 class A {
786 }
787 useFunction(g) {}
788 ''');
789 assertNoFix(FixKind.CREATE_METHOD);
790 }
791
293 void test_expectedToken_semicolon() { 792 void test_expectedToken_semicolon() {
294 _indexTestUnit(''' 793 _indexTestUnit('''
295 main() { 794 main() {
296 print(0) 795 print(0)
297 } 796 }
298 '''); 797 ''');
299 assertHasFix(FixKind.INSERT_SEMICOLON, ''' 798 assertHasFix(FixKind.INSERT_SEMICOLON, '''
300 main() { 799 main() {
301 print(0); 800 print(0);
302 } 801 }
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 const a = new A(); 957 const a = new A();
459 '''); 958 ''');
460 assertHasFix(FixKind.USE_CONST, ''' 959 assertHasFix(FixKind.USE_CONST, '''
461 class A { 960 class A {
462 const A(); 961 const A();
463 } 962 }
464 const a = const A(); 963 const a = const A();
465 '''); 964 ''');
466 } 965 }
467 966
967 void test_undefinedMethod_createQualified_fromClass() {
968 _indexTestUnit('''
969 class A {
970 }
971 main() {
972 A.myUndefinedMethod();
973 }
974 ''');
975 assertHasFix(FixKind.CREATE_METHOD, '''
976 class A {
977 static void myUndefinedMethod() {
978 }
979 }
980 main() {
981 A.myUndefinedMethod();
982 }
983 ''');
984 }
985
986 void test_undefinedMethod_createQualified_fromClass_hasOtherMember() {
987 _indexTestUnit('''
988 class A {
989 foo() {}
990 }
991 main() {
992 A.myUndefinedMethod();
993 }
994 ''');
995 assertHasFix(FixKind.CREATE_METHOD, '''
996 class A {
997 foo() {}
998
999 static void myUndefinedMethod() {
1000 }
1001 }
1002 main() {
1003 A.myUndefinedMethod();
1004 }
1005 ''');
1006 }
1007
1008 void test_undefinedMethod_createQualified_fromClass_unresolved() {
1009 _indexTestUnit('''
1010 main() {
1011 NoSuchClass.myUndefinedMethod();
1012 }
1013 ''');
1014 assertNoFix(FixKind.CREATE_METHOD);
1015 }
1016
468 void test_useEffectiveIntegerDivision() { 1017 void test_useEffectiveIntegerDivision() {
469 _indexTestUnit(''' 1018 _indexTestUnit('''
470 main() { 1019 main() {
471 var a = 5; 1020 var a = 5;
472 var b = 2; 1021 var b = 2;
473 print((a / b).toInt()); 1022 print((a / b).toInt());
474 } 1023 }
475 '''); 1024 ''');
476 assertHasFix(FixKind.USE_EFFECTIVE_INTEGER_DIVISION, ''' 1025 assertHasFix(FixKind.USE_EFFECTIVE_INTEGER_DIVISION, '''
477 main() { 1026 main() {
478 var a = 5; 1027 var a = 5;
479 var b = 2; 1028 var b = 2;
480 print(a ~/ b); 1029 print(a ~/ b);
481 } 1030 }
482 '''); 1031 ''');
483 } 1032 }
484 1033
485 String _applyEdits(String code, List<Edit> edits) { 1034 String _applyEdits(String code, List<Edit> edits) {
486 edits.sort((a, b) => b.offset - a.offset); 1035 edits.sort((a, b) => a.offset - b.offset);
1036 edits = edits.reversed.toList();
Paul Berry 2014/07/25 00:28:46 What's the motivation for this change?
scheglov 2014/07/25 03:20:51 In order to avoid fixing offsets for Edit objects
487 edits.forEach((Edit edit) { 1037 edits.forEach((Edit edit) {
488 code = code.substring(0, edit.offset) + 1038 code = code.substring(0, edit.offset) +
489 edit.replacement + 1039 edit.replacement +
490 code.substring(edit.end); 1040 code.substring(edit.end);
491 }); 1041 });
492 return code; 1042 return code;
493 } 1043 }
494 1044
495 /** 1045 /**
496 * Computes fixes and verifies that there is a fix of the given kind. 1046 * Computes fixes and verifies that there is a fix of the given kind.
497 */ 1047 */
498 Fix _assertHasFix(FixKind kind, AnalysisError error) { 1048 Fix _assertHasFix(FixKind kind, AnalysisError error) {
499 List<Fix> fixes = computeFixes(searchEngine, testFile, testUnit, error); 1049 List<Fix> fixes = computeFixes(searchEngine, testUnit, error);
500 for (Fix fix in fixes) { 1050 for (Fix fix in fixes) {
501 if (fix.kind == kind) { 1051 if (fix.kind == kind) {
502 return fix; 1052 return fix;
503 } 1053 }
504 } 1054 }
505 throw fail('Expected to find fix $kind in\n${fixes.join('\n')}'); 1055 throw fail('Expected to find fix $kind in\n${fixes.join('\n')}');
506 } 1056 }
507 1057
508 AnalysisError _findErrorToFix() { 1058 AnalysisError _findErrorToFix() {
509 List<AnalysisError> errors = context.computeErrors(testSource); 1059 List<AnalysisError> errors = context.computeErrors(testSource);
510 expect( 1060 expect(
511 errors, 1061 errors,
512 hasLength(1), 1062 hasLength(1),
513 reason: 'Exactly 1 error expected, but ${errors.length} found:\n' + 1063 reason: 'Exactly 1 error expected, but ${errors.length} found:\n' +
514 errors.join('\n')); 1064 errors.join('\n'));
515 return errors[0]; 1065 return errors[0];
516 } 1066 }
517 1067
518 void _indexTestUnit(String code) { 1068 void _indexTestUnit(String code) {
519 resolveTestUnit(code); 1069 resolveTestUnit(code);
520 index.indexUnit(context, testUnit); 1070 index.indexUnit(context, testUnit);
521 } 1071 }
522 } 1072 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698