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

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

Issue 2456803004: fixes #27586, prefer context type in generic inference (Closed)
Patch Set: fix Created 3 years, 9 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 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/test/src/summary/resynthesize_ast_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