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 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 await checkFile(''' | 380 await checkFile(''' |
381 abstract class Equality<Q> {} | 381 abstract class Equality<Q> {} |
382 abstract class EqualityBase<R> implements Equality<R> { | 382 abstract class EqualityBase<R> implements Equality<R> { |
383 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C(); | 383 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C(); |
384 const EqualityBase(); | 384 const EqualityBase(); |
385 } | 385 } |
386 class DefaultEquality<S> extends EqualityBase<S> { | 386 class DefaultEquality<S> extends EqualityBase<S> { |
387 const DefaultEquality(); | 387 const DefaultEquality(); |
388 } | 388 } |
389 class SetEquality<T> implements Equality<T> { | 389 class SetEquality<T> implements Equality<T> { |
390 final Equality<T> field = const DefaultEquality(); | 390 final Equality<T> field = /*info:INFERRED_TYPE_ALLOCATION*/const DefaultEquali
ty(); |
391 const SetEquality([Equality<T> inner = const DefaultEquality()]); | 391 const SetEquality([Equality<T> inner = /*info:INFERRED_TYPE_ALLOCATION*/const
DefaultEquality()]); |
392 } | 392 } |
393 class C<Q> { | 393 class C<Q> { |
394 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; | 394 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; |
395 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; | 395 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; |
396 const C(); | 396 const C(); |
397 } | 397 } |
398 main() { | 398 main() { |
399 const SetEquality<String>(); | 399 const SetEquality<String>(); |
400 } | 400 } |
401 '''); | 401 '''); |
(...skipping 2021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2423 addFile(r''' | 2423 addFile(r''' |
2424 class C<T> {} | 2424 class C<T> {} |
2425 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} | 2425 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} |
2426 class M2<T> {} | 2426 class M2<T> {} |
2427 class I<T> {} | 2427 class I<T> {} |
2428 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C | 2428 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C |
2429 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 | 2429 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 |
2430 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} | 2430 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} |
2431 | 2431 |
2432 C f(D d) { | 2432 C f(D d) { |
2433 D x = new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); | 2433 D x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); |
2434 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2434 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
2435 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2435 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
2436 return new /*error:IMPLICIT_DYNAMIC_TYPE*/C(); | 2436 return /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/C()
; |
2437 } | 2437 } |
2438 | 2438 |
2439 class A<T extends num> {} | 2439 class A<T extends num> {} |
2440 class N1<T extends List<int>> {} | 2440 class N1<T extends List<int>> {} |
2441 class N2<T extends Object> {} | 2441 class N2<T extends Object> {} |
2442 class J<T extends Object> {} | 2442 class J<T extends Object> {} |
2443 class B<T extends Object> extends A with N1, N2 implements J {} | 2443 class B<T extends Object> extends A with N1, N2 implements J {} |
2444 A g(B b) { | 2444 A g(B b) { |
2445 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B(); | 2445 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B(); |
2446 return /*info:INFERRED_TYPE_ALLOCATION*/new A(); | 2446 return /*info:INFERRED_TYPE_ALLOCATION*/new A(); |
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3382 M<Object> mOfOs; | 3382 M<Object> mOfOs; |
3383 M<A> mOfAs; | 3383 M<A> mOfAs; |
3384 | 3384 |
3385 { | 3385 { |
3386 lOfDs = mOfDs; | 3386 lOfDs = mOfDs; |
3387 lOfDs = mOfOs; | 3387 lOfDs = mOfOs; |
3388 lOfDs = mOfAs; | 3388 lOfDs = mOfAs; |
3389 lOfDs = lOfDs; | 3389 lOfDs = lOfDs; |
3390 lOfDs = lOfOs; | 3390 lOfDs = lOfOs; |
3391 lOfDs = lOfAs; | 3391 lOfDs = lOfAs; |
3392 lOfDs = new L(); // Reset type propagation. | 3392 lOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new L(); // Reset type propagation. |
3393 } | 3393 } |
3394 { | 3394 { |
3395 lOfOs = mOfDs; | 3395 lOfOs = mOfDs; |
3396 lOfOs = mOfOs; | 3396 lOfOs = mOfOs; |
3397 lOfOs = mOfAs; | 3397 lOfOs = mOfAs; |
3398 lOfOs = lOfDs; | 3398 lOfOs = lOfDs; |
3399 lOfOs = lOfOs; | 3399 lOfOs = lOfOs; |
3400 lOfOs = lOfAs; | 3400 lOfOs = lOfAs; |
3401 lOfOs = new L<Object>(); // Reset type propagation. | 3401 lOfOs = new L<Object>(); // Reset type propagation. |
3402 } | 3402 } |
3403 { | 3403 { |
3404 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs; | 3404 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs; |
3405 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs; | 3405 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs; |
3406 lOfAs = mOfAs; | 3406 lOfAs = mOfAs; |
3407 lOfAs = /*info:DOWN_CAST_COMPOSITE*/lOfDs; | 3407 lOfAs = /*info:DOWN_CAST_COMPOSITE*/lOfDs; |
3408 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3408 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3409 lOfAs = lOfAs; | 3409 lOfAs = lOfAs; |
3410 lOfAs = new L<A>(); // Reset type propagation. | 3410 lOfAs = new L<A>(); // Reset type propagation. |
3411 } | 3411 } |
3412 { | 3412 { |
3413 mOfDs = mOfDs; | 3413 mOfDs = mOfDs; |
3414 mOfDs = mOfOs; | 3414 mOfDs = mOfOs; |
3415 mOfDs = mOfAs; | 3415 mOfDs = mOfAs; |
3416 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; | 3416 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; |
3417 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3417 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3418 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs; | 3418 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs; |
3419 mOfDs = new M(); // Reset type propagation. | 3419 mOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new M(); // Reset type propagation. |
3420 } | 3420 } |
3421 { | 3421 { |
3422 mOfOs = mOfDs; | 3422 mOfOs = mOfDs; |
3423 mOfOs = mOfOs; | 3423 mOfOs = mOfOs; |
3424 mOfOs = mOfAs; | 3424 mOfOs = mOfAs; |
3425 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; | 3425 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; |
3426 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3426 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3427 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs; | 3427 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs; |
3428 mOfOs = new M<Object>(); // Reset type propagation. | 3428 mOfOs = new M<Object>(); // Reset type propagation. |
3429 } | 3429 } |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3764 num n = 3; | 3764 num n = 3; |
3765 int i = 3; | 3765 int i = 3; |
3766 String s = "hello"; | 3766 String s = "hello"; |
3767 { | 3767 { |
3768 List<int> l = <int>[i]; | 3768 List<int> l = <int>[i]; |
3769 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s]; | 3769 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s]; |
3770 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n]; | 3770 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n]; |
3771 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS
SIGNABLE*/s]; | 3771 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS
SIGNABLE*/s]; |
3772 } | 3772 } |
3773 { | 3773 { |
3774 List l = /*info:INFERRED_TYPE_LITERAL*/[i]; | 3774 List l = [i]; |
3775 l = /*info:INFERRED_TYPE_LITERAL*/[s]; | 3775 l = [s]; |
3776 l = /*info:INFERRED_TYPE_LITERAL*/[n]; | 3776 l = [n]; |
3777 l = /*info:INFERRED_TYPE_LITERAL*/[i, n, s]; | 3777 l = [i, n, s]; |
3778 } | 3778 } |
3779 { | 3779 { |
3780 Map<String, int> m = <String, int>{s: i}; | 3780 Map<String, int> m = <String, int>{s: i}; |
3781 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; | 3781 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; |
3782 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n}; | 3782 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n}; |
3783 m = <String, int>{s: i, | 3783 m = <String, int>{s: i, |
3784 s: /*info:DOWN_CAST_IMPLICIT*/n, | 3784 s: /*info:DOWN_CAST_IMPLICIT*/n, |
3785 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; | 3785 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; |
3786 } | 3786 } |
3787 // TODO(leafp): We can't currently test for key errors since the | 3787 // TODO(leafp): We can't currently test for key errors since the |
3788 // error marker binds to the entire entry. | 3788 // error marker binds to the entire entry. |
3789 { | 3789 { |
3790 Map m = /*info:INFERRED_TYPE_LITERAL*/{s: i}; | 3790 Map m = {s: i}; |
3791 m = /*info:INFERRED_TYPE_LITERAL*/{s: s}; | 3791 m = {s: s}; |
3792 m = /*info:INFERRED_TYPE_LITERAL*/{s: n}; | 3792 m = {s: n}; |
3793 m = /*info:INFERRED_TYPE_LITERAL*/ | 3793 m = {s: i, |
3794 {s: i, | |
3795 s: n, | 3794 s: n, |
3796 s: s}; | 3795 s: s}; |
3797 m = /*info:INFERRED_TYPE_LITERAL*/ | 3796 m = {i: s, |
3798 {i: s, | |
3799 n: s, | 3797 n: s, |
3800 s: s}; | 3798 s: s}; |
3801 } | 3799 } |
3802 } | 3800 } |
3803 '''); | 3801 '''); |
3804 } | 3802 } |
3805 | 3803 |
3806 test_typePromotionFromDynamic() async { | 3804 test_typePromotionFromDynamic() async { |
3807 await checkFile(r''' | 3805 await checkFile(r''' |
3808 f() { | 3806 f() { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3859 void f/*<T extends num>*/(T x, T y) { | 3857 void f/*<T extends num>*/(T x, T y) { |
3860 var z = x; | 3858 var z = x; |
3861 var f = () => x; | 3859 var f = () => x; |
3862 f = () => y; | 3860 f = () => y; |
3863 if (x is int) { | 3861 if (x is int) { |
3864 /*info:DYNAMIC_INVOKE*/z./*error:UNDEFINED_GETTER*/isEven; | 3862 /*info:DYNAMIC_INVOKE*/z./*error:UNDEFINED_GETTER*/isEven; |
3865 var q = x; | 3863 var q = x; |
3866 q = /*info:DOWN_CAST_COMPOSITE*/z; | 3864 q = /*info:DOWN_CAST_COMPOSITE*/z; |
3867 /*info:DYNAMIC_INVOKE*/f()./*error:UNDEFINED_GETTER*/isEven; | 3865 /*info:DYNAMIC_INVOKE*/f()./*error:UNDEFINED_GETTER*/isEven; |
3868 | 3866 |
3869 // This does not capture the type `T extends int`. Instead the return type | 3867 // This captures the type `T extends int`. |
3870 // is `T extends num`. What happens is we substitute {T/T} on the function | |
3871 // type, and the way it is implemented, this leads back to `T extends num`. | |
3872 // See https://github.com/dart-lang/sdk/issues/27725 | |
3873 var g = () => x; | 3868 var g = () => x; |
3874 g = f; | 3869 g = /*info:DOWN_CAST_COMPOSITE*/f; |
3875 /*info:DYNAMIC_INVOKE*/g()./*error:UNDEFINED_GETTER*/isEven; | 3870 g().isEven; |
3876 q = /*info:DOWN_CAST_COMPOSITE*/g(); | 3871 q = g(); |
3877 int r = x; | 3872 int r = x; |
3878 } | 3873 } |
3879 } | 3874 } |
3880 '''); | 3875 '''); |
3881 } | 3876 } |
3882 | 3877 |
3883 test_typeSubtyping_assigningClass() async { | 3878 test_typeSubtyping_assigningClass() async { |
3884 await checkFile(''' | 3879 await checkFile(''' |
3885 class A {} | 3880 class A {} |
3886 class B extends A {} | 3881 class B extends A {} |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4143 class CheckerTest_Driver extends CheckerTest { | 4138 class CheckerTest_Driver extends CheckerTest { |
4144 @override | 4139 @override |
4145 bool get enableNewAnalysisDriver => true; | 4140 bool get enableNewAnalysisDriver => true; |
4146 | 4141 |
4147 @failingTest | 4142 @failingTest |
4148 @override | 4143 @override |
4149 test_covariantOverride_fields() async { | 4144 test_covariantOverride_fields() async { |
4150 await super.test_covariantOverride_fields(); | 4145 await super.test_covariantOverride_fields(); |
4151 } | 4146 } |
4152 } | 4147 } |
OLD | NEW |