| 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 2421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2432 | 2432 |
| 2433 test_implicitDynamic_type() async { | 2433 test_implicitDynamic_type() async { |
| 2434 addFile(r''' | 2434 addFile(r''' |
| 2435 class C<T> {} | 2435 class C<T> {} |
| 2436 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} | 2436 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} |
| 2437 class M2<T> {} | 2437 class M2<T> {} |
| 2438 class I<T> {} | 2438 class I<T> {} |
| 2439 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C | 2439 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C |
| 2440 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 | 2440 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 |
| 2441 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} | 2441 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} |
| 2442 class D2<T, S> = /*error:IMPLICIT_DYNAMIC_TYPE*/C |
| 2443 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 |
| 2444 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I; |
| 2442 | 2445 |
| 2443 C f(D d) { | 2446 C f(D d) { |
| 2444 D x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); | 2447 D x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); |
| 2445 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2448 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
| 2446 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2449 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
| 2447 return /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/C()
; | 2450 return /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/C()
; |
| 2448 } | 2451 } |
| 2449 | 2452 |
| 2450 class A<T extends num> {} | 2453 class A<T extends num> {} |
| 2451 class N1<T extends List<int>> {} | 2454 class N1<T extends List<int>> {} |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2631 m(A a); | 2634 m(A a); |
| 2632 } | 2635 } |
| 2633 | 2636 |
| 2634 class M { | 2637 class M { |
| 2635 m(B a) {} | 2638 m(B a) {} |
| 2636 } | 2639 } |
| 2637 | 2640 |
| 2638 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 | 2641 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 |
| 2639 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M | 2642 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 2640 implements I {} | 2643 implements I {} |
| 2644 |
| 2645 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Object |
| 2646 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M implements I; |
| 2641 '''); | 2647 '''); |
| 2642 } | 2648 } |
| 2643 | 2649 |
| 2644 test_invalidOverrides_mixinOverrideToBase() async { | 2650 test_invalidOverrides_mixinOverrideToBase() async { |
| 2645 await checkFile(''' | 2651 await checkFile(''' |
| 2646 class A {} | 2652 class A {} |
| 2647 class B {} | 2653 class B {} |
| 2648 | 2654 |
| 2649 class Base { | 2655 class Base { |
| 2650 m(A a) {} | 2656 m(A a) {} |
| 2651 int x; | 2657 int x; |
| 2652 } | 2658 } |
| 2653 | 2659 |
| 2654 class M1 { | 2660 class M1 { |
| 2655 m(B a) {} | 2661 m(B a) {} |
| 2656 } | 2662 } |
| 2657 | 2663 |
| 2658 class M2 { | 2664 class M2 { |
| 2659 int x; | 2665 int x; |
| 2660 } | 2666 } |
| 2661 | 2667 |
| 2662 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base | 2668 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base |
| 2663 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {} | 2669 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {} |
| 2664 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base | 2670 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 extends Base |
| 2665 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, M2 {} | 2671 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, M2 {} |
| 2666 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base | 2672 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 extends Base |
| 2667 with M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {} | 2673 with M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1 {} |
| 2674 |
| 2675 |
| 2676 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base |
| 2677 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1; |
| 2678 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U2 = Base |
| 2679 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, M2; |
| 2680 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U3 = Base |
| 2681 with M2, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1; |
| 2668 '''); | 2682 '''); |
| 2669 } | 2683 } |
| 2670 | 2684 |
| 2671 test_invalidOverrides_mixinOverrideToMixin() async { | 2685 test_invalidOverrides_mixinOverrideToMixin() async { |
| 2672 await checkFile(''' | 2686 await checkFile(''' |
| 2673 class A {} | 2687 class A {} |
| 2674 class B {} | 2688 class B {} |
| 2675 | 2689 |
| 2676 class Base { | 2690 class Base { |
| 2677 } | 2691 } |
| 2678 | 2692 |
| 2679 class M1 { | 2693 class M1 { |
| 2680 m(B a) {} | 2694 m(B a) {} |
| 2681 int x; | 2695 int x; |
| 2682 } | 2696 } |
| 2683 | 2697 |
| 2684 class M2 { | 2698 class M2 { |
| 2685 m(A a) {} | 2699 m(A a) {} |
| 2686 int x; | 2700 int x; |
| 2687 } | 2701 } |
| 2688 | 2702 |
| 2689 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base | 2703 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base |
| 2690 with M1, | 2704 with M1, |
| 2691 /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2 {} | 2705 /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2 {} |
| 2706 |
| 2707 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base |
| 2708 with M1, |
| 2709 /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2; |
| 2692 '''); | 2710 '''); |
| 2693 } | 2711 } |
| 2694 | 2712 |
| 2695 test_invalidOverrides_noDuplicateMixinOverride() async { | 2713 test_invalidOverrides_noDuplicateMixinOverride() async { |
| 2696 // This is a regression test for a bug in an earlier implementation were | 2714 // This is a regression test for a bug in an earlier implementation were |
| 2697 // names were hiding errors if the first mixin override looked correct, | 2715 // names were hiding errors if the first mixin override looked correct, |
| 2698 // but subsequent ones did not. | 2716 // but subsequent ones did not. |
| 2699 await checkFile(''' | 2717 await checkFile(''' |
| 2700 class A {} | 2718 class A {} |
| 2701 class B {} | 2719 class B {} |
| 2702 | 2720 |
| 2703 class Base { | 2721 class Base { |
| 2704 m(A a) {} | 2722 m(A a) {} |
| 2705 } | 2723 } |
| 2706 | 2724 |
| 2707 class M1 { | 2725 class M1 { |
| 2708 m(A a) {} | 2726 m(A a) {} |
| 2709 } | 2727 } |
| 2710 | 2728 |
| 2711 class M2 { | 2729 class M2 { |
| 2712 m(B a) {} | 2730 m(B a) {} |
| 2713 } | 2731 } |
| 2714 | 2732 |
| 2715 class M3 { | 2733 class M3 { |
| 2716 m(B a) {} | 2734 m(B a) {} |
| 2717 } | 2735 } |
| 2718 | 2736 |
| 2719 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base | 2737 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base |
| 2720 with M1, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2, M3 {} | 2738 with M1, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2, M3 {} |
| 2739 |
| 2740 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base |
| 2741 with M1, /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2, M3; |
| 2721 '''); | 2742 '''); |
| 2722 } | 2743 } |
| 2723 | 2744 |
| 2724 test_invalidOverrides_noErrorsIfSubclassCorrectlyOverrideBaseAndInterface() as
ync { | 2745 test_invalidOverrides_noErrorsIfSubclassCorrectlyOverrideBaseAndInterface() as
ync { |
| 2725 // This is a case were it is incorrect to say that the base class | 2746 // This is a case were it is incorrect to say that the base class |
| 2726 // incorrectly overrides the interface. | 2747 // incorrectly overrides the interface. |
| 2727 await checkFile(''' | 2748 await checkFile(''' |
| 2728 class A {} | 2749 class A {} |
| 2729 class B {} | 2750 class B {} |
| 2730 | 2751 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2741 implements I1 {} | 2762 implements I1 {} |
| 2742 | 2763 |
| 2743 class T2 extends Base implements I1 { | 2764 class T2 extends Base implements I1 { |
| 2744 m(a) {} | 2765 m(a) {} |
| 2745 } | 2766 } |
| 2746 | 2767 |
| 2747 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 | 2768 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T3 |
| 2748 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/Base | 2769 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/Base |
| 2749 implements I1 {} | 2770 implements I1 {} |
| 2750 | 2771 |
| 2772 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U3 |
| 2773 = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/Base |
| 2774 implements I1; |
| 2775 |
| 2751 class T4 extends Object with Base implements I1 { | 2776 class T4 extends Object with Base implements I1 { |
| 2752 m(a) {} | 2777 m(a) {} |
| 2753 } | 2778 } |
| 2754 '''); | 2779 '''); |
| 2755 } | 2780 } |
| 2756 | 2781 |
| 2757 test_invalidRuntimeChecks() async { | 2782 test_invalidRuntimeChecks() async { |
| 2758 await checkFile(''' | 2783 await checkFile(''' |
| 2759 typedef int I2I(int x); | 2784 typedef int I2I(int x); |
| 2760 typedef int D2I(x); | 2785 typedef int D2I(x); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2953 m(A a); | 2978 m(A a); |
| 2954 } | 2979 } |
| 2955 abstract class Base implements I1 {} | 2980 abstract class Base implements I1 {} |
| 2956 | 2981 |
| 2957 class M { | 2982 class M { |
| 2958 m(B a) {} | 2983 m(B a) {} |
| 2959 } | 2984 } |
| 2960 | 2985 |
| 2961 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base | 2986 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base |
| 2962 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M {} | 2987 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M {} |
| 2988 |
| 2989 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base |
| 2990 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M; |
| 2963 '''); | 2991 '''); |
| 2964 } | 2992 } |
| 2965 | 2993 |
| 2966 test_mixinOverrideOfGrandInterface_interfaceOfConcreteSuperclass() async { | 2994 test_mixinOverrideOfGrandInterface_interfaceOfConcreteSuperclass() async { |
| 2967 await checkFile(''' | 2995 await checkFile(''' |
| 2968 class A {} | 2996 class A {} |
| 2969 class B {} | 2997 class B {} |
| 2970 | 2998 |
| 2971 abstract class I1 { | 2999 abstract class I1 { |
| 2972 m(A a); | 3000 m(A a); |
| 2973 } | 3001 } |
| 2974 | 3002 |
| 2975 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base | 3003 class /*error:NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE*/Base |
| 2976 implements I1 {} | 3004 implements I1 {} |
| 2977 | 3005 |
| 2978 class M { | 3006 class M { |
| 2979 m(B a) {} | 3007 m(B a) {} |
| 2980 } | 3008 } |
| 2981 | 3009 |
| 2982 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base | 3010 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Base with M {} |
| 2983 with M {} | 3011 |
| 3012 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = Base with M; |
| 2984 '''); | 3013 '''); |
| 2985 } | 3014 } |
| 2986 | 3015 |
| 2987 test_mixinOverrideOfGrandInterface_interfaceOfInterfaceOfChild() async { | 3016 test_mixinOverrideOfGrandInterface_interfaceOfInterfaceOfChild() async { |
| 2988 await checkFile(''' | 3017 await checkFile(''' |
| 2989 class A {} | 3018 class A {} |
| 2990 class B {} | 3019 class B {} |
| 2991 | 3020 |
| 2992 abstract class I1 { | 3021 abstract class I1 { |
| 2993 m(A a); | 3022 m(A a); |
| 2994 } | 3023 } |
| 2995 abstract class I2 implements I1 {} | 3024 abstract class I2 implements I1 {} |
| 2996 | 3025 |
| 2997 class M { | 3026 class M { |
| 2998 m(B a) {} | 3027 m(B a) {} |
| 2999 } | 3028 } |
| 3000 | 3029 |
| 3001 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 | 3030 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 |
| 3002 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M | 3031 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3003 implements I2 {} | 3032 implements I2 {} |
| 3033 |
| 3034 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 |
| 3035 = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3036 implements I2; |
| 3004 '''); | 3037 '''); |
| 3005 } | 3038 } |
| 3006 | 3039 |
| 3007 test_mixinOverrideOfGrandInterface_mixinOfInterfaceOfChild() async { | 3040 test_mixinOverrideOfGrandInterface_mixinOfInterfaceOfChild() async { |
| 3008 await checkFile(''' | 3041 await checkFile(''' |
| 3009 class A {} | 3042 class A {} |
| 3010 class B {} | 3043 class B {} |
| 3011 | 3044 |
| 3012 abstract class M1 { | 3045 abstract class M1 { |
| 3013 m(A a); | 3046 m(A a); |
| 3014 } | 3047 } |
| 3015 abstract class I2 extends Object with M1 {} | 3048 abstract class I2 extends Object with M1 {} |
| 3016 | 3049 |
| 3017 class M { | 3050 class M { |
| 3018 m(B a) {} | 3051 m(B a) {} |
| 3019 } | 3052 } |
| 3020 | 3053 |
| 3021 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 | 3054 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 |
| 3022 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M | 3055 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3023 implements I2 {} | 3056 implements I2 {} |
| 3057 |
| 3058 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 |
| 3059 = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3060 implements I2; |
| 3024 '''); | 3061 '''); |
| 3025 } | 3062 } |
| 3026 | 3063 |
| 3027 test_mixinOverrideOfGrandInterface_superclassOfInterfaceOfChild() async { | 3064 test_mixinOverrideOfGrandInterface_superclassOfInterfaceOfChild() async { |
| 3028 await checkFile(''' | 3065 await checkFile(''' |
| 3029 class A {} | 3066 class A {} |
| 3030 class B {} | 3067 class B {} |
| 3031 | 3068 |
| 3032 abstract class I1 { | 3069 abstract class I1 { |
| 3033 m(A a); | 3070 m(A a); |
| 3034 } | 3071 } |
| 3035 abstract class I2 extends I1 {} | 3072 abstract class I2 extends I1 {} |
| 3036 | 3073 |
| 3037 class M { | 3074 class M { |
| 3038 m(B a) {} | 3075 m(B a) {} |
| 3039 } | 3076 } |
| 3040 | 3077 |
| 3041 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 | 3078 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 |
| 3042 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M | 3079 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3043 implements I2 {} | 3080 implements I2 {} |
| 3081 |
| 3082 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 |
| 3083 = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3084 implements I2; |
| 3044 '''); | 3085 '''); |
| 3045 } | 3086 } |
| 3046 | 3087 |
| 3047 test_noDuplicateReportsFromOverridingInterfaces_baseTypeAndMixinOverrideSameMe
thodInInterface() async { | 3088 test_noDuplicateReports_baseTypeAndMixinOverrideSameMethodInInterface() async
{ |
| 3048 await checkFile(''' | 3089 await checkFile(''' |
| 3049 class A {} | 3090 class A {} |
| 3050 class B {} | 3091 class B {} |
| 3051 | 3092 |
| 3052 abstract class I1 { | 3093 abstract class I1 { |
| 3053 m(A a); | 3094 m(A a); |
| 3054 } | 3095 } |
| 3055 | 3096 |
| 3056 class Base { | 3097 class Base { |
| 3057 m(B a) {} | 3098 m(B a) {} |
| 3058 } | 3099 } |
| 3059 | 3100 |
| 3060 class M { | 3101 class M { |
| 3061 m(B a) {} | 3102 m(B a) {} |
| 3062 } | 3103 } |
| 3063 | 3104 |
| 3064 // Here we want to report both, because the error location is | 3105 // Here we want to report both, because the error location is |
| 3065 // different. | 3106 // different. |
| 3066 // TODO(sigmund): should we merge these as well? | 3107 // TODO(sigmund): should we merge these as well? |
| 3067 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 | 3108 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 |
| 3068 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base | 3109 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base |
| 3069 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M | 3110 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3070 implements I1 {} | 3111 implements I1 {} |
| 3112 |
| 3113 |
| 3114 // Here we want to report both, because the error location is |
| 3115 // different. |
| 3116 // TODO(sigmund): should we merge these as well? |
| 3117 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U1 = |
| 3118 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/Base |
| 3119 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3120 implements I1; |
| 3071 '''); | 3121 '''); |
| 3072 } | 3122 } |
| 3073 | 3123 |
| 3074 test_noDuplicateReportsFromOverridingInterfaces_twoGrandTypesOverrideSameMetho
dInInterface() async { | 3124 test_noDuplicateReports_twoGrandTypesOverrideSameMethodInInterface() async { |
| 3075 await checkFile(''' | 3125 await checkFile(''' |
| 3076 class A {} | 3126 class A {} |
| 3077 class B {} | 3127 class B {} |
| 3078 | 3128 |
| 3079 abstract class I1 { | 3129 abstract class I1 { |
| 3080 m(A a); | 3130 m(A a); |
| 3081 } | 3131 } |
| 3082 | 3132 |
| 3083 class Grandparent { | 3133 class Grandparent { |
| 3084 m(B a) {} | 3134 m(B a) {} |
| 3085 } | 3135 } |
| 3086 | 3136 |
| 3087 class Parent1 extends Grandparent { | 3137 class Parent1 extends Grandparent { |
| 3088 m(B a) {} | 3138 m(B a) {} |
| 3089 } | 3139 } |
| 3090 class Parent2 extends Grandparent {} | 3140 class Parent2 extends Grandparent {} |
| 3091 | 3141 |
| 3092 // Note: otherwise both errors would be reported on this line | 3142 // Note: otherwise both errors would be reported on this line |
| 3093 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 | 3143 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 |
| 3094 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Parent1 | 3144 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Parent1 |
| 3095 implements I1 {} | 3145 implements I1 {} |
| 3096 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 | 3146 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 |
| 3097 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Parent2 | 3147 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Parent2 |
| 3098 implements I1 {} | 3148 implements I1 {} |
| 3099 '''); | 3149 '''); |
| 3100 } | 3150 } |
| 3101 | 3151 |
| 3102 test_noDuplicateReportsFromOverridingInterfaces_twoMixinsOverrideSameMethodInI
nterface() async { | 3152 test_noDuplicateReports_twoMixinsOverrideSameMethodInInterface() async { |
| 3103 await checkFile(''' | 3153 await checkFile(''' |
| 3104 class A {} | 3154 class A {} |
| 3105 class B {} | 3155 class B {} |
| 3106 | 3156 |
| 3107 abstract class I1 { | 3157 abstract class I1 { |
| 3108 m(A a); | 3158 m(A a); |
| 3109 } | 3159 } |
| 3110 | 3160 |
| 3111 class M1 { | 3161 class M1 { |
| 3112 m(B a) {} | 3162 m(B a) {} |
| 3113 } | 3163 } |
| 3114 | 3164 |
| 3115 class M2 { | 3165 class M2 { |
| 3116 m(B a) {} | 3166 m(B a) {} |
| 3117 } | 3167 } |
| 3118 | 3168 |
| 3119 // Here we want to report both, because the error location is | 3169 // Here we want to report both, because the error location is |
| 3120 // different. | 3170 // different. |
| 3121 // TODO(sigmund): should we merge these as well? | 3171 // TODO(sigmund): should we merge these as well? |
| 3122 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Object | 3172 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T1 extends Object |
| 3123 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, | 3173 with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M1, |
| 3124 /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2 | 3174 /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M2 |
| 3125 implements I1 {} | 3175 implements I1 {} |
| 3126 '''); | 3176 '''); |
| 3127 } | 3177 } |
| 3128 | 3178 |
| 3129 test_noDuplicateReportsFromOverridingInterfaces_typeAndBaseTypeOverrideSameMet
hodInInterface() async { | 3179 test_noDuplicateReports_typeAndBaseTypeOverrideSameMethodInInterface() async { |
| 3130 await checkFile(''' | 3180 await checkFile(''' |
| 3131 class A {} | 3181 class A {} |
| 3132 class B {} | 3182 class B {} |
| 3133 | 3183 |
| 3134 abstract class I1 { | 3184 abstract class I1 { |
| 3135 m(A a); | 3185 m(A a); |
| 3136 } | 3186 } |
| 3137 | 3187 |
| 3138 class Base { | 3188 class Base { |
| 3139 m(B a) {} | 3189 m(B a) {} |
| 3140 } | 3190 } |
| 3141 | 3191 |
| 3142 // Note: no error reported in `extends Base` to avoid duplicating | 3192 // Note: no error reported in `extends Base` to avoid duplicating |
| 3143 // the error in T1. | 3193 // the error in T1. |
| 3144 class T1 extends Base implements I1 { | 3194 class T1 extends Base implements I1 { |
| 3145 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} | 3195 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} |
| 3146 } | 3196 } |
| 3147 | 3197 |
| 3148 // If there is no error in the class, we do report the error at | 3198 // If there is no error in the class, we do report the error at |
| 3149 // the base class: | 3199 // the base class: |
| 3150 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 | 3200 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 |
| 3151 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base | 3201 /*error:INVALID_METHOD_OVERRIDE_FROM_BASE*/extends Base |
| 3152 implements I1 {} | 3202 implements I1 {} |
| 3153 '''); | 3203 '''); |
| 3154 } | 3204 } |
| 3155 | 3205 |
| 3156 test_noDuplicateReportsFromOverridingInterfaces_typeAndMixinOverrideSameMethod
InInterface() async { | 3206 test_noDuplicateReports_typeAndMixinOverrideSameMethodInInterface() async { |
| 3157 await checkFile(''' | 3207 await checkFile(''' |
| 3158 class A {} | 3208 class A {} |
| 3159 class B {} | 3209 class B {} |
| 3160 | 3210 |
| 3161 abstract class I1 { | 3211 abstract class I1 { |
| 3162 m(A a); | 3212 m(A a); |
| 3163 } | 3213 } |
| 3164 | 3214 |
| 3165 class M { | 3215 class M { |
| 3166 m(B a) {} | 3216 m(B a) {} |
| 3167 } | 3217 } |
| 3168 | 3218 |
| 3169 class T1 extends Object with M implements I1 { | 3219 class T1 extends Object with M implements I1 { |
| 3170 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} | 3220 /*error:INVALID_METHOD_OVERRIDE*/m(B a) {} |
| 3171 } | 3221 } |
| 3172 | 3222 |
| 3173 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 | 3223 class /*error:INCONSISTENT_METHOD_INHERITANCE*/T2 |
| 3174 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M | 3224 extends Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3175 implements I1 {} | 3225 implements I1 {} |
| 3226 |
| 3227 class /*error:INCONSISTENT_METHOD_INHERITANCE*/U2 |
| 3228 = Object with /*error:INVALID_METHOD_OVERRIDE_FROM_MIXIN*/M |
| 3229 implements I1; |
| 3176 '''); | 3230 '''); |
| 3177 } | 3231 } |
| 3178 | 3232 |
| 3179 test_noDuplicateReportsFromOverridingInterfaces_typeOverridesSomeMethodInMulti
pleInterfaces() async { | 3233 test_noDuplicateReports_typeOverridesSomeMethodInMultipleInterfaces() async { |
| 3180 await checkFile(''' | 3234 await checkFile(''' |
| 3181 class A {} | 3235 class A {} |
| 3182 class B {} | 3236 class B {} |
| 3183 | 3237 |
| 3184 abstract class I1 { | 3238 abstract class I1 { |
| 3185 m(A a); | 3239 m(A a); |
| 3186 } | 3240 } |
| 3187 abstract class I2 implements I1 { | 3241 abstract class I2 implements I1 { |
| 3188 m(A a); | 3242 m(A a); |
| 3189 } | 3243 } |
| (...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4149 class CheckerTest_Driver extends CheckerTest { | 4203 class CheckerTest_Driver extends CheckerTest { |
| 4150 @override | 4204 @override |
| 4151 bool get enableNewAnalysisDriver => true; | 4205 bool get enableNewAnalysisDriver => true; |
| 4152 | 4206 |
| 4153 @failingTest | 4207 @failingTest |
| 4154 @override | 4208 @override |
| 4155 test_covariantOverride_fields() async { | 4209 test_covariantOverride_fields() async { |
| 4156 await super.test_covariantOverride_fields(); | 4210 await super.test_covariantOverride_fields(); |
| 4157 } | 4211 } |
| 4158 } | 4212 } |
| OLD | NEW |