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

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: wip Created 3 years, 11 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 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 checkFile(''' 395 checkFile('''
396 abstract class Equality<Q> {} 396 abstract class Equality<Q> {}
397 abstract class EqualityBase<R> implements Equality<R> { 397 abstract class EqualityBase<R> implements Equality<R> {
398 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C(); 398 final C<R> c = /*info:INFERRED_TYPE_ALLOCATION*/const C();
399 const EqualityBase(); 399 const EqualityBase();
400 } 400 }
401 class DefaultEquality<S> extends EqualityBase<S> { 401 class DefaultEquality<S> extends EqualityBase<S> {
402 const DefaultEquality(); 402 const DefaultEquality();
403 } 403 }
404 class SetEquality<T> implements Equality<T> { 404 class SetEquality<T> implements Equality<T> {
405 final Equality<T> field = const DefaultEquality(); 405 final Equality<T> field = /*info:INFERRED_TYPE_ALLOCATION*/const DefaultEquali ty();
406 const SetEquality([Equality<T> inner = const DefaultEquality()]); 406 const SetEquality([Equality<T> inner = /*info:INFERRED_TYPE_ALLOCATION*/const DefaultEquality()]);
407 } 407 }
408 class C<Q> { 408 class C<Q> {
409 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const []; 409 final List<Q> list = /*info:INFERRED_TYPE_LITERAL*/const [];
410 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {}; 410 final Map<Q, Iterable<Q>> m = /*info:INFERRED_TYPE_LITERAL*/const {};
411 const C(); 411 const C();
412 } 412 }
413 main() { 413 main() {
414 const SetEquality<String>(); 414 const SetEquality<String>();
415 } 415 }
416 '''); 416 ''');
(...skipping 1965 matching lines...) Expand 10 before | Expand all | Expand 10 after
2382 addFile(r''' 2382 addFile(r'''
2383 class C<T> {} 2383 class C<T> {}
2384 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {} 2384 class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {}
2385 class M2<T> {} 2385 class M2<T> {}
2386 class I<T> {} 2386 class I<T> {}
2387 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C 2387 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C
2388 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2 2388 with M1, /*error:IMPLICIT_DYNAMIC_TYPE*/M2
2389 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {} 2389 implements /*error:IMPLICIT_DYNAMIC_TYPE*/I {}
2390 2390
2391 C f(D d) { 2391 C f(D d) {
2392 D x = new /*error:IMPLICIT_DYNAMIC_TYPE*/D(); 2392 D x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/D();
2393 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA MIC_TYPE*/D(); 2393 D<int, dynamic> y = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA MIC_TYPE*/D();
2394 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA MIC_TYPE*/D(); 2394 D<dynamic, int> z = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNA MIC_TYPE*/D();
2395 return new /*error:IMPLICIT_DYNAMIC_TYPE*/C(); 2395 return /*info:INFERRED_TYPE_ALLOCATION*/new /*error:IMPLICIT_DYNAMIC_TYPE*/C() ;
2396 } 2396 }
2397 2397
2398 class A<T extends num> {} 2398 class A<T extends num> {}
2399 class N1<T extends List<int>> {} 2399 class N1<T extends List<int>> {}
2400 class N2<T extends Object> {} 2400 class N2<T extends Object> {}
2401 class J<T extends Object> {} 2401 class J<T extends Object> {}
2402 class B<T extends Object> extends A with N1, N2 implements J {} 2402 class B<T extends Object> extends A with N1, N2 implements J {}
2403 A g(B b) { 2403 A g(B b) {
2404 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B(); 2404 B y = /*info:INFERRED_TYPE_ALLOCATION*/new B();
2405 return /*info:INFERRED_TYPE_ALLOCATION*/new A(); 2405 return /*info:INFERRED_TYPE_ALLOCATION*/new A();
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after
3346 M<Object> mOfOs; 3346 M<Object> mOfOs;
3347 M<A> mOfAs; 3347 M<A> mOfAs;
3348 3348
3349 { 3349 {
3350 lOfDs = mOfDs; 3350 lOfDs = mOfDs;
3351 lOfDs = mOfOs; 3351 lOfDs = mOfOs;
3352 lOfDs = mOfAs; 3352 lOfDs = mOfAs;
3353 lOfDs = lOfDs; 3353 lOfDs = lOfDs;
3354 lOfDs = lOfOs; 3354 lOfDs = lOfOs;
3355 lOfDs = lOfAs; 3355 lOfDs = lOfAs;
3356 lOfDs = new L(); // Reset type propagation. 3356 lOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new L(); // Reset type propagation.
3357 } 3357 }
3358 { 3358 {
3359 lOfOs = mOfDs; 3359 lOfOs = mOfDs;
3360 lOfOs = mOfOs; 3360 lOfOs = mOfOs;
3361 lOfOs = mOfAs; 3361 lOfOs = mOfAs;
3362 lOfOs = lOfDs; 3362 lOfOs = lOfDs;
3363 lOfOs = lOfOs; 3363 lOfOs = lOfOs;
3364 lOfOs = lOfAs; 3364 lOfOs = lOfAs;
3365 lOfOs = new L<Object>(); // Reset type propagation. 3365 lOfOs = new L<Object>(); // Reset type propagation.
3366 } 3366 }
3367 { 3367 {
3368 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs; 3368 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfDs;
3369 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs; 3369 lOfAs = /*error:INVALID_ASSIGNMENT*/mOfOs;
3370 lOfAs = mOfAs; 3370 lOfAs = mOfAs;
3371 lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs; 3371 lOfAs = /*warning:DOWN_CAST_COMPOSITE*/lOfDs;
3372 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; 3372 lOfAs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
3373 lOfAs = lOfAs; 3373 lOfAs = lOfAs;
3374 lOfAs = new L<A>(); // Reset type propagation. 3374 lOfAs = new L<A>(); // Reset type propagation.
3375 } 3375 }
3376 { 3376 {
3377 mOfDs = mOfDs; 3377 mOfDs = mOfDs;
3378 mOfDs = mOfOs; 3378 mOfDs = mOfOs;
3379 mOfDs = mOfAs; 3379 mOfDs = mOfAs;
3380 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; 3380 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
3381 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; 3381 mOfDs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
3382 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs; 3382 mOfDs = /*error:INVALID_ASSIGNMENT*/lOfAs;
3383 mOfDs = new M(); // Reset type propagation. 3383 mOfDs = /*info:INFERRED_TYPE_ALLOCATION*/new M(); // Reset type propagation.
3384 } 3384 }
3385 { 3385 {
3386 mOfOs = mOfDs; 3386 mOfOs = mOfDs;
3387 mOfOs = mOfOs; 3387 mOfOs = mOfOs;
3388 mOfOs = mOfAs; 3388 mOfOs = mOfAs;
3389 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs; 3389 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfDs;
3390 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs; 3390 mOfOs = /*info:DOWN_CAST_IMPLICIT*/lOfOs;
3391 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs; 3391 mOfOs = /*error:INVALID_ASSIGNMENT*/lOfAs;
3392 mOfOs = new M<Object>(); // Reset type propagation. 3392 mOfOs = new M<Object>(); // Reset type propagation.
3393 } 3393 }
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
3673 num n = 3; 3673 num n = 3;
3674 int i = 3; 3674 int i = 3;
3675 String s = "hello"; 3675 String s = "hello";
3676 { 3676 {
3677 List<int> l = <int>[i]; 3677 List<int> l = <int>[i];
3678 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s]; 3678 l = <int>[/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/s];
3679 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n]; 3679 l = <int>[/*info:DOWN_CAST_IMPLICIT*/n];
3680 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS SIGNABLE*/s]; 3680 l = <int>[i, /*info:DOWN_CAST_IMPLICIT*/n, /*error:LIST_ELEMENT_TYPE_NOT_AS SIGNABLE*/s];
3681 } 3681 }
3682 { 3682 {
3683 List l = /*info:INFERRED_TYPE_LITERAL*/[i]; 3683 List l = [i];
3684 l = /*info:INFERRED_TYPE_LITERAL*/[s]; 3684 l = [s];
3685 l = /*info:INFERRED_TYPE_LITERAL*/[n]; 3685 l = [n];
3686 l = /*info:INFERRED_TYPE_LITERAL*/[i, n, s]; 3686 l = [i, n, s];
3687 } 3687 }
3688 { 3688 {
3689 Map<String, int> m = <String, int>{s: i}; 3689 Map<String, int> m = <String, int>{s: i};
3690 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; 3690 m = <String, int>{s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
3691 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n}; 3691 m = <String, int>{s: /*info:DOWN_CAST_IMPLICIT*/n};
3692 m = <String, int>{s: i, 3692 m = <String, int>{s: i,
3693 s: /*info:DOWN_CAST_IMPLICIT*/n, 3693 s: /*info:DOWN_CAST_IMPLICIT*/n,
3694 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s}; 3694 s: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/s};
3695 } 3695 }
3696 // TODO(leafp): We can't currently test for key errors since the 3696 // TODO(leafp): We can't currently test for key errors since the
3697 // error marker binds to the entire entry. 3697 // error marker binds to the entire entry.
3698 { 3698 {
3699 Map m = /*info:INFERRED_TYPE_LITERAL*/{s: i}; 3699 Map m = {s: i};
3700 m = /*info:INFERRED_TYPE_LITERAL*/{s: s}; 3700 m = {s: s};
3701 m = /*info:INFERRED_TYPE_LITERAL*/{s: n}; 3701 m = {s: n};
3702 m = /*info:INFERRED_TYPE_LITERAL*/ 3702 m = {s: i,
3703 {s: i,
3704 s: n, 3703 s: n,
3705 s: s}; 3704 s: s};
3706 m = /*info:INFERRED_TYPE_LITERAL*/ 3705 m = {i: s,
3707 {i: s,
3708 n: s, 3706 n: s,
3709 s: s}; 3707 s: s};
3710 } 3708 }
3711 } 3709 }
3712 '''); 3710 ''');
3713 } 3711 }
3714 3712
3715 void test_typePromotionFromDynamic() { 3713 void test_typePromotionFromDynamic() {
3716 checkFile(r''' 3714 checkFile(r'''
3717 f() { 3715 f() {
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
4027 // Regression test for https://github.com/dart-lang/sdk/issues/25069 4025 // Regression test for https://github.com/dart-lang/sdk/issues/25069
4028 checkFile(''' 4026 checkFile('''
4029 typedef int Foo(); 4027 typedef int Foo();
4030 void foo() {} 4028 void foo() {}
4031 void main () { 4029 void main () {
4032 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo(); 4030 Foo x = /*error:INVALID_ASSIGNMENT,info:USE_OF_VOID_RESULT*/foo();
4033 } 4031 }
4034 '''); 4032 ''');
4035 } 4033 }
4036 } 4034 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698