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

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, 10 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 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698