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

Side by Side Diff: test/checker/inferred_type_test.dart

Issue 1398873002: remove "infer from overrides" option which is now obsolete (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « test/checker/checker_test.dart ('k') | test/testing.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 /// Tests for type inference. 5 /// Tests for type inference.
6 library dev_compiler.test.inferred_type_test; 6 library dev_compiler.test.inferred_type_test;
7 7
8 import 'package:test/test.dart'; 8 import 'package:test/test.dart';
9 9
10 import '../testing.dart'; 10 import '../testing.dart';
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 var d1 = new D(); 552 var d1 = new D();
553 print(d1.c.b.a.x); 553 print(d1.c.b.a.x);
554 554
555 D d2 = new D(); 555 D d2 = new D();
556 print(d2.c.b.a.x); 556 print(d2.c.b.a.x);
557 } 557 }
558 ''' 558 '''
559 }); 559 });
560 560
561 group('infer type on overridden fields', () { 561 group('infer type on overridden fields', () {
562 testChecker( 562 testChecker('2', {
563 '2', 563 '/main.dart': '''
564 {
565 '/main.dart': '''
566 class A { 564 class A {
567 int x = 2; 565 int x = 2;
568 } 566 }
569 567
570 class B extends A { 568 class B extends A {
571 get x => 3; 569 get x => 3;
572 } 570 }
573 571
574 foo() { 572 foo() {
575 String y = /*severe:StaticTypeError*/new B().x; 573 String y = /*severe:StaticTypeError*/new B().x;
576 int z = new B().x; 574 int z = new B().x;
577 } 575 }
578 ''' 576 '''
579 }, 577 });
580 inferFromOverrides: true);
581 578
582 testChecker( 579 testChecker('4', {
583 '4', 580 '/main.dart': '''
584 {
585 '/main.dart': '''
586 class A { 581 class A {
587 int x = 2; 582 int x = 2;
588 } 583 }
589 584
590 class B implements A { 585 class B implements A {
591 get x => 3; 586 get x => 3;
592 } 587 }
593 588
594 foo() { 589 foo() {
595 String y = /*severe:StaticTypeError*/new B().x; 590 String y = /*severe:StaticTypeError*/new B().x;
596 int z = new B().x; 591 int z = new B().x;
597 } 592 }
598 ''' 593 '''
599 }, 594 });
600 inferFromOverrides: true);
601 }); 595 });
602 596
603 group('infer types on generic instantiations', () { 597 group('infer types on generic instantiations', () {
604 for (bool infer in [true, false]) { 598 testChecker('infer', {
605 testChecker( 599 '/main.dart': '''
606 'infer: $infer', 600 class A<T> {
607 { 601 T x;
608 '/main.dart': ''' 602 }
609 class A<T> {
610 T x;
611 }
612 603
613 class B implements A<int> { 604 class B implements A<int> {
614 /*severe:InvalidMethodOverride*/dynamic get x => 3; 605 /*severe:InvalidMethodOverride*/dynamic get x => 3;
615 } 606 }
616 607
617 foo() { 608 foo() {
618 String y = /*info:DynamicCast*/new B().x; 609 String y = /*info:DynamicCast*/new B().x;
619 int z = /*info:DynamicCast*/new B().x; 610 int z = /*info:DynamicCast*/new B().x;
620 } 611 }
621 ''' 612 '''
622 }, 613 });
623 inferFromOverrides: infer);
624 }
625 614
626 testChecker( 615 testChecker('3', {
627 '3', 616 '/main.dart': '''
628 {
629 '/main.dart': '''
630 class A<T> { 617 class A<T> {
631 T x; 618 T x;
632 T w; 619 T w;
633 } 620 }
634 621
635 class B implements A<int> { 622 class B implements A<int> {
636 get x => 3; 623 get x => 3;
637 get w => /*severe:StaticTypeError*/"hello"; 624 get w => /*severe:StaticTypeError*/"hello";
638 } 625 }
639 626
640 foo() { 627 foo() {
641 String y = /*severe:StaticTypeError*/new B().x; 628 String y = /*severe:StaticTypeError*/new B().x;
642 int z = new B().x; 629 int z = new B().x;
643 } 630 }
644 ''' 631 '''
645 }, 632 });
646 inferFromOverrides: true);
647 633
648 testChecker( 634 testChecker('4', {
649 '4', 635 '/main.dart': '''
650 {
651 '/main.dart': '''
652 class A<T> { 636 class A<T> {
653 T x; 637 T x;
654 } 638 }
655 639
656 class B<E> extends A<E> { 640 class B<E> extends A<E> {
657 E y; 641 E y;
658 get x => y; 642 get x => y;
659 } 643 }
660 644
661 foo() { 645 foo() {
662 int y = /*severe:StaticTypeError*/new B<String>().x; 646 int y = /*severe:StaticTypeError*/new B<String>().x;
663 String z = new B<String>().x; 647 String z = new B<String>().x;
664 } 648 }
665 ''' 649 '''
666 }, 650 });
667 inferFromOverrides: true);
668 651
669 testChecker( 652 testChecker('5', {
670 '5', 653 '/main.dart': '''
671 {
672 '/main.dart': '''
673 abstract class I<E> { 654 abstract class I<E> {
674 String m(a, String f(v, T e)); 655 String m(a, String f(v, T e));
675 } 656 }
676 657
677 abstract class A<E> implements I<E> { 658 abstract class A<E> implements I<E> {
678 const A(); 659 const A();
679 String m(a, String f(v, T e)); 660 String m(a, String f(v, T e));
680 } 661 }
681 662
682 abstract class M { 663 abstract class M {
683 int y; 664 int y;
684 } 665 }
685 666
686 class B<E> extends A<E> implements M { 667 class B<E> extends A<E> implements M {
687 const B(); 668 const B();
688 int get y => 0; 669 int get y => 0;
689 670
690 m(a, f(v, T e)) {} 671 m(a, f(v, T e)) {}
691 } 672 }
692 673
693 foo () { 674 foo () {
694 int y = /*severe:StaticTypeError*/new B().m(null, null); 675 int y = /*severe:StaticTypeError*/new B().m(null, null);
695 String z = new B().m(null, null); 676 String z = new B().m(null, null);
696 } 677 }
697 ''' 678 '''
698 }, 679 });
699 inferFromOverrides: true);
700 }); 680 });
701 681
702 testChecker( 682 testChecker('infer type regardless of declaration order or cycles', {
703 'infer type regardless of declaration order or cycles', 683 '/b.dart': '''
704 {
705 '/b.dart': '''
706 import 'main.dart'; 684 import 'main.dart';
707 685
708 class B extends A { } 686 class B extends A { }
709 ''', 687 ''',
710 '/main.dart': ''' 688 '/main.dart': '''
711 import 'b.dart'; 689 import 'b.dart';
712 class C extends B { 690 class C extends B {
713 get x; 691 get x;
714 } 692 }
715 class A { 693 class A {
716 int get x; 694 int get x;
717 } 695 }
718 foo () { 696 foo () {
719 int y = new C().x; 697 int y = new C().x;
720 String y = /*severe:StaticTypeError*/new C().x; 698 String y = /*severe:StaticTypeError*/new C().x;
721 } 699 }
722 ''' 700 '''
723 }, 701 });
724 inferFromOverrides: true);
725 702
726 // Note: this is a regression test for a non-deterministic behavior we used to 703 // Note: this is a regression test for a non-deterministic behavior we used to
727 // have with inference in library cycles. If you see this test flake out, 704 // have with inference in library cycles. If you see this test flake out,
728 // change `test` to `skip_test` and reopen bug #48. 705 // change `test` to `skip_test` and reopen bug #48.
729 testChecker( 706 testChecker('infer types on generic instantiations in library cycle', {
730 'infer types on generic instantiations in library cycle', 707 '/a.dart': '''
731 {
732 '/a.dart': '''
733 import 'main.dart'; 708 import 'main.dart';
734 abstract class I<E> { 709 abstract class I<E> {
735 A<E> m(a, String f(v, int e)); 710 A<E> m(a, String f(v, int e));
736 } 711 }
737 ''', 712 ''',
738 '/main.dart': ''' 713 '/main.dart': '''
739 import 'a.dart'; 714 import 'a.dart';
740 715
741 abstract class A<E> implements I<E> { 716 abstract class A<E> implements I<E> {
742 const A(); 717 const A();
743 718
744 E value; 719 E value;
745 } 720 }
746 721
747 abstract class M { 722 abstract class M {
748 int y; 723 int y;
749 } 724 }
750 725
751 class B<E> extends A<E> implements M { 726 class B<E> extends A<E> implements M {
752 const B(); 727 const B();
753 int get y => 0; 728 int get y => 0;
754 729
755 m(a, f(v, int e)) {} 730 m(a, f(v, int e)) {}
756 } 731 }
757 732
758 foo () { 733 foo () {
759 int y = /*severe:StaticTypeError*/new B<String>().m(null, null).value; 734 int y = /*severe:StaticTypeError*/new B<String>().m(null, null).value;
760 String z = new B<String>().m(null, null).value; 735 String z = new B<String>().m(null, null).value;
761 } 736 }
762 ''' 737 '''
763 }, 738 });
764 inferFromOverrides: true);
765 739
766 group('do not infer overridden fields that explicitly say dynamic', () { 740 group('do not infer overridden fields that explicitly say dynamic', () {
767 for (bool infer in [true, false]) { 741 testChecker('infer', {
768 testChecker( 742 '/main.dart': '''
769 'infer: $infer',
770 {
771 '/main.dart': '''
772 class A { 743 class A {
773 int x = 2; 744 int x = 2;
774 } 745 }
775 746
776 class B implements A { 747 class B implements A {
777 /*severe:InvalidMethodOverride*/dynamic get x => 3; 748 /*severe:InvalidMethodOverride*/dynamic get x => 3;
778 } 749 }
779 750
780 foo() { 751 foo() {
781 String y = /*info:DynamicCast*/new B().x; 752 String y = /*info:DynamicCast*/new B().x;
782 int z = /*info:DynamicCast*/new B().x; 753 int z = /*info:DynamicCast*/new B().x;
783 } 754 }
784 ''' 755 '''
785 }, 756 });
786 inferFromOverrides: infer);
787 }
788 }); 757 });
789 758
790 testChecker( 759 testChecker('conflicts can happen', {
791 'conflicts can happen', 760 '/main.dart': '''
792 {
793 '/main.dart': '''
794 class I1 { 761 class I1 {
795 int x; 762 int x;
796 } 763 }
797 class I2 extends I1 { 764 class I2 extends I1 {
798 int y; 765 int y;
799 } 766 }
800 767
801 class A { 768 class A {
802 final I1 a; 769 final I1 a;
803 } 770 }
804 771
805 class B { 772 class B {
806 final I2 a; 773 final I2 a;
807 } 774 }
808 775
809 class C1 extends A implements B { 776 class C1 extends A implements B {
810 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/get a => null; 777 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/get a => null;
811 } 778 }
812 779
813 // Still ambiguous 780 // Still ambiguous
814 class C2 extends B implements A { 781 class C2 extends B implements A {
815 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/get a => null; 782 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/get a => null;
816 } 783 }
817 ''' 784 '''
818 }, 785 });
819 inferFromOverrides: true);
820 786
821 testChecker( 787 testChecker('conflicts can happen 2', {
822 'conflicts can happen 2', 788 '/main.dart': '''
823 {
824 '/main.dart': '''
825 class I1 { 789 class I1 {
826 int x; 790 int x;
827 } 791 }
828 class I2 { 792 class I2 {
829 int y; 793 int y;
830 } 794 }
831 795
832 class I3 implements I1, I2 { 796 class I3 implements I1, I2 {
833 int x; 797 int x;
834 int y; 798 int y;
835 } 799 }
836 800
837 class A { 801 class A {
838 final I1 a; 802 final I1 a;
839 } 803 }
840 804
841 class B { 805 class B {
842 final I2 a; 806 final I2 a;
843 } 807 }
844 808
845 class C1 extends A implements B { 809 class C1 extends A implements B {
846 I3 get a => null; 810 I3 get a => null;
847 } 811 }
848 812
849 class C2 extends A implements B { 813 class C2 extends A implements B {
850 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/get a => null; 814 /*severe:InvalidMethodOverride,severe:InvalidMethodOverride*/get a => null;
851 } 815 }
852 ''' 816 '''
853 }, 817 });
854 inferFromOverrides: true);
855 818
856 testChecker( 819 testChecker(
857 'infer from RHS only if it wont conflict with overridden fields', 820 'infer from RHS only if it wont conflict with overridden fields', {
858 { 821 '/main.dart': '''
859 '/main.dart': '''
860 class A { 822 class A {
861 var x; 823 var x;
862 } 824 }
863 825
864 class B extends A { 826 class B extends A {
865 var x = 2; 827 var x = 2;
866 } 828 }
867 829
868 foo() { 830 foo() {
869 String y = /*info:DynamicCast*/new B().x; 831 String y = /*info:DynamicCast*/new B().x;
870 int z = /*info:DynamicCast*/new B().x; 832 int z = /*info:DynamicCast*/new B().x;
871 } 833 }
872 ''' 834 '''
873 }, 835 });
874 inferFromOverrides: true);
875 836
876 testChecker( 837 testChecker(
877 'infer from RHS only if it wont conflict with overridden fields 2', 838 'infer from RHS only if it wont conflict with overridden fields 2', {
878 { 839 '/main.dart': '''
879 '/main.dart': '''
880 class A { 840 class A {
881 final x; 841 final x;
882 } 842 }
883 843
884 class B extends A { 844 class B extends A {
885 final x = 2; 845 final x = 2;
886 } 846 }
887 847
888 foo() { 848 foo() {
889 String y = /*severe:StaticTypeError*/new B().x; 849 String y = /*severe:StaticTypeError*/new B().x;
890 int z = new B().x; 850 int z = new B().x;
891 } 851 }
892 ''' 852 '''
893 }, 853 });
894 inferFromOverrides: true);
895 854
896 testChecker( 855 testChecker('infer correctly on multiple variables declared together', {
897 'infer correctly on multiple variables declared together', 856 '/main.dart': '''
898 {
899 '/main.dart': '''
900 class A { 857 class A {
901 var x, y = 2, z = "hi"; 858 var x, y = 2, z = "hi";
902 } 859 }
903 860
904 class B extends A { 861 class B extends A {
905 var x = 2, y = 3, z, w = 2; 862 var x = 2, y = 3, z, w = 2;
906 } 863 }
907 864
908 foo() { 865 foo() {
909 String s; 866 String s;
910 int i; 867 int i;
911 868
912 s = /*info:DynamicCast*/new B().x; 869 s = /*info:DynamicCast*/new B().x;
913 s = /*severe:StaticTypeError*/new B().y; 870 s = /*severe:StaticTypeError*/new B().y;
914 s = new B().z; 871 s = new B().z;
915 s = /*severe:StaticTypeError*/new B().w; 872 s = /*severe:StaticTypeError*/new B().w;
916 873
917 i = /*info:DynamicCast*/new B().x; 874 i = /*info:DynamicCast*/new B().x;
918 i = new B().y; 875 i = new B().y;
919 i = /*severe:StaticTypeError*/new B().z; 876 i = /*severe:StaticTypeError*/new B().z;
920 i = new B().w; 877 i = new B().w;
921 } 878 }
922 ''' 879 '''
923 }, 880 });
924 inferFromOverrides: true);
925 881
926 testChecker( 882 testChecker(
927 'infer consts transitively', 883 'infer consts transitively',
928 { 884 {
929 '/b.dart': ''' 885 '/b.dart': '''
930 const b1 = 2; 886 const b1 = 2;
931 ''', 887 ''',
932 '/a.dart': ''' 888 '/a.dart': '''
933 import 'main.dart'; 889 import 'main.dart';
934 import 'b.dart'; 890 import 'b.dart';
935 const a1 = m2; 891 const a1 = m2;
936 const a2 = b1; 892 const a2 = b1;
937 ''', 893 ''',
938 '/main.dart': ''' 894 '/main.dart': '''
939 import 'a.dart'; 895 import 'a.dart';
940 const m1 = a1; 896 const m1 = a1;
941 const m2 = a2; 897 const m2 = a2;
942 898
943 foo() { 899 foo() {
944 int i; 900 int i;
945 i = m1; 901 i = m1;
946 } 902 }
947 ''' 903 '''
948 }, 904 },
949 inferFromOverrides: true,
950 inferTransitively: true); 905 inferTransitively: true);
951 906
952 testChecker( 907 testChecker(
953 'infer statics transitively', 908 'infer statics transitively',
954 { 909 {
955 '/b.dart': ''' 910 '/b.dart': '''
956 final b1 = 2; 911 final b1 = 2;
957 ''', 912 ''',
958 '/a.dart': ''' 913 '/a.dart': '''
959 import 'main.dart'; 914 import 'main.dart';
960 import 'b.dart'; 915 import 'b.dart';
961 final a1 = m2; 916 final a1 = m2;
962 class A { 917 class A {
963 static final a2 = b1; 918 static final a2 = b1;
964 } 919 }
965 ''', 920 ''',
966 '/main.dart': ''' 921 '/main.dart': '''
967 import 'a.dart'; 922 import 'a.dart';
968 final m1 = a1; 923 final m1 = a1;
969 final m2 = A.a2; 924 final m2 = A.a2;
970 925
971 foo() { 926 foo() {
972 int i; 927 int i;
973 i = m1; 928 i = m1;
974 } 929 }
975 ''' 930 '''
976 }, 931 },
977 inferFromOverrides: true,
978 inferTransitively: true); 932 inferTransitively: true);
979 933
980 testChecker( 934 testChecker(
981 'infer statics transitively 2', 935 'infer statics transitively 2',
982 { 936 {
983 '/main.dart': ''' 937 '/main.dart': '''
984 const x1 = 1; 938 const x1 = 1;
985 final x2 = 1; 939 final x2 = 1;
986 final y1 = x1; 940 final y1 = x1;
987 final y2 = x2; 941 final y2 = x2;
988 942
989 foo() { 943 foo() {
990 int i; 944 int i;
991 i = y1; 945 i = y1;
992 i = y2; 946 i = y2;
993 } 947 }
994 ''' 948 '''
995 }, 949 },
996 inferFromOverrides: true,
997 inferTransitively: true); 950 inferTransitively: true);
998 951
999 testChecker( 952 testChecker(
1000 'infer statics transitively 3', 953 'infer statics transitively 3',
1001 { 954 {
1002 '/a.dart': ''' 955 '/a.dart': '''
1003 const a1 = 3; 956 const a1 = 3;
1004 const a2 = 4; 957 const a2 = 4;
1005 class A { 958 class A {
1006 a3; 959 a3;
(...skipping 11 matching lines...) Expand all
1018 971
1019 foo() { 972 foo() {
1020 int i; 973 int i;
1021 i = t1; 974 i = t1;
1022 i = t2; 975 i = t2;
1023 i = t3; 976 i = t3;
1024 i = t4; 977 i = t4;
1025 } 978 }
1026 ''' 979 '''
1027 }, 980 },
1028 inferFromOverrides: true,
1029 inferTransitively: true); 981 inferTransitively: true);
1030 982
1031 testChecker( 983 testChecker(
1032 'infer statics with method invocations', 984 'infer statics with method invocations',
1033 { 985 {
1034 '/a.dart': ''' 986 '/a.dart': '''
1035 m3(String a, String b, [a1,a2]) {} 987 m3(String a, String b, [a1,a2]) {}
1036 ''', 988 ''',
1037 '/main.dart': ''' 989 '/main.dart': '''
1038 import 'a.dart'; 990 import 'a.dart';
1039 class T { 991 class T {
1040 static final T foo = m1(m2(m3('', ''))); 992 static final T foo = m1(m2(m3('', '')));
1041 static T m1(String m) { return null; } 993 static T m1(String m) { return null; }
1042 static String m2(e) { return ''; } 994 static String m2(e) { return ''; }
1043 } 995 }
1044 996
1045 997
1046 ''' 998 '''
1047 }, 999 },
1048 inferFromOverrides: true,
1049 inferTransitively: true); 1000 inferTransitively: true);
1050 1001
1051 testChecker( 1002 testChecker(
1052 'downwards inference: miscellaneous', 1003 'downwards inference: miscellaneous',
1053 { 1004 {
1054 '/main.dart': ''' 1005 '/main.dart': '''
1055 typedef (T x); 1006 typedef (T x);
1056 class A<T> { 1007 class A<T> {
1057 Function2<T> x; 1008 Function2<T> x;
1058 A(this.x); 1009 A(this.x);
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1413 main() { 1364 main() {
1414 Iterable<Future<int>> list = <int>[1, 2, 3].map(make); 1365 Iterable<Future<int>> list = <int>[1, 2, 3].map(make);
1415 Future<List<int>> results = Future.wait(list); 1366 Future<List<int>> results = Future.wait(list);
1416 Future<String> results2 = results.then((List<int> list) 1367 Future<String> results2 = results.then((List<int> list)
1417 => list.fold('', (String x, int y) => x + y.toString())); 1368 => list.fold('', (String x, int y) => x + y.toString()));
1418 } 1369 }
1419 ''' 1370 '''
1420 }); 1371 });
1421 }); 1372 });
1422 } 1373 }
OLDNEW
« no previous file with comments | « test/checker/checker_test.dart ('k') | test/testing.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698