| 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 |