OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 analyzer.test.src.task.strong.checker_test; | 5 library analyzer.test.src.task.strong.checker_test; |
6 | 6 |
7 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 7 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
8 | 8 |
9 import 'strong_test_helper.dart'; | 9 import 'strong_test_helper.dart'; |
10 | 10 |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 class C extends B {} | 719 class C extends B {} |
720 | 720 |
721 class Base { | 721 class Base { |
722 B f1; | 722 B f1; |
723 B f2; | 723 B f2; |
724 B f3; | 724 B f3; |
725 B f4; | 725 B f4; |
726 } | 726 } |
727 | 727 |
728 class Child extends Base { | 728 class Child extends Base { |
729 /*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/A f1; // invalid
for getter | 729 /*error:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter |
730 /*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/C f2; // invalid
for setter | 730 /*error:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter |
731 /*error:INVALID_FIELD_OVERRIDE*/var f3; | 731 var f3; |
732 /*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/dynamic f4; | 732 /*error:INVALID_METHOD_OVERRIDE*/dynamic f4; |
733 } | 733 } |
734 | 734 |
735 class Child2 implements Base { | 735 class Child2 implements Base { |
736 /*error:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter | 736 /*error:INVALID_METHOD_OVERRIDE*/A f1; // invalid for getter |
737 /*error:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter | 737 /*error:INVALID_METHOD_OVERRIDE*/C f2; // invalid for setter |
738 var f3; | 738 var f3; |
739 /*error:INVALID_METHOD_OVERRIDE*/dynamic f4; | 739 /*error:INVALID_METHOD_OVERRIDE*/dynamic f4; |
740 } | 740 } |
741 '''); | 741 '''); |
742 } | 742 } |
743 | 743 |
744 test_fieldGetterOverride() async { | 744 test_fieldGetterOverride() async { |
745 await checkFile(''' | 745 await checkFile(''' |
746 class A {} | 746 class A {} |
747 class B extends A {} | 747 class B extends A {} |
748 class C extends B {} | 748 class C extends B {} |
749 | 749 |
750 abstract class Base { | 750 abstract class Base { |
751 B f1; | 751 B f1; |
752 B f2; | 752 B f2; |
753 B f3; | 753 B f3; |
754 B f4; | 754 B f4; |
755 } | 755 } |
756 | 756 |
757 class Child extends Base { | 757 class Child extends Base { |
758 /*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/A get f1 => null
; | 758 /*error:INVALID_METHOD_OVERRIDE*/A get f1 => null; |
759 /*error:INVALID_FIELD_OVERRIDE*/C get f2 => null; | 759 C get f2 => null; |
760 /*error:INVALID_FIELD_OVERRIDE*/get f3 => null; | 760 get f3 => null; |
761 /*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/dynamic get f4 =
> null; | 761 /*error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null; |
762 } | 762 } |
763 | 763 |
764 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR*/Child2 implement
s Base { | 764 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR*/Child2 implement
s Base { |
765 /*error:INVALID_METHOD_OVERRIDE*/A get f1 => null; | 765 /*error:INVALID_METHOD_OVERRIDE*/A get f1 => null; |
766 C get f2 => null; | 766 C get f2 => null; |
767 get f3 => null; | 767 get f3 => null; |
768 /*error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null; | 768 /*error:INVALID_METHOD_OVERRIDE*/dynamic get f4 => null; |
769 } | 769 } |
770 '''); | 770 '''); |
771 } | 771 } |
772 | 772 |
773 test_fieldOverride_fuzzyArrows() async { | 773 test_fieldOverride_fuzzyArrows() async { |
774 await checkFile(''' | 774 await checkFile(''' |
775 typedef void ToVoid<T>(T x); | 775 typedef void ToVoid<T>(T x); |
776 class F { | 776 class F { |
777 final ToVoid<dynamic> f = null; | 777 final ToVoid<dynamic> f = null; |
778 final ToVoid<int> g = null; | 778 final ToVoid<int> g = null; |
779 } | 779 } |
780 | 780 |
781 class G extends F { | 781 class G extends F { |
782 /*error:INVALID_FIELD_OVERRIDE*/final ToVoid<int> f = null; | 782 final ToVoid<int> f = null; |
783 /*error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/final ToVoid<dy
namic> g = null; | 783 /*error:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null; |
784 } | 784 } |
785 | 785 |
786 class H implements F { | 786 class H implements F { |
787 final ToVoid<int> f = null; | 787 final ToVoid<int> f = null; |
788 /*error:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null; | 788 /*error:INVALID_METHOD_OVERRIDE*/final ToVoid<dynamic> g = null; |
789 } | 789 } |
790 '''); | 790 '''); |
791 } | 791 } |
792 | 792 |
793 test_fieldOverride_virtual() async { | 793 test_fieldOverride_virtual() async { |
(...skipping 14 matching lines...) Expand all Loading... |
808 set x(int v) {} | 808 set x(int v) {} |
809 } | 809 } |
810 class OverrideWithField extends C { | 810 class OverrideWithField extends C { |
811 int x; | 811 int x; |
812 | 812 |
813 // expose the hidden storage slot | 813 // expose the hidden storage slot |
814 int get superX => super.x; | 814 int get superX => super.x; |
815 set superX(int v) { super.x = v; } | 815 set superX(int v) { super.x = v; } |
816 } | 816 } |
817 class VirtualNotInherited extends OverrideWithField { | 817 class VirtualNotInherited extends OverrideWithField { |
818 /*error:INVALID_FIELD_OVERRIDE*/int x; | 818 int x; |
819 } | 819 } |
820 '''); | 820 '''); |
821 } | 821 } |
822 | 822 |
823 test_fieldSetterOverride() async { | 823 test_fieldSetterOverride() async { |
824 await checkFile(''' | 824 await checkFile(''' |
825 class A {} | 825 class A {} |
826 class B extends A {} | 826 class B extends A {} |
827 class C extends B {} | 827 class C extends B {} |
828 | 828 |
829 class Base { | 829 class Base { |
830 B f1; | 830 B f1; |
831 B f2; | 831 B f2; |
832 B f3; | 832 B f3; |
833 B f4; | 833 B f4; |
834 B f5; | 834 B f5; |
835 } | 835 } |
836 | 836 |
837 class Child extends Base { | 837 class Child extends Base { |
838 /*error:INVALID_FIELD_OVERRIDE*/B get f1 => null; | 838 B get f1 => null; |
839 /*error:INVALID_FIELD_OVERRIDE*/B get f2 => null; | 839 B get f2 => null; |
840 /*error:INVALID_FIELD_OVERRIDE*/B get f3 => null; | 840 B get f3 => null; |
841 /*error:INVALID_FIELD_OVERRIDE*/B get f4 => null; | 841 B get f4 => null; |
842 /*error:INVALID_FIELD_OVERRIDE*/B get f5 => null; | 842 B get f5 => null; |
843 | 843 |
844 /*error:INVALID_FIELD_OVERRIDE*/void set f1(A value) {} | 844 void set f1(A value) {} |
845 /*error:INVALID_FIELD_OVERRIDE,error:INVALID_METHOD_OVERRIDE*/void set f2(C va
lue) {} | 845 /*error:INVALID_METHOD_OVERRIDE*/void set f2(C value) {} |
846 /*error:INVALID_FIELD_OVERRIDE*/void set f3(value) {} | 846 void set f3(value) {} |
847 /*error:INVALID_FIELD_OVERRIDE*/void set f4(dynamic value) {} | 847 void set f4(dynamic value) {} |
848 /*error:INVALID_FIELD_OVERRIDE*/set f5(B value) {} | 848 set f5(B value) {} |
849 } | 849 } |
850 | 850 |
851 class Child2 implements Base { | 851 class Child2 implements Base { |
852 B get f1 => null; | 852 B get f1 => null; |
853 B get f2 => null; | 853 B get f2 => null; |
854 B get f3 => null; | 854 B get f3 => null; |
855 B get f4 => null; | 855 B get f4 => null; |
856 B get f5 => null; | 856 B get f5 => null; |
857 | 857 |
858 void set f1(A value) {} | 858 void set f1(A value) {} |
(...skipping 1624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2483 test_invalidOverrides_childOverride() async { | 2483 test_invalidOverrides_childOverride() async { |
2484 await checkFile(''' | 2484 await checkFile(''' |
2485 class A {} | 2485 class A {} |
2486 class B {} | 2486 class B {} |
2487 | 2487 |
2488 class Base { | 2488 class Base { |
2489 A f; | 2489 A f; |
2490 } | 2490 } |
2491 | 2491 |
2492 class T1 extends Base { | 2492 class T1 extends Base { |
2493 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_FIE
LD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/B get f => null; | 2493 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_METH
OD_OVERRIDE*/B get f => null; |
2494 } | 2494 } |
2495 | 2495 |
2496 class T2 extends Base { | 2496 class T2 extends Base { |
2497 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_FIE
LD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/set f( | 2497 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,error:INVALID_METH
OD_OVERRIDE*/set f( |
2498 B b) => null; | 2498 B b) => null; |
2499 } | 2499 } |
2500 | 2500 |
2501 class T3 extends Base { | 2501 class T3 extends Base { |
2502 /*error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/final B | 2502 /*error:INVALID_METHOD_OVERRIDE*/final B |
2503 /*warning:FINAL_NOT_INITIALIZED*/f; | 2503 /*warning:FINAL_NOT_INITIALIZED*/f; |
2504 } | 2504 } |
2505 class T4 extends Base { | 2505 class T4 extends Base { |
2506 // two: one for the getter one for the setter. | 2506 // two: one for the getter one for the setter. |
2507 /*error:INVALID_FIELD_OVERRIDE, error:INVALID_METHOD_OVERRIDE, error:INVALID_M
ETHOD_OVERRIDE*/B f; | 2507 /*error:INVALID_METHOD_OVERRIDE, error:INVALID_METHOD_OVERRIDE*/B f; |
2508 } | 2508 } |
2509 | 2509 |
2510 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T5 implements Bas
e { | 2510 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T5 implements Bas
e { |
2511 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_MET
HOD_OVERRIDE*/B get f => null; | 2511 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_MET
HOD_OVERRIDE*/B get f => null; |
2512 } | 2512 } |
2513 | 2513 |
2514 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T6 implements Bas
e { | 2514 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/T6 implements Bas
e { |
2515 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_MET
HOD_OVERRIDE*/set f(B b) => null; | 2515 /*warning:MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, error:INVALID_MET
HOD_OVERRIDE*/set f(B b) => null; |
2516 } | 2516 } |
2517 | 2517 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2599 | 2599 |
2600 class Grandparent { | 2600 class Grandparent { |
2601 m(A a) {} | 2601 m(A a) {} |
2602 int x; | 2602 int x; |
2603 } | 2603 } |
2604 class Parent extends Grandparent { | 2604 class Parent extends Grandparent { |
2605 } | 2605 } |
2606 | 2606 |
2607 class Test extends Parent { | 2607 class Test extends Parent { |
2608 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} | 2608 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} |
2609 /*error:INVALID_FIELD_OVERRIDE*/int x; | 2609 int x; |
2610 } | 2610 } |
2611 '''); | 2611 '''); |
2612 } | 2612 } |
2613 | 2613 |
2614 test_invalidOverrides_mixinOverrideOfInterface() async { | 2614 test_invalidOverrides_mixinOverrideOfInterface() async { |
2615 await checkFile(''' | 2615 await checkFile(''' |
2616 class A {} | 2616 class A {} |
2617 class B {} | 2617 class B {} |
2618 | 2618 |
2619 abstract class I { | 2619 abstract class I { |
(...skipping 24 matching lines...) Expand all Loading... |
2644 m(B a) {} | 2644 m(B a) {} |
2645 } | 2645 } |
2646 | 2646 |
2647 class M2 { | 2647 class M2 { |
2648 int x; | 2648 int x; |
2649 } | 2649 } |
2650 | 2650 |
2651 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base | 2651 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base |
2652 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {} | 2652 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {} |
2653 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base | 2653 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base |
2654 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, /*error:INVALID_FIELD_O
VERRIDE*/M2 {} | 2654 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, M2 {} |
2655 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base | 2655 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base |
2656 with /*error:INVALID_FIELD_OVERRIDE*/M2, /*error:INVALID_METHOD_OVERRIDE_FRO
M_MIXIN*/M1 {} | 2656 with M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {} |
2657 '''); | 2657 '''); |
2658 } | 2658 } |
2659 | 2659 |
2660 test_invalidOverrides_mixinOverrideToMixin() async { | 2660 test_invalidOverrides_mixinOverrideToMixin() async { |
2661 await checkFile(''' | 2661 await checkFile(''' |
2662 class A {} | 2662 class A {} |
2663 class B {} | 2663 class B {} |
2664 | 2664 |
2665 class Base { | 2665 class Base { |
2666 } | 2666 } |
2667 | 2667 |
2668 class M1 { | 2668 class M1 { |
2669 m(B a) {} | 2669 m(B a) {} |
2670 int x; | 2670 int x; |
2671 } | 2671 } |
2672 | 2672 |
2673 class M2 { | 2673 class M2 { |
2674 m(A a) {} | 2674 m(A a) {} |
2675 int x; | 2675 int x; |
2676 } | 2676 } |
2677 | 2677 |
2678 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base | 2678 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base |
2679 with M1, | 2679 with M1, |
2680 /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN,error:INVALID_FIELD_OVERRIDE*/M2
{} | 2680 /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2 {} |
2681 '''); | 2681 '''); |
2682 } | 2682 } |
2683 | 2683 |
2684 test_invalidOverrides_noDuplicateMixinOverride() async { | 2684 test_invalidOverrides_noDuplicateMixinOverride() async { |
2685 // This is a regression test for a bug in an earlier implementation were | 2685 // This is a regression test for a bug in an earlier implementation were |
2686 // names were hiding errors if the first mixin override looked correct, | 2686 // names were hiding errors if the first mixin override looked correct, |
2687 // but subsequent ones did not. | 2687 // but subsequent ones did not. |
2688 await checkFile(''' | 2688 await checkFile(''' |
2689 class A {} | 2689 class A {} |
2690 class B {} | 2690 class B {} |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3283 class Base { | 3283 class Base { |
3284 var f1; | 3284 var f1; |
3285 var _f2; | 3285 var _f2; |
3286 var _f3; | 3286 var _f3; |
3287 get _f4 => null; | 3287 get _f4 => null; |
3288 | 3288 |
3289 int _m1() => null; | 3289 int _m1() => null; |
3290 } | 3290 } |
3291 | 3291 |
3292 class GrandChild extends main.Child { | 3292 class GrandChild extends main.Child { |
3293 /*error:INVALID_FIELD_OVERRIDE*/var _f2; | 3293 var _f2; |
3294 /*error:INVALID_FIELD_OVERRIDE*/var _f3; | 3294 var _f3; |
3295 var _f4; | 3295 var _f4; |
3296 | 3296 |
3297 /*error:INVALID_METHOD_OVERRIDE*/String _m1() => null; | 3297 /*error:INVALID_METHOD_OVERRIDE*/String _m1() => null; |
3298 } | 3298 } |
3299 ''', | 3299 ''', |
3300 name: '/helper.dart'); | 3300 name: '/helper.dart'); |
3301 await checkFile(''' | 3301 await checkFile(''' |
3302 import 'helper.dart' as helper; | 3302 import 'helper.dart' as helper; |
3303 | 3303 |
3304 class Child extends helper.Base { | 3304 class Child extends helper.Base { |
3305 /*error:INVALID_FIELD_OVERRIDE*/var f1; | 3305 var f1; |
3306 var _f2; | 3306 var _f2; |
3307 var _f4; | 3307 var _f4; |
3308 | 3308 |
3309 String _m1() => null; | 3309 String _m1() => null; |
3310 } | 3310 } |
3311 '''); | 3311 '''); |
3312 } | 3312 } |
3313 | 3313 |
3314 test_proxy() async { | 3314 test_proxy() async { |
3315 await checkFile(r''' | 3315 await checkFile(r''' |
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4138 class CheckerTest_Driver extends CheckerTest { | 4138 class CheckerTest_Driver extends CheckerTest { |
4139 @override | 4139 @override |
4140 bool get enableNewAnalysisDriver => true; | 4140 bool get enableNewAnalysisDriver => true; |
4141 | 4141 |
4142 @failingTest | 4142 @failingTest |
4143 @override | 4143 @override |
4144 test_covariantOverride_fields() async { | 4144 test_covariantOverride_fields() async { |
4145 await super.test_covariantOverride_fields(); | 4145 await super.test_covariantOverride_fields(); |
4146 } | 4146 } |
4147 } | 4147 } |
OLD | NEW |