| Index: pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| index 67f38510f4682cc1d1fb315d008cd45f5e71556c..7ff9d9086add023e70661ab0fae3ba964fd445b7 100644
|
| --- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| @@ -106,22 +106,6 @@ main() {
|
| expect(f.type.toString(), '() → Future<num>');
|
| }
|
|
|
| - test_blockBodiedLambdas_async_allReturnsAreFutures_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -import 'dart:async';
|
| -import 'dart:math' show Random;
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() async {
|
| - if (new Random().nextBool()) {
|
| - return new Future<int>.value(1);
|
| - } else {
|
| - return new Future<double>.value(2.0);
|
| - }
|
| -};
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Future<num>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_async_allReturnsAreValues() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -145,22 +129,6 @@ main() {
|
| expect(f.type.toString(), '() → Future<num>');
|
| }
|
|
|
| - test_blockBodiedLambdas_async_allReturnsAreValues_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -import 'dart:async';
|
| -import 'dart:math' show Random;
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() async {
|
| - if (new Random().nextBool()) {
|
| - return 1;
|
| - } else {
|
| - return 2.0;
|
| - }
|
| -};
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Future<num>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_async_mixOfValuesAndFutures() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -184,22 +152,6 @@ main() {
|
| expect(f.type.toString(), '() → Future<num>');
|
| }
|
|
|
| - test_blockBodiedLambdas_async_mixOfValuesAndFutures_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -import 'dart:async';
|
| -import 'dart:math' show Random;
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() async {
|
| - if (new Random().nextBool()) {
|
| - return new Future<int>.value(1);
|
| - } else {
|
| - return 2.0;
|
| - }
|
| -};
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Future<num>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_asyncStar() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -220,19 +172,6 @@ main() {
|
| expect(f.type.toString(), '() → Stream<num>');
|
| }
|
|
|
| - test_blockBodiedLambdas_asyncStar_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| - import 'dart:async';
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() async* {
|
| - yield 1;
|
| - Stream<double> s;
|
| - yield* s;
|
| -};
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Stream<num>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_basic() async {
|
| await checkFileElement(r'''
|
| test1() {
|
| @@ -243,14 +182,6 @@ test1() {
|
| ''');
|
| }
|
|
|
| - test_blockBodiedLambdas_basic_topLevel() async {
|
| - await checkFileElement(r'''
|
| -List<int> o;
|
| -var y = o.map(/*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/(x) { return x + 1; });
|
| -Iterable<int> z = y;
|
| -''');
|
| - }
|
| -
|
| test_blockBodiedLambdas_downwardsIncompatibleWithUpwardsInference() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -292,15 +223,6 @@ main() async {
|
| expect(f.type.toString(), '() → Future<Null>');
|
| }
|
|
|
| - test_blockBodiedLambdas_inferBottom_async_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -import 'dart:async';
|
| -var f = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE,info:INFERRED_TYPE_CLOSURE*/() async { return null; };
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Future<Null>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_inferBottom_asyncStar() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -318,15 +240,6 @@ main() async {
|
| expect(f.type.toString(), '() → Stream<Null>');
|
| }
|
|
|
| - test_blockBodiedLambdas_inferBottom_asyncStar_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -import 'dart:async';
|
| -var f = /*info:INFERRED_TYPE_CLOSURE, warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() async* { yield null; };
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Stream<Null>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_inferBottom_sync() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -352,14 +265,6 @@ main() {
|
| expect(f.type.toString(), '(Object) → Null');
|
| }
|
|
|
| - test_blockBodiedLambdas_inferBottom_sync_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/(Object x) { return null; };
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '(Object) → Null');
|
| - }
|
| -
|
| test_blockBodiedLambdas_inferBottom_syncStar() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -376,14 +281,6 @@ main() {
|
| expect(f.type.toString(), '() → Iterable<Null>');
|
| }
|
|
|
| - test_blockBodiedLambdas_inferBottom_syncStar_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() sync* { yield null; };
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Iterable<Null>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_LUB() async {
|
| await checkFileElement(r'''
|
| import 'dart:math' show Random;
|
| @@ -402,22 +299,6 @@ test2() {
|
| ''');
|
| }
|
|
|
| - test_blockBodiedLambdas_LUB_topLevel() async {
|
| - await checkFileElement(r'''
|
| -import 'dart:math' show Random;
|
| -List<num> o;
|
| -var y = o.map(/*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/(x) {
|
| - if (new Random().nextBool()) {
|
| - return x.toInt() + 1;
|
| - } else {
|
| - return x.toDouble();
|
| - }
|
| -});
|
| -Iterable<num> w = y;
|
| -Iterable<int> z = /*info:ASSIGNMENT_CAST*/y;
|
| -''');
|
| - }
|
| -
|
| test_blockBodiedLambdas_nestedLambdas() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -434,17 +315,6 @@ main() {
|
| expect(f.type.toString(), '() → (int) → double');
|
| }
|
|
|
| - test_blockBodiedLambdas_nestedLambdas_topLevel() async {
|
| - // Original feature request: https://github.com/dart-lang/sdk/issues/25487
|
| - var mainUnit = await checkFileElement(r'''
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return /*info:INFERRED_TYPE_CLOSURE*/(int x) { return 2.0 * x; };
|
| -};
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → (int) → double');
|
| - }
|
| -
|
| test_blockBodiedLambdas_noReturn() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -460,15 +330,6 @@ test1() {
|
| expect(f.type.toString(), 'Iterable<Null>');
|
| }
|
|
|
| - test_blockBodiedLambdas_noReturn_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -final List<int> o = <int>[];
|
| -var y = o.map(/*info:INFERRED_TYPE_CLOSURE, warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/(x) { });
|
| -''');
|
| - var f = mainUnit.topLevelVariables[1];
|
| - expect(f.type.toString(), 'Iterable<Null>');
|
| - }
|
| -
|
| test_blockBodiedLambdas_syncStar() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| @@ -487,17 +348,6 @@ main() {
|
| expect(f.type.toString(), '() → Iterable<num>');
|
| }
|
|
|
| - test_blockBodiedLambdas_syncStar_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| -var f = /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() sync* {
|
| - yield 1;
|
| - yield* /*info:INFERRED_TYPE_LITERAL*/[3, 4.0];
|
| -};
|
| -''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → Iterable<num>');
|
| - }
|
| -
|
| test_bottom() async {
|
| // When a type is inferred from the expression `null`, the inferred type is
|
| // `dynamic`, but the inferred type of the initializer is `bottom`.
|
| @@ -521,10 +371,11 @@ var v = () => null;
|
| expect(v.initializer.type.toString(), '() → () → dynamic');
|
| }
|
|
|
| + @failingTest
|
| test_circularReference_viaClosures() async {
|
| var mainUnit = await checkFileElement('''
|
| -var x = () => y;
|
| -var y = () => x;
|
| +var x = () => /*error:TOP_LEVEL_CYCLE*/y;
|
| +var y = () => /*error:TOP_LEVEL_CYCLE*/x;
|
| ''');
|
| var x = mainUnit.topLevelVariables[0];
|
| var y = mainUnit.topLevelVariables[1];
|
| @@ -534,10 +385,11 @@ var y = () => x;
|
| expect(y.type.toString(), 'dynamic');
|
| }
|
|
|
| + @failingTest
|
| test_circularReference_viaClosures_initializerTypes() async {
|
| var mainUnit = await checkFileElement('''
|
| -var x = () => y;
|
| -var y = () => x;
|
| +var x = () => /*error:TOP_LEVEL_CYCLE*/y;
|
| +var y = () => /*error:TOP_LEVEL_CYCLE*/x;
|
| ''');
|
| var x = mainUnit.topLevelVariables[0];
|
| var y = mainUnit.topLevelVariables[1];
|
| @@ -616,12 +468,12 @@ class Foo<T extends A> {}
|
| void main() {
|
| Foo<B> foo = /*info:INFERRED_TYPE_ALLOCATION*/new Foo();
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_constructors_inferenceFBounded() async {
|
| var errors = 'error:COULD_NOT_INFER,error:COULD_NOT_INFER';
|
| - if (hasExtraTaskModelPass) errors = '$errors,$errors';
|
| +// if (hasExtraTaskModelPass) errors = '$errors,$errors';
|
| var unit = await checkFileElement('''
|
| class Clonable<T> {}
|
|
|
| @@ -632,9 +484,12 @@ class Pair<T extends Clonable<T>, U extends Clonable<U>> {
|
| Pair._();
|
| Pair<U, T> get reversed => /*info:INFERRED_TYPE_ALLOCATION*/new Pair(u, t);
|
| }
|
| -final x = /*info:INFERRED_TYPE_ALLOCATION*/new /*$errors*/Pair._();
|
| - ''');
|
| - var x = unit.topLevelVariables[0];
|
| +
|
| +main() {
|
| + final x = new /*$errors*/Pair._();
|
| +}
|
| +''');
|
| + var x = unit.functions[0].localVariables[0];
|
| expect(x.type.toString(), 'Pair<Clonable<dynamic>, Clonable<dynamic>>');
|
| }
|
|
|
| @@ -645,24 +500,23 @@ class C<T> {
|
| C(this.t);
|
| }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(42);
|
| -
|
| -num y;
|
| -C<int> c_int = /*info:INFERRED_TYPE_ALLOCATION*/new C(/*info:DOWN_CAST_IMPLICIT*/y);
|
| +main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(42);
|
|
|
| -// These hints are not reported because we resolve with a null error listener.
|
| -C<num> c_num = /*info:INFERRED_TYPE_ALLOCATION*/new C(123);
|
| -C<num> c_num2 = (/*info:INFERRED_TYPE_ALLOCATION*/new C(456))
|
| - ..t = 1.0;
|
| + num y;
|
| + C<int> c_int = /*info:INFERRED_TYPE_ALLOCATION*/new C(/*info:DOWN_CAST_IMPLICIT*/y);
|
|
|
| -// Down't infer from explicit dynamic.
|
| -var c_dynamic = new C<dynamic>(42);
|
| + // These hints are not reported because we resolve with a null error listener.
|
| + C<num> c_num = /*info:INFERRED_TYPE_ALLOCATION*/new C(123);
|
| + C<num> c_num2 = (/*info:INFERRED_TYPE_ALLOCATION*/new C(456))
|
| + ..t = 1.0;
|
|
|
| -main() {
|
| + // Down't infer from explicit dynamic.
|
| + var c_dynamic = new C<dynamic>(42);
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - var vars = unit.topLevelVariables;
|
| + var vars = unit.functions[0].localVariables;
|
| expect(vars[0].type.toString(), 'C<int>');
|
| expect(vars.firstWhere((e) => e.name == 'c_int').type.toString(), 'C<int>');
|
| expect(vars.firstWhere((e) => e.name == 'c_num').type.toString(), 'C<num>');
|
| @@ -671,12 +525,6 @@ main() {
|
| }
|
|
|
| test_constructors_inferFromArguments_argumentNotAssignable() async {
|
| - var infos = 'info:INFERRED_TYPE_ALLOCATION';
|
| - var errors = '';
|
| - if (hasExtraTaskModelPass) {
|
| - infos = '$infos,$infos';
|
| - errors = '/*error:COULD_NOT_INFER*/';
|
| - }
|
| var unit = await checkFileElement('''
|
| class A {}
|
|
|
| @@ -689,10 +537,12 @@ class C<T extends A> {
|
| class NotA {}
|
| NotA myF() => null;
|
|
|
| -var V = /*$infos*/new ${errors}C(/*error:INVALID_CAST_FUNCTION*/myF);
|
| +main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:COULD_NOT_INFER*/C(myF);
|
| +}
|
| ''');
|
| - var vars = unit.topLevelVariables;
|
| - expect(vars[0].type.toString(), 'C<NotA>');
|
| + var x = unit.functions[1].localVariables[0];
|
| + expect(x.type.toString(), 'C<NotA>');
|
| }
|
|
|
| test_constructors_inferFromArguments_const() async {
|
| @@ -702,9 +552,12 @@ class C<T> {
|
| const C(this.t);
|
| }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/const C(42);
|
| +main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/const C(42);
|
| +}
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| + var x = unit.functions[0].localVariables[0];
|
| + expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_constWithUpperBound() async {
|
| @@ -722,20 +575,22 @@ void f() {
|
| C<int> c2 = c;
|
| const D<int> d = /*info:INFERRED_TYPE_ALLOCATION*/const D();
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_constructors_inferFromArguments_downwardsFromConstructor() {
|
| return checkFileElement(r'''
|
| class C<T> { C(List<T> list); }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(/*info:INFERRED_TYPE_LITERAL*/[123]);
|
| -C<int> y = x;
|
| +main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(/*info:INFERRED_TYPE_LITERAL*/[123]);
|
| + C<int> y = x;
|
|
|
| -var a = new C<dynamic>([123]);
|
| -// This one however works.
|
| -var b = new C<Object>(/*info:INFERRED_TYPE_LITERAL*/[123]);
|
| - ''');
|
| + var a = new C<dynamic>([123]);
|
| + // This one however works.
|
| + var b = new C<Object>(/*info:INFERRED_TYPE_LITERAL*/[123]);
|
| +}
|
| +''');
|
| }
|
|
|
| test_constructors_inferFromArguments_factory() async {
|
| @@ -752,13 +607,14 @@ class C<T> {
|
| }
|
| }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(42);
|
|
|
| main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(42);
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| + var x = unit.functions[0].localVariables[0];
|
| + expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_factory_callsConstructor() async {
|
| @@ -769,7 +625,7 @@ class A<T> {
|
| factory A.factory() => /*info:INFERRED_TYPE_ALLOCATION*/new A();
|
| A<T> m() => /*info:INFERRED_TYPE_ALLOCATION*/new A();
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_constructors_inferFromArguments_named() async {
|
| @@ -779,13 +635,14 @@ class C<T> {
|
| C.named(List<T> t);
|
| }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(<int>[]);
|
|
|
| main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(<int>[]);
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| + var x = unit.functions[0].localVariables[0];
|
| + expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_namedFactory() async {
|
| @@ -801,13 +658,14 @@ class C<T> {
|
| }
|
| }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(42);
|
|
|
| main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(42);
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| + var x = unit.functions[0].localVariables[0];
|
| + expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_redirecting() async {
|
| @@ -818,13 +676,14 @@ class C<T> {
|
| C.named(List<T> t) : this(t[0]);
|
| }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(<int>[42]);
|
|
|
| main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(<int>[42]);
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| + var x = unit.functions[0].localVariables[0];
|
| + expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_redirectingFactory() async {
|
| @@ -841,13 +700,13 @@ class CImpl<T> implements C<T> {
|
| CImpl(this.t);
|
| }
|
|
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(42);
|
| -
|
| main() {
|
| + var x = /*info:INFERRED_TYPE_ALLOCATION*/new C(42);
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<int>');
|
| + var x = unit.functions[0].localVariables[0];
|
| + expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_reverseTypeParameters() async {
|
| @@ -859,15 +718,17 @@ class Pair<T, U> {
|
| Pair(this.t, this.u);
|
| Pair<U, T> get reversed => /*info:INFERRED_TYPE_ALLOCATION*/new Pair(u, t);
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_constructors_tooManyPositionalArguments() async {
|
| var unit = await checkFileElement(r'''
|
| class A<T> {}
|
| -var a = /*info:INFERRED_TYPE_ALLOCATION*/new A/*error:EXTRA_POSITIONAL_ARGUMENTS*/(42);
|
| - ''');
|
| - var vars = unit.topLevelVariables;
|
| +main() {
|
| + var a = new A/*error:EXTRA_POSITIONAL_ARGUMENTS*/(42);
|
| +}
|
| +''');
|
| + var vars = unit.functions[0].localVariables;
|
| expect(vars[0].type.toString(), 'A<dynamic>');
|
| }
|
|
|
| @@ -1478,7 +1339,7 @@ void main() {
|
| /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
|
| }
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_downwardsInferenceOnListLiterals_inferDownwards() async {
|
| @@ -1578,7 +1439,7 @@ main() {
|
| g.assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]);
|
| g.assertDOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]);
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_downwardsInferenceOnMapLiterals() async {
|
| @@ -1683,7 +1544,7 @@ Iterable<Map<int, int>> bar() sync* {
|
| yield* /*error:YIELD_OF_INVALID_TYPE*/{};
|
| yield* /*info:INFERRED_TYPE_ALLOCATION*/new List();
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_fieldRefersToStaticGetter() async {
|
| @@ -1718,7 +1579,7 @@ main() {
|
| var a = f.then(add);
|
| var b = f.then(add2);
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_futureThen() async {
|
| @@ -1884,7 +1745,7 @@ main() {
|
| .whenComplete(/*info:INFERRED_TYPE_CLOSURE*/() {});
|
| b = f.then(/*info:INFERRED_TYPE_CLOSURE*/(x) => /*info:INFERRED_TYPE_LITERAL*/[]);
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_futureThen_explicitFuture() async {
|
| @@ -1902,7 +1763,7 @@ m2() {
|
| var x = f.then<List<int>>(/*info:INFERRED_TYPE_CLOSURE*/(x) => /*info:INFERRED_TYPE_LITERAL*/[]);
|
| Future<List<int>> y = x;
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_futureThen_upwards() async {
|
| @@ -1978,7 +1839,7 @@ main() {
|
| Future<bool> b = f;
|
| b = g;
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_futureUnion_asyncConditional() async {
|
| @@ -2116,7 +1977,7 @@ foo() async {
|
| }
|
|
|
| class A {}
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_futureUnion_downwardsGenericMethodWithGenericReturn() async {
|
| @@ -2130,7 +1991,7 @@ main() async {
|
| Future<String> f;
|
| String s = await id(f);
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_futureUnion_downwardsGenericMethodWithGenericReturn_comment() async {
|
| @@ -2144,7 +2005,7 @@ main() async {
|
| Future<String> f;
|
| String s = await id(f);
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_futureUnion_upwardsGenericMethods() async {
|
| @@ -2165,7 +2026,7 @@ main() async {
|
| class A {}
|
| class B extends A {}
|
| class C extends A {}
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_genericFunctions_returnTypedef() async {
|
| @@ -2179,7 +2040,7 @@ main() {
|
| ToValue<int> takesInt = x;
|
| takesInt = y;
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_genericFunctions_returnTypedef_comment() async {
|
| @@ -2193,7 +2054,7 @@ main() {
|
| ToValue<int> takesInt = x;
|
| takesInt = y;
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_genericMethods_basicDownwardInference() async {
|
| @@ -2360,7 +2221,7 @@ main() {
|
| int y = /*info:DYNAMIC_CAST*/(/*info:UNNECESSARY_CAST*/new D() as C).m(42);
|
| print(y);
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_genericMethods_inferenceError() async {
|
| @@ -2369,7 +2230,7 @@ main() {
|
| List<String> y;
|
| Iterable<String> x = y.map(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/(String z) => 1.0);
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_genericMethods_inferGenericFunctionParameterType() async {
|
| @@ -2563,7 +2424,7 @@ main() {
|
| int y = new D().m<int>(42);
|
| print(y);
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_genericMethods_inferGenericMethodType_comment() async {
|
| @@ -2579,7 +2440,7 @@ main() {
|
| int y = new D().m/*<int>*/(42);
|
| print(y);
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_genericMethods_inferJSBuiltin() async {
|
| @@ -2633,7 +2494,7 @@ main() {
|
| .fold(0, math.max);
|
| }).fold(0, math.max);
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_genericMethods_usesGreatestLowerBound() async {
|
| @@ -2643,9 +2504,11 @@ typedef List<int> G(double x);
|
|
|
| T generic<T>(a(T _), b(T _)) => null;
|
|
|
| -var v = generic((F f) => null, (G g) => null);
|
| +main() {
|
| + var v = generic((F f) => null, (G g) => null);
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[1].localVariables[0];
|
| expect(v.type.toString(), '(num) → List<int>');
|
| }
|
|
|
| @@ -2656,16 +2519,31 @@ typedef List<int> G(double x);
|
|
|
| /*=T*/ generic/*<T>*/(a(/*=T*/ _), b(/*=T*/ _)) => null;
|
|
|
| -var v = generic((F f) => null, (G g) => null);
|
| +main() {
|
| + var v = generic((F f) => null, (G g) => null);
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[1].localVariables[0];
|
| expect(v.type.toString(), '(num) → List<int>');
|
| }
|
|
|
| + test_genericMethods_usesGreatestLowerBound_comment_topLevel() async {
|
| + var mainUnit = await checkFileElement(r'''
|
| +typedef Iterable<num> F(int x);
|
| +typedef List<int> G(double x);
|
| +
|
| +/*=T*/ generic/*<T>*/(a(/*=T*/ _), b(/*=T*/ _)) => null;
|
| +
|
| +var v = /*error:TOP_LEVEL_TYPE_ARGUMENTS*/generic((F f) => null, (G g) => null);
|
| +''');
|
| + var v = mainUnit.topLevelVariables[0];
|
| + expect(v.type.toString(), 'dynamic');
|
| + }
|
| +
|
| test_infer_assignToIndex() async {
|
| await checkFileElement(r'''
|
| List<double> a = <double>[];
|
| -var b = (a[0] = 1.0);
|
| +var b = (/*error:TOP_LEVEL_UNSUPPORTED*/a[0] = 1.0);
|
| ''');
|
| }
|
|
|
| @@ -2674,14 +2552,14 @@ var b = (a[0] = 1.0);
|
| class A {
|
| int f;
|
| }
|
| -var v_assign = (new A().f = 1);
|
| -var v_plus = (new A().f += 1);
|
| -var v_minus = (new A().f -= 1);
|
| -var v_multiply = (new A().f *= 1);
|
| -var v_prefix_pp = (++new A().f);
|
| -var v_prefix_mm = (--new A().f);
|
| -var v_postfix_pp = (new A().f++);
|
| -var v_postfix_mm = (new A().f--);
|
| +var v_assign = (/*error:TOP_LEVEL_UNSUPPORTED*/new A().f = 1);
|
| +var v_plus = (/*error:TOP_LEVEL_UNSUPPORTED*/new A().f += 1);
|
| +var v_minus = (/*error:TOP_LEVEL_UNSUPPORTED*/new A().f -= 1);
|
| +var v_multiply = (/*error:TOP_LEVEL_UNSUPPORTED*/new A().f *= 1);
|
| +var v_prefix_pp = (++new A()./*error:TOP_LEVEL_INSTANCE_GETTER*/f);
|
| +var v_prefix_mm = (--new A()./*error:TOP_LEVEL_INSTANCE_GETTER*/f);
|
| +var v_postfix_pp = (new A()./*error:TOP_LEVEL_INSTANCE_GETTER*/f++);
|
| +var v_postfix_mm = (new A()./*error:TOP_LEVEL_INSTANCE_GETTER*/f--);
|
| ''');
|
| }
|
|
|
| @@ -2694,10 +2572,10 @@ class A {
|
| class B {
|
| A a;
|
| }
|
| -var v_prefix_pp = (++new B().a);
|
| -var v_prefix_mm = (--new B().a);
|
| -var v_postfix_pp = (new B().a++);
|
| -var v_postfix_mm = (new B().a--);
|
| +var v_prefix_pp = (++new B()./*error:TOP_LEVEL_INSTANCE_GETTER*/a);
|
| +var v_prefix_mm = (--new B()./*error:TOP_LEVEL_INSTANCE_GETTER*/a);
|
| +var v_postfix_pp = (new B()./*error:TOP_LEVEL_INSTANCE_GETTER*/a++);
|
| +var v_postfix_mm = (new B()./*error:TOP_LEVEL_INSTANCE_GETTER*/a--);
|
| ''');
|
| }
|
|
|
| @@ -2707,9 +2585,9 @@ class A {
|
| int f;
|
| }
|
| A a = new A();
|
| -var b = (a.f = 1);
|
| +var b = (/*error:TOP_LEVEL_UNSUPPORTED*/a.f = 1);
|
| var c = 0;
|
| -var d = (c = 1);
|
| +var d = (/*error:TOP_LEVEL_UNSUPPORTED*/c = 1);
|
| ''');
|
| }
|
|
|
| @@ -3141,9 +3019,12 @@ test1() {
|
| class C {
|
| T m<T>(int a, {String b, T c}) => null;
|
| }
|
| -var y = new C().m(1, b: 'bbb', c: 2.0);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'double');
|
| +main() {
|
| + var y = new C().m(1, b: 'bbb', c: 2.0);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_named_comment() async {
|
| @@ -3151,9 +3032,12 @@ var y = new C().m(1, b: 'bbb', c: 2.0);
|
| class C {
|
| /*=T*/ m/*<T>*/(int a, {String b, /*=T*/ c}) => null;
|
| }
|
| -var y = new C().m(1, b: 'bbb', c: 2.0);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'double');
|
| +main() {
|
| + var y = new C().m(1, b: 'bbb', c: 2.0);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional() async {
|
| @@ -3161,9 +3045,12 @@ var y = new C().m(1, b: 'bbb', c: 2.0);
|
| class C {
|
| T m<T>(int a, [T b]) => null;
|
| }
|
| -var y = new C().m(1, 2.0);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'double');
|
| +main() {
|
| + var y = new C().m(1, 2.0);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional2() async {
|
| @@ -3171,9 +3058,12 @@ var y = new C().m(1, 2.0);
|
| class C {
|
| T m<T>(int a, [String b, T c]) => null;
|
| }
|
| -var y = new C().m(1, 'bbb', 2.0);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'double');
|
| +main() {
|
| + var y = new C().m(1, 'bbb', 2.0);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional2_comment() async {
|
| @@ -3181,9 +3071,12 @@ var y = new C().m(1, 'bbb', 2.0);
|
| class C {
|
| /*=T*/ m/*<T>*/(int a, [String b, /*=T*/ c]) => null;
|
| }
|
| -var y = new C().m(1, 'bbb', 2.0);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'double');
|
| +main() {
|
| + var y = new C().m(1, 'bbb', 2.0);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional_comment() async {
|
| @@ -3191,9 +3084,12 @@ var y = new C().m(1, 'bbb', 2.0);
|
| class C {
|
| /*=T*/ m/*<T>*/(int a, [/*=T*/ b]) => null;
|
| }
|
| -var y = new C().m(1, 2.0);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'double');
|
| +main() {
|
| + var y = new C().m(1, 2.0);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_required() async {
|
| @@ -3201,9 +3097,12 @@ var y = new C().m(1, 2.0);
|
| class C {
|
| T m<T>(T x) => x;
|
| }
|
| -var y = new C().m(42);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'int');
|
| +main() {
|
| + var y = new C().m(42);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'int');
|
| }
|
|
|
| test_inferGenericMethodType_required_comment() async {
|
| @@ -3211,9 +3110,12 @@ var y = new C().m(42);
|
| class C {
|
| /*=T*/ m/*<T>*/(/*=T*/ x) => x;
|
| }
|
| -var y = new C().m(42);
|
| - ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'int');
|
| +main() {
|
| + var y = new C().m(42);
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[0];
|
| + expect(y.type.toString(), 'int');
|
| }
|
|
|
| test_inferListLiteralNestedInMapLiteral() async {
|
| @@ -3243,7 +3145,7 @@ main() {
|
| /*info:INFERRED_TYPE_LITERAL*/[/*info:DOWN_CAST_IMPLICIT*/getResource('/pkgA/lib/')]
|
| );
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_inferLocalFunctionReturnType() async {
|
| @@ -3349,23 +3251,13 @@ class Foo {
|
| }''');
|
| }
|
|
|
| - test_inferredType_blockBodiedClosure_noArguments() async {
|
| - var mainUnit = await checkFileElement('''
|
| -class C {
|
| - static final v = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE,
|
| - info:INFERRED_TYPE_CLOSURE*/() {};
|
| -}
|
| -''');
|
| - var v = mainUnit.getType('C').fields[0];
|
| - expect(v.type.toString(), '() → Null');
|
| - }
|
| -
|
| test_inferredType_blockClosure_noArgs_noReturn() async {
|
| var mainUnit = await checkFileElement('''
|
| -var f = /*warning:UNSAFE_BLOCK_CLOSURE_INFERENCE,
|
| - info:INFERRED_TYPE_CLOSURE*/() {};
|
| +main() {
|
| + var f = /*info:INFERRED_TYPE_CLOSURE*/() {};
|
| +}
|
| ''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| + var f = mainUnit.functions[0].localVariables[0];
|
| expect(f.type.toString(), '() → Null');
|
| }
|
|
|
| @@ -3414,10 +3306,12 @@ var x = c*c;
|
| class C {
|
| bool operator[](int index) => true;
|
| }
|
| -C c;
|
| -var x = c[0];
|
| +main() {
|
| + C c;
|
| + var x = c[0];
|
| +}
|
| ''');
|
| - var x = mainUnit.topLevelVariables[1];
|
| + var x = mainUnit.functions[0].localVariables[1];
|
| expect(x.name, 'x');
|
| expect(x.type.toString(), 'bool');
|
| }
|
| @@ -3428,10 +3322,12 @@ class I {
|
| bool operator[](int index) => true;
|
| }
|
| abstract class C implements I {}
|
| -C c;
|
| -var x = c[0];
|
| +main() {
|
| + C c;
|
| + var x = c[0];
|
| +}
|
| ''');
|
| - var x = mainUnit.topLevelVariables[1];
|
| + var x = mainUnit.functions[0].localVariables[1];
|
| expect(x.name, 'x');
|
| expect(x.type.toString(), 'bool');
|
| }
|
| @@ -3606,7 +3502,7 @@ List<String> strings() {
|
| });
|
| return stuff.toList();
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_inferStaticsTransitively() async {
|
| @@ -4021,7 +3917,7 @@ test() {
|
| var mainUnit = await checkFileElement('''
|
| void f() {}
|
| var x = /*info:USE_OF_VOID_RESULT*/f();
|
| - ''');
|
| + ''');
|
| var x = mainUnit.topLevelVariables[0];
|
| expect(x.name, 'x');
|
| expect(x.type.toString(), 'void');
|
| @@ -4073,9 +3969,12 @@ A v = null;
|
| test_instantiateToBounds_invokeConstructor_noBound() async {
|
| var unit = await checkFileElement('''
|
| class C<T> {}
|
| -var x = /*info:INFERRED_TYPE_ALLOCATION*/new C();
|
| +main() {
|
| + var v = new C();
|
| +}
|
| ''');
|
| - expect(unit.topLevelVariables[0].type.toString(), 'C<dynamic>');
|
| + var v = unit.functions[0].localVariables[0];
|
| + expect(v.type.toString(), 'C<dynamic>');
|
| }
|
|
|
| test_instantiateToBounds_invokeConstructor_typeArgsExact() async {
|
| @@ -4113,7 +4012,7 @@ void bar() {
|
| }
|
| /*info:DYNAMIC_INVOKE*/list.map((value) => '$value');
|
| }
|
| - ''');
|
| + ''');
|
| }
|
|
|
| test_listLiterals() async {
|
| @@ -4131,7 +4030,7 @@ test2() {
|
| x.add(4.0);
|
| List<int> y = /*info:ASSIGNMENT_CAST*/x;
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_listLiterals_topLevel() async {
|
| @@ -4149,7 +4048,7 @@ test2() {
|
| x2.add(4.0);
|
| List<int> y = /*info:ASSIGNMENT_CAST*/x2;
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_listLiteralsCanInferNull_topLevel() async {
|
| @@ -4195,7 +4094,7 @@ test2() {
|
| x[2] = p;
|
| Map<int, String> y = /*info:ASSIGNMENT_CAST*/x;
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_mapLiterals_topLevel() async {
|
| @@ -4219,7 +4118,7 @@ test2() {
|
| x2[2] = p;
|
| Map<int, String> y = /*info:ASSIGNMENT_CAST*/x2;
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_mapLiteralsCanInferNull() async {
|
| @@ -4352,18 +4251,21 @@ test1() {
|
| test_nullCoalescingOperator() async {
|
| // Regression test for https://github.com/dart-lang/sdk/issues/26552
|
| await checkFileElement(r'''
|
| -List<int> x;
|
| -var y = x ?? /*info:INFERRED_TYPE_LITERAL*/[];
|
| -List<int> z = y;
|
| - ''');
|
| +main() {
|
| + List<int> x;
|
| + var y = x ?? /*info:INFERRED_TYPE_LITERAL*/[];
|
| + List<int> z = y;
|
| +}
|
| +''');
|
| // Don't do anything if we already have a context type.
|
| var unit = await checkFileElement(r'''
|
| -List<int> x;
|
| -List<num> y = x ?? /*info:INFERRED_TYPE_LITERAL*/[];
|
| - ''');
|
| -
|
| - expect(unit.topLevelVariables[1].initializer.returnType.toString(),
|
| - 'List<num>');
|
| +main() {
|
| + List<int> x;
|
| + List<num> y = x ?? /*info:INFERRED_TYPE_LITERAL*/[];
|
| +}
|
| +''');
|
| + var y = unit.functions[0].localVariables[1];
|
| + expect(y.initializer.returnType.toString(), 'List<num>');
|
| }
|
|
|
| test_nullLiteralShouldNotInferAsBottom() async {
|
| @@ -4486,7 +4388,7 @@ class C<T extends num> {
|
| double r4 = a / b;
|
| }
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_refineBinaryExpressionType_typeParameter_T_int() async {
|
| @@ -4506,7 +4408,7 @@ class C<T extends num> {
|
| a *= b;
|
| }
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_refineBinaryExpressionType_typeParameter_T_T() async {
|
| @@ -4526,7 +4428,7 @@ class C<T extends num> {
|
| a *= b;
|
| }
|
| }
|
| - ''');
|
| +''');
|
| }
|
|
|
| test_staticMethod_tearoff() async {
|
| @@ -4579,9 +4481,11 @@ class C {
|
| test_unsafeBlockClosureInference_closureCall() async {
|
| // Regression test for https://github.com/dart-lang/sdk/issues/26962
|
| var mainUnit = await checkFileElement('''
|
| -var v = ((x) => 1.0)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +main() {
|
| + var v = ((x) => 1.0)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'double');
|
| }
|
| @@ -4615,12 +4519,14 @@ var v = new C<int>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| class C<T> {
|
| C(T x());
|
| }
|
| -var v = /*info:INFERRED_TYPE_ALLOCATION*/new C(
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - });
|
| +main() {
|
| + var v = /*info:INFERRED_TYPE_ALLOCATION*/new C(
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'C<int>');
|
| }
|
| @@ -4771,81 +4677,95 @@ var v = (f)/*<int>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam() async {
|
| var mainUnit = await checkFileElement('''
|
| +main() {
|
| + var v = f(
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + });
|
| +}
|
| List<T> f<T>(T g()) => <T>[g()];
|
| -var v = f(
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - });
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam_comment() async {
|
| var mainUnit = await checkFileElement('''
|
| +main() {
|
| + var v = f(
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + });
|
| +}
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| -var v = f(
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - });
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr() async {
|
| var mainUnit = await checkFileElement('''
|
| +main() {
|
| + var v = (f)(
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + });
|
| +}
|
| List<T> f<T>(T g()) => <T>[g()];
|
| -var v = (f)(
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - });
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr_comment() async {
|
| var mainUnit = await checkFileElement('''
|
| +main() {
|
| + var v = (f)(
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + });
|
| +}
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| -var v = (f)(
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - });
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_noTypeParam() async {
|
| var mainUnit = await checkFileElement('''
|
| +main() {
|
| + var v = f(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +}
|
| double f(x) => 1.0;
|
| -var v = f(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'double');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_noTypeParam_viaExpr() async {
|
| var mainUnit = await checkFileElement('''
|
| +main() {
|
| + var v = (f)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +}
|
| double f(x) => 1.0;
|
| -var v = (f)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'double');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inList_dynamic() async {
|
| var mainUnit = await checkFileElement('''
|
| -var v = <dynamic>[/*info:INFERRED_TYPE_CLOSURE*/() { return 1; }];
|
| +main() {
|
| + var v = <dynamic>[/*info:INFERRED_TYPE_CLOSURE*/() { return 1; }];
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<dynamic>');
|
| }
|
| @@ -4853,30 +4773,36 @@ var v = <dynamic>[/*info:INFERRED_TYPE_CLOSURE*/() { return 1; }];
|
| test_unsafeBlockClosureInference_inList_typed() async {
|
| var mainUnit = await checkFileElement('''
|
| typedef int F();
|
| -var v = <F>[/*info:INFERRED_TYPE_CLOSURE*/() { return 1; }];
|
| +main() {
|
| + var v = <F>[/*info:INFERRED_TYPE_CLOSURE*/() { return 1; }];
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<() → int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inList_untyped() async {
|
| var mainUnit = await checkFileElement('''
|
| -var v = /*info:INFERRED_TYPE_LITERAL*/[
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - }];
|
| +main() {
|
| + var v = /*info:INFERRED_TYPE_LITERAL*/[
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + }];
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<() → int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inMap_dynamic() async {
|
| var mainUnit = await checkFileElement('''
|
| -var v = <int, dynamic>{1: /*info:INFERRED_TYPE_CLOSURE*/() { return 1; }};
|
| +main() {
|
| + var v = <int, dynamic>{1: /*info:INFERRED_TYPE_CLOSURE*/() { return 1; }};
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'Map<int, dynamic>');
|
| }
|
| @@ -4884,21 +4810,25 @@ var v = <int, dynamic>{1: /*info:INFERRED_TYPE_CLOSURE*/() { return 1; }};
|
| test_unsafeBlockClosureInference_inMap_typed() async {
|
| var mainUnit = await checkFileElement('''
|
| typedef int F();
|
| -var v = <int, F>{1: /*info:INFERRED_TYPE_CLOSURE*/() { return 1; }};
|
| +main() {
|
| + var v = <int, F>{1: /*info:INFERRED_TYPE_CLOSURE*/() { return 1; }};
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'Map<int, () → int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inMap_untyped() async {
|
| var mainUnit = await checkFileElement('''
|
| -var v = /*info:INFERRED_TYPE_LITERAL*/{
|
| - 1: /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - }};
|
| +main() {
|
| + var v = /*info:INFERRED_TYPE_LITERAL*/{
|
| + 1: /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + }};
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'Map<int, () → int>');
|
| }
|
| @@ -4908,9 +4838,11 @@ var v = /*info:INFERRED_TYPE_LITERAL*/{
|
| class C {
|
| List<T> f<T>(T g()) => <T>[g()];
|
| }
|
| -var v = new C().f<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +main() {
|
| + var v = new C().f<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<dynamic>');
|
| }
|
| @@ -4920,9 +4852,11 @@ var v = new C().f<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| class C {
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| }
|
| -var v = new C().f/*<dynamic>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +main() {
|
| + var v = new C().f/*<dynamic>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<dynamic>');
|
| }
|
| @@ -4932,9 +4866,11 @@ var v = new C().f/*<dynamic>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| class C {
|
| List<T> f<T>(T g()) => <T>[g()];
|
| }
|
| -var v = new C().f<int>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +main() {
|
| + var v = new C().f<int>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
| @@ -4944,9 +4880,11 @@ var v = new C().f<int>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| class C {
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| }
|
| -var v = new C().f/*<int>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +main() {
|
| + var v = new C().f/*<int>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
| @@ -4956,12 +4894,14 @@ var v = new C().f/*<int>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| class C {
|
| List<T> f<T>(T g()) => <T>[g()];
|
| }
|
| -var v = new C().f(
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - });
|
| +main() {
|
| + var v = new C().f(
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
| @@ -4971,12 +4911,14 @@ var v = new C().f(
|
| class C {
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| }
|
| -var v = new C().f(
|
| - /*info:INFERRED_TYPE_CLOSURE,warning:UNSAFE_BLOCK_CLOSURE_INFERENCE*/() {
|
| - return 1;
|
| - });
|
| +main() {
|
| + var v = new C().f(
|
| + /*info:INFERRED_TYPE_CLOSURE*/() {
|
| + return 1;
|
| + });
|
| +}
|
| ''');
|
| - var v = mainUnit.topLevelVariables[0];
|
| + var v = mainUnit.functions[0].localVariables[0];
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
| @@ -5005,7 +4947,7 @@ T run<T>(T f()) {
|
|
|
| void printRunning() { print("running"); }
|
| var x = run<dynamic>(printRunning);
|
| -var y = /*info:USE_OF_VOID_RESULT*/run(printRunning);
|
| +var y = /*info:USE_OF_VOID_RESULT, error:TOP_LEVEL_TYPE_ARGUMENTS*/run(printRunning);
|
|
|
| main() {
|
| void printRunning() { print("running"); }
|
| @@ -5016,12 +4958,12 @@ main() {
|
| y = /*error:INVALID_ASSIGNMENT*/123;
|
| y = /*error:INVALID_ASSIGNMENT*/'hi';
|
| }
|
| - ''');
|
| + ''');
|
|
|
| var x = unit.topLevelVariables[0];
|
| var y = unit.topLevelVariables[1];
|
| expect(x.type.toString(), 'dynamic');
|
| - expect(y.type.toString(), 'void');
|
| + expect(y.type.toString(), 'dynamic');
|
| }
|
| }
|
|
|
| @@ -5045,22 +4987,27 @@ class InferredTypeTest_Driver extends InferredTypeTest {
|
| @override
|
| bool get hasExtraTaskModelPass => false;
|
|
|
| - @failingTest
|
| @override
|
| - test_blockBodiedLambdas_basic_topLevel() async {
|
| - await super.test_blockBodiedLambdas_basic_topLevel();
|
| + test_circularReference_viaClosures() async {
|
| + await super.test_circularReference_viaClosures();
|
| + }
|
| +
|
| + @override
|
| + test_circularReference_viaClosures_initializerTypes() async {
|
| + await super.test_circularReference_viaClosures_initializerTypes();
|
| }
|
|
|
| @failingTest
|
| @override
|
| - test_blockBodiedLambdas_LUB_topLevel() async {
|
| - await super.test_blockBodiedLambdas_LUB_topLevel();
|
| + test_genericMethods_usesGreatestLowerBound_comment_topLevel() async {
|
| + await super.test_genericMethods_usesGreatestLowerBound_comment_topLevel();
|
| }
|
|
|
| @failingTest
|
| @override
|
| - test_blockBodiedLambdas_noReturn_topLevel() =>
|
| - super.test_blockBodiedLambdas_noReturn_topLevel();
|
| + test_inferredType_customIndexOp() async {
|
| + await super.test_voidReturnTypeSubtypesDynamic();
|
| + }
|
|
|
| @failingTest
|
| @override
|
| @@ -5074,25 +5021,6 @@ class InferredTypeTest_Driver extends InferredTypeTest {
|
|
|
| @failingTest
|
| @override
|
| - test_nullCoalescingOperator() async {
|
| - await super.test_nullCoalescingOperator();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_closureCall() async {
|
| - await super.test_unsafeBlockClosureInference_closureCall();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_constructorCall_implicitTypeParam() async {
|
| - await super
|
| - .test_unsafeBlockClosureInference_constructorCall_implicitTypeParam();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr2() async {
|
| await super
|
| .test_unsafeBlockClosureInference_functionCall_explicitDynamicParam_viaExpr2();
|
| @@ -5121,49 +5049,7 @@ class InferredTypeTest_Driver extends InferredTypeTest {
|
|
|
| @failingTest
|
| @override
|
| - test_unsafeBlockClosureInference_functionCall_implicitTypeParam() async {
|
| - await super
|
| - .test_unsafeBlockClosureInference_functionCall_implicitTypeParam();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_functionCall_implicitTypeParam_comment() async {
|
| - await super
|
| - .test_unsafeBlockClosureInference_functionCall_implicitTypeParam_comment();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr() async {
|
| - await super
|
| - .test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr_comment() async {
|
| - await super
|
| - .test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr_comment();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_functionCall_noTypeParam_viaExpr() async {
|
| - await super
|
| - .test_unsafeBlockClosureInference_functionCall_noTypeParam_viaExpr();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_methodCall_implicitTypeParam() async {
|
| - await super.test_unsafeBlockClosureInference_methodCall_implicitTypeParam();
|
| - }
|
| -
|
| - @failingTest
|
| - @override
|
| - test_unsafeBlockClosureInference_methodCall_implicitTypeParam_comment() async {
|
| - await super
|
| - .test_unsafeBlockClosureInference_methodCall_implicitTypeParam_comment();
|
| + test_voidReturnTypeSubtypesDynamic() async {
|
| + await super.test_voidReturnTypeSubtypesDynamic();
|
| }
|
| }
|
|
|