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

Side by Side Diff: pkg/analyzer/test/src/task/strong/checker_test.dart

Issue 2781443003: Fix #28120, strong mode allows field overrides (Closed)
Patch Set: fix Created 3 years, 8 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
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/test/src/context/context_test.dart ('k') | pkg/analyzer/test/src/task/strong/inferred_type_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698