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 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 checkFile(''' | 400 checkFile(''' |
401 abstract class Equality<Q> {} | 401 abstract class Equality<Q> {} |
402 abstract class EqualityBase<R> implements Equality<R> { | 402 abstract class EqualityBase<R> implements Equality<R> { |
403 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C(); | 403 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C(); |
404 const EqualityBase(); | 404 const EqualityBase(); |
405 } | 405 } |
406 class DefaultEquality<S> extends EqualityBase<S> { | 406 class DefaultEquality<S> extends EqualityBase<S> { |
407 const DefaultEquality(); | 407 const DefaultEquality(); |
408 } | 408 } |
409 class SetEquality<T> implements Equality<T> { | 409 class SetEquality<T> implements Equality<T> { |
410 final Equality<T> field = const DefaultEquality(); | 410 final Equality<T> field = /*info:INFERRED_TYPE_ALLOCATION*/const DefaultEquali
ty(); |
411 const SetEquality([Equality<T> inner = const DefaultEquality()]); | 411 const SetEquality([Equality<T> inner = /*info:INFERRED_TYPE_ALLOCATION*/const
DefaultEquality()]); |
412 } | 412 } |
413 class C<Q> { | 413 class C<Q> { |
414 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; | 414 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; |
415 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; | 415 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; |
416 const C(); | 416 const C(); |
417 } | 417 } |
418 main() { | 418 main() { |
419 const SetEquality<String>(); | 419 const SetEquality<String>(); |
420 } | 420 } |
421 '''); | 421 '''); |
(...skipping 2021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2443 addFile(r''' | 2443 addFile(r''' |
2444 class C<T> {} | 2444 class C<T> {} |
2445 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} | 2445 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} |
2446 class M2<T> {} | 2446 class M2<T> {} |
2447 class I<T> {} | 2447 class I<T> {} |
2448 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C | 2448 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C |
2449 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 | 2449 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 |
2450 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} | 2450 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} |
2451 | 2451 |
2452 C f(D d) { | 2452 C f(D d) { |
2453 D x = new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); | 2453 D x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); |
2454 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2454 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
2455 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); | 2455 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA
MIC_TYPE*/D(); |
2456 return new /*error:IMPLICIT_DYNAMIC_TYPE*/C(); | 2456 return /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/C()
; |
2457 } | 2457 } |
2458 | 2458 |
2459 class A<T extends num> {} | 2459 class A<T extends num> {} |
2460 class N1<T extends List<int>> {} | 2460 class N1<T extends List<int>> {} |
2461 class N2<T extends Object> {} | 2461 class N2<T extends Object> {} |
2462 class J<T extends Object> {} | 2462 class J<T extends Object> {} |
2463 class B<T extends Object> extends A with N1, N2 implements J {} | 2463 class B<T extends Object> extends A with N1, N2 implements J {} |
2464 A g(B b) { | 2464 A g(B b) { |
2465 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B(); | 2465 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B(); |
2466 return /*info:INFERRED_TYPE_ALLOCATION*/new A(); | 2466 return /*info:INFERRED_TYPE_ALLOCATION*/new A(); |
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3407 M<Object> mOfOs; | 3407 M<Object> mOfOs; |
3408 M<A> mOfAs; | 3408 M<A> mOfAs; |
3409 | 3409 |
3410 { | 3410 { |
3411 lOfDs = mOfDs; | 3411 lOfDs = mOfDs; |
3412 lOfDs = mOfOs; | 3412 lOfDs = mOfOs; |
3413 lOfDs = mOfAs; | 3413 lOfDs = mOfAs; |
3414 lOfDs = lOfDs; | 3414 lOfDs = lOfDs; |
3415 lOfDs = lOfOs; | 3415 lOfDs = lOfOs; |
3416 lOfDs = lOfAs; | 3416 lOfDs = lOfAs; |
3417 lOfDs = new L(); // Reset type propagation. | 3417 lOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new L(); // Reset type propagation. |
3418 } | 3418 } |
3419 { | 3419 { |
3420 lOfOs = mOfDs; | 3420 lOfOs = mOfDs; |
3421 lOfOs = mOfOs; | 3421 lOfOs = mOfOs; |
3422 lOfOs = mOfAs; | 3422 lOfOs = mOfAs; |
3423 lOfOs = lOfDs; | 3423 lOfOs = lOfDs; |
3424 lOfOs = lOfOs; | 3424 lOfOs = lOfOs; |
3425 lOfOs = lOfAs; | 3425 lOfOs = lOfAs; |
3426 lOfOs = new L<Object>(); // Reset type propagation. | 3426 lOfOs = new L<Object>(); // Reset type propagation. |
3427 } | 3427 } |
3428 { | 3428 { |
3429 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs; | 3429 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs; |
3430 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs; | 3430 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs; |
3431 lOfAs = mOfAs; | 3431 lOfAs = mOfAs; |
3432 lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs; | 3432 lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs; |
3433 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3433 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3434 lOfAs = lOfAs; | 3434 lOfAs = lOfAs; |
3435 lOfAs = new L<A>(); // Reset type propagation. | 3435 lOfAs = new L<A>(); // Reset type propagation. |
3436 } | 3436 } |
3437 { | 3437 { |
3438 mOfDs = mOfDs; | 3438 mOfDs = mOfDs; |
3439 mOfDs = mOfOs; | 3439 mOfDs = mOfOs; |
3440 mOfDs = mOfAs; | 3440 mOfDs = mOfAs; |
3441 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; | 3441 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; |
3442 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3442 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3443 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs; | 3443 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs; |
3444 mOfDs = new M(); // Reset type propagation. | 3444 mOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new M(); // Reset type propagation. |
3445 } | 3445 } |
3446 { | 3446 { |
3447 mOfOs = mOfDs; | 3447 mOfOs = mOfDs; |
3448 mOfOs = mOfOs; | 3448 mOfOs = mOfOs; |
3449 mOfOs = mOfAs; | 3449 mOfOs = mOfAs; |
3450 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; | 3450 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; |
3451 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; | 3451 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; |
3452 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs; | 3452 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs; |
3453 mOfOs = new M<Object>(); // Reset type propagation. | 3453 mOfOs = new M<Object>(); // Reset type propagation. |
3454 } | 3454 } |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3734 num n = 3; | 3734 num n = 3; |
3735 int i = 3; | 3735 int i = 3; |
3736 String s = "hello"; | 3736 String s = "hello"; |
3737 { | 3737 { |
3738 List<int> l = <int>[i]; | 3738 List<int> l = <int>[i]; |
3739 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s]; | 3739 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s]; |
3740 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n]; | 3740 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n]; |
3741 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS
SIGNABLE*/s]; | 3741 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS
SIGNABLE*/s]; |
3742 } | 3742 } |
3743 { | 3743 { |
3744 List l = /*info:INFERRED_TYPE_LITERAL*/[i]; | 3744 List l = [i]; |
3745 l = /*info:INFERRED_TYPE_LITERAL*/[s]; | 3745 l = [s]; |
3746 l = /*info:INFERRED_TYPE_LITERAL*/[n]; | 3746 l = [n]; |
3747 l = /*info:INFERRED_TYPE_LITERAL*/[i, n, s]; | 3747 l = [i, n, s]; |
3748 } | 3748 } |
3749 { | 3749 { |
3750 Map<String, int> m = <String, int>{s: i}; | 3750 Map<String, int> m = <String, int>{s: i}; |
3751 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; | 3751 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; |
3752 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n}; | 3752 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n}; |
3753 m = <String, int>{s: i, | 3753 m = <String, int>{s: i, |
3754 s: /*info:DOWN_CAST_IMPLICIT*/n, | 3754 s: /*info:DOWN_CAST_IMPLICIT*/n, |
3755 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; | 3755 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; |
3756 } | 3756 } |
3757 // TODO(leafp): We can't currently test for key errors since the | 3757 // TODO(leafp): We can't currently test for key errors since the |
3758 // error marker binds to the entire entry. | 3758 // error marker binds to the entire entry. |
3759 { | 3759 { |
3760 Map m = /*info:INFERRED_TYPE_LITERAL*/{s: i}; | 3760 Map m = {s: i}; |
3761 m = /*info:INFERRED_TYPE_LITERAL*/{s: s}; | 3761 m = {s: s}; |
3762 m = /*info:INFERRED_TYPE_LITERAL*/{s: n}; | 3762 m = {s: n}; |
3763 m = /*info:INFERRED_TYPE_LITERAL*/ | 3763 m = {s: i, |
3764 {s: i, | |
3765 s: n, | 3764 s: n, |
3766 s: s}; | 3765 s: s}; |
3767 m = /*info:INFERRED_TYPE_LITERAL*/ | 3766 m = {i: s, |
3768 {i: s, | |
3769 n: s, | 3767 n: s, |
3770 s: s}; | 3768 s: s}; |
3771 } | 3769 } |
3772 } | 3770 } |
3773 '''); | 3771 '''); |
3774 } | 3772 } |
3775 | 3773 |
3776 void test_typePromotionFromDynamic() { | 3774 void test_typePromotionFromDynamic() { |
3777 checkFile(r''' | 3775 checkFile(r''' |
3778 f() { | 3776 f() { |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4088 // Regression test for https://github.com/dart-lang/sdk/issues/25069 | 4086 // Regression test for https://github.com/dart-lang/sdk/issues/25069 |
4089 checkFile(''' | 4087 checkFile(''' |
4090 typedef int Foo(); | 4088 typedef int Foo(); |
4091 void foo() {} | 4089 void foo() {} |
4092 void main () { | 4090 void main () { |
4093 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); | 4091 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); |
4094 } | 4092 } |
4095 '''); | 4093 '''); |
4096 } | 4094 } |
4097 } | 4095 } |
OLD | NEW |