| 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 9d64a9c15d385a987d12a0287d88abbf21d0c49c..162d7b76d617cf2f3655b34f0e31876e7d55e01a 100644
|
| --- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| +++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
|
| @@ -11,6 +11,7 @@ import 'package:analyzer/dart/element/element.dart';
|
| import 'package:test/test.dart';
|
| import 'package:test_reflective_loader/test_reflective_loader.dart';
|
|
|
| +import '../../../utils.dart';
|
| import 'strong_test_helper.dart';
|
|
|
| void main() {
|
| @@ -36,6 +37,12 @@ abstract class InferredTypeMixin {
|
|
|
| /**
|
| * Add the file, process it (resolve, validate, etc) and return the resolved
|
| + * unit.
|
| + */
|
| + Future<CompilationUnit> checkFile(String content);
|
| +
|
| + /**
|
| + * Add the file, process it (resolve, validate, etc) and return the resolved
|
| * unit element.
|
| */
|
| Future<CompilationUnitElement> checkFileElement(String content);
|
| @@ -87,7 +94,7 @@ var g = () async => futureOrInt;
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| import 'dart:async';
|
| import 'dart:math' show Random;
|
| main() {
|
| @@ -102,7 +109,7 @@ main() {
|
| Future<int> h = /*info:ASSIGNMENT_CAST*/f();
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Future<num>');
|
| }
|
|
|
| @@ -110,7 +117,7 @@ main() {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| import 'dart:async';
|
| import 'dart:math' show Random;
|
| main() {
|
| @@ -125,7 +132,7 @@ main() {
|
| Future<int> h = /*info:ASSIGNMENT_CAST*/f();
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Future<num>');
|
| }
|
|
|
| @@ -133,7 +140,7 @@ main() {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| import 'dart:async';
|
| import 'dart:math' show Random;
|
| main() {
|
| @@ -148,7 +155,7 @@ main() {
|
| Future<int> h = /*info:ASSIGNMENT_CAST*/f();
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Future<num>');
|
| }
|
|
|
| @@ -156,7 +163,7 @@ main() {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| import 'dart:async';
|
| main() {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/() async* {
|
| @@ -168,7 +175,7 @@ main() {
|
| Stream<int> h = /*info:ASSIGNMENT_CAST*/f();
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Stream<num>');
|
| }
|
|
|
| @@ -186,31 +193,31 @@ test1() {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| main() {
|
| String f() => null;
|
| var g = f;
|
| g = /*info:INFERRED_TYPE_CLOSURE*/() { return /*error:RETURN_OF_INVALID_TYPE*/1; };
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| - expect(f.type.toString(), '() → String');
|
| + var g = findLocalVariable(unit, 'g');
|
| + expect(g.type.toString(), '() → String');
|
| }
|
|
|
| test_blockBodiedLambdas_downwardsIncompatibleWithUpwardsInference_topLevel() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFileElement(r'''
|
| String f() => null;
|
| var g = f;
|
| ''');
|
| - var f = mainUnit.topLevelVariables[0];
|
| - expect(f.type.toString(), '() → String');
|
| + var g = unit.topLevelVariables[0];
|
| + expect(g.type.toString(), '() → String');
|
| }
|
|
|
| test_blockBodiedLambdas_inferBottom_async() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| import 'dart:async';
|
| main() async {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/() async { return null; };
|
| @@ -219,7 +226,7 @@ main() async {
|
| String s = await f();
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Future<Null>');
|
| }
|
|
|
| @@ -227,7 +234,7 @@ main() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| import 'dart:async';
|
| main() async {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/() async* { yield null; };
|
| @@ -236,7 +243,7 @@ main() async {
|
| String s = await f().first;
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Stream<Null>');
|
| }
|
|
|
| @@ -244,9 +251,9 @@ main() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| var h = null;
|
| -void foo(int f(Object _)) {}
|
| +void foo(int g(Object _)) {}
|
|
|
| main() {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/(Object x) { return null; };
|
| @@ -261,7 +268,7 @@ main() {
|
| }
|
| ''');
|
|
|
| - var f = mainUnit.functions[1].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '(Object) → Null');
|
| }
|
|
|
| @@ -269,7 +276,7 @@ main() {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| main() {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/() sync* { yield null; };
|
| Iterable y = f();
|
| @@ -277,7 +284,7 @@ main() {
|
| String s = f().first;
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Iterable<Null>');
|
| }
|
|
|
| @@ -304,14 +311,14 @@ test2() {
|
| return;
|
| }
|
| // Original feature request: https://github.com/dart-lang/sdk/issues/25487
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| main() {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/() {
|
| return /*info:INFERRED_TYPE_CLOSURE*/(int x) { return 2.0 * x; };
|
| };
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → (int) → double');
|
| }
|
|
|
| @@ -319,22 +326,22 @@ main() {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| test1() {
|
| List<int> o;
|
| var y = o.map(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { });
|
| Iterable<int> z = y;
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[1];
|
| - expect(f.type.toString(), 'Iterable<Null>');
|
| + var y = findLocalVariable(unit, 'y');
|
| + expect(y.type.toString(), 'Iterable<Null>');
|
| }
|
|
|
| test_blockBodiedLambdas_syncStar() async {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| main() {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/() sync* {
|
| yield 1;
|
| @@ -344,7 +351,7 @@ main() {
|
| Iterable<int> h = /*info:ASSIGNMENT_CAST*/f();
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Iterable<num>');
|
| }
|
|
|
| @@ -474,7 +481,7 @@ void main() {
|
| test_constructors_inferenceFBounded() async {
|
| var errors = 'error:COULD_NOT_INFER,error:COULD_NOT_INFER';
|
| // if (hasExtraTaskModelPass) errors = '$errors,$errors';
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class Clonable<T> {}
|
|
|
| class Pair<T extends Clonable<T>, U extends Clonable<U>> {
|
| @@ -489,12 +496,12 @@ main() {
|
| final x = new /*$errors*/Pair._();
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'Pair<Clonable<dynamic>, Clonable<dynamic>>');
|
| }
|
|
|
| test_constructors_inferFromArguments() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {
|
| T t;
|
| C(this.t);
|
| @@ -516,16 +523,14 @@ main() {
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - 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>');
|
| - expect(vars.firstWhere((e) => e.name == 'c_dynamic').type.toString(),
|
| - 'C<dynamic>');
|
| + expect(findLocalVariable(unit, 'x').type.toString(), 'C<int>');
|
| + expect(findLocalVariable(unit, 'c_int').type.toString(), 'C<int>');
|
| + expect(findLocalVariable(unit, 'c_num').type.toString(), 'C<num>');
|
| + expect(findLocalVariable(unit, 'c_dynamic').type.toString(), 'C<dynamic>');
|
| }
|
|
|
| test_constructors_inferFromArguments_argumentNotAssignable() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class A {}
|
|
|
| typedef T F<T>();
|
| @@ -541,12 +546,12 @@ main() {
|
| var x = /*info:INFERRED_TYPE_ALLOCATION*/new /*error:COULD_NOT_INFER*/C(myF);
|
| }
|
| ''');
|
| - var x = unit.functions[1].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'C<NotA>');
|
| }
|
|
|
| test_constructors_inferFromArguments_const() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {
|
| final T t;
|
| const C(this.t);
|
| @@ -556,7 +561,7 @@ main() {
|
| var x = /*info:INFERRED_TYPE_ALLOCATION*/const C(42);
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| @@ -594,16 +599,16 @@ main() {
|
| }
|
|
|
| test_constructors_inferFromArguments_factory() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {
|
| T t;
|
|
|
| C._();
|
|
|
| factory C(T t) {
|
| - var x = new C<T>._();
|
| - x.t = t;
|
| - return x;
|
| + var c = new C<T>._();
|
| + c.t = t;
|
| + return c;
|
| }
|
| }
|
|
|
| @@ -613,7 +618,7 @@ main() {
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| @@ -629,7 +634,7 @@ class A<T> {
|
| }
|
|
|
| test_constructors_inferFromArguments_named() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {
|
| T t;
|
| C.named(List<T> t);
|
| @@ -641,20 +646,20 @@ main() {
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_namedFactory() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {
|
| T t;
|
| C();
|
|
|
| factory C.named(T t) {
|
| - var x = new C<T>();
|
| - x.t = t;
|
| - return x;
|
| + var c = new C<T>();
|
| + c.t = t;
|
| + return c;
|
| }
|
| }
|
|
|
| @@ -664,12 +669,12 @@ main() {
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_redirecting() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {
|
| T t;
|
| C(this.t);
|
| @@ -682,15 +687,15 @@ main() {
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| test_constructors_inferFromArguments_redirectingFactory() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| abstract class C<T> {
|
| T get t;
|
| - void set t(T x);
|
| + void set t(T t);
|
|
|
| factory C(T t) = CImpl<T>;
|
| }
|
| @@ -705,7 +710,7 @@ main() {
|
| x.t = /*error:INVALID_ASSIGNMENT*/'hello';
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'C<int>');
|
| }
|
|
|
| @@ -722,14 +727,14 @@ class Pair<T, U> {
|
| }
|
|
|
| test_constructors_tooManyPositionalArguments() async {
|
| - var unit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| class A<T> {}
|
| main() {
|
| var a = new A/*error:EXTRA_POSITIONAL_ARGUMENTS*/(42);
|
| }
|
| ''');
|
| - var vars = unit.functions[0].localVariables;
|
| - expect(vars[0].type.toString(), 'A<dynamic>');
|
| + var a = findLocalVariable(unit, 'a');
|
| + expect(a.type.toString(), 'A<dynamic>');
|
| }
|
|
|
| test_doNotInferOverriddenFieldsThatExplicitlySayDynamic_infer() async {
|
| @@ -2366,7 +2371,7 @@ main() {
|
| }
|
|
|
| test_genericMethods_usesGreatestLowerBound() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| typedef Iterable<num> F(int x);
|
| typedef List<int> G(double x);
|
|
|
| @@ -2376,12 +2381,12 @@ main() {
|
| var v = generic((F f) => null, (G g) => null);
|
| }
|
| ''');
|
| - var v = mainUnit.functions[1].localVariables[0];
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), '(num) → List<int>');
|
| }
|
|
|
| test_genericMethods_usesGreatestLowerBound_comment() async {
|
| - var mainUnit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| typedef Iterable<num> F(int x);
|
| typedef List<int> G(double x);
|
|
|
| @@ -2391,7 +2396,7 @@ main() {
|
| var v = generic((F f) => null, (G g) => null);
|
| }
|
| ''');
|
| - var v = mainUnit.functions[1].localVariables[0];
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), '(num) → List<int>');
|
| }
|
|
|
| @@ -2883,7 +2888,7 @@ test1() {
|
| }
|
|
|
| test_inferGenericMethodType_named() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| T m<T>(int a, {String b, T c}) => null;
|
| }
|
| @@ -2891,12 +2896,12 @@ main() {
|
| var y = new C().m(1, b: 'bbb', c: 2.0);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_named_comment() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| /*=T*/ m/*<T>*/(int a, {String b, /*=T*/ c}) => null;
|
| }
|
| @@ -2904,12 +2909,12 @@ main() {
|
| var y = new C().m(1, b: 'bbb', c: 2.0);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| T m<T>(int a, [T b]) => null;
|
| }
|
| @@ -2917,12 +2922,12 @@ main() {
|
| var y = new C().m(1, 2.0);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional2() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| T m<T>(int a, [String b, T c]) => null;
|
| }
|
| @@ -2930,12 +2935,12 @@ main() {
|
| var y = new C().m(1, 'bbb', 2.0);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional2_comment() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| /*=T*/ m/*<T>*/(int a, [String b, /*=T*/ c]) => null;
|
| }
|
| @@ -2943,12 +2948,12 @@ main() {
|
| var y = new C().m(1, 'bbb', 2.0);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_positional_comment() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| /*=T*/ m/*<T>*/(int a, [/*=T*/ b]) => null;
|
| }
|
| @@ -2956,12 +2961,12 @@ main() {
|
| var y = new C().m(1, 2.0);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'double');
|
| }
|
|
|
| test_inferGenericMethodType_required() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| T m<T>(T x) => x;
|
| }
|
| @@ -2969,12 +2974,12 @@ main() {
|
| var y = new C().m(42);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'int');
|
| }
|
|
|
| test_inferGenericMethodType_required_comment() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| /*=T*/ m/*<T>*/(/*=T*/ x) => x;
|
| }
|
| @@ -2982,7 +2987,7 @@ main() {
|
| var y = new C().m(42);
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[0];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.type.toString(), 'int');
|
| }
|
|
|
| @@ -3120,12 +3125,12 @@ class Foo {
|
| }
|
|
|
| test_inferredType_blockClosure_noArgs_noReturn() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var f = /*info:INFERRED_TYPE_CLOSURE*/() {};
|
| }
|
| ''');
|
| - var f = mainUnit.functions[0].localVariables[0];
|
| + var f = findLocalVariable(unit, 'f');
|
| expect(f.type.toString(), '() → Null');
|
| }
|
|
|
| @@ -3170,7 +3175,7 @@ var x = c*c;
|
| }
|
|
|
| test_inferredType_customIndexOp() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| bool operator[](int index) => true;
|
| }
|
| @@ -3179,13 +3184,13 @@ main() {
|
| var x = c[0];
|
| }
|
| ''');
|
| - var x = mainUnit.functions[0].localVariables[1];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.name, 'x');
|
| expect(x.type.toString(), 'bool');
|
| }
|
|
|
| test_inferredType_customIndexOp_viaInterface() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class I {
|
| bool operator[](int index) => true;
|
| }
|
| @@ -3195,7 +3200,7 @@ main() {
|
| var x = c[0];
|
| }
|
| ''');
|
| - var x = mainUnit.functions[0].localVariables[1];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.name, 'x');
|
| expect(x.type.toString(), 'bool');
|
| }
|
| @@ -3835,13 +3840,13 @@ A v = null;
|
| }
|
|
|
| test_instantiateToBounds_invokeConstructor_noBound() async {
|
| - var unit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {}
|
| main() {
|
| var v = new C();
|
| }
|
| ''');
|
| - var v = unit.functions[0].localVariables[0];
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'C<dynamic>');
|
| }
|
|
|
| @@ -3931,13 +3936,13 @@ var x = /*info:INFERRED_TYPE_LITERAL*/[null];
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var unit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| test1() {
|
| var x = /*info:INFERRED_TYPE_LITERAL*/[null];
|
| x.add(/*error:INVALID_CAST_LITERAL*/42);
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'List<Null>');
|
| }
|
|
|
| @@ -3993,13 +3998,13 @@ test2() {
|
| if (!mayCheckTypesOfLocals) {
|
| return;
|
| }
|
| - var unit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| test1() {
|
| var x = /*info:INFERRED_TYPE_LITERAL*/{ null: null };
|
| x[/*error:INVALID_CAST_LITERAL*/3] = /*error:INVALID_CAST_LITERAL*/'z';
|
| }
|
| ''');
|
| - var x = unit.functions[0].localVariables[0];
|
| + var x = findLocalVariable(unit, 'x');
|
| expect(x.type.toString(), 'Map<Null, Null>');
|
| }
|
|
|
| @@ -4126,13 +4131,13 @@ main() {
|
| }
|
| ''');
|
| // Don't do anything if we already have a context type.
|
| - var unit = await checkFileElement(r'''
|
| + var unit = await checkFile(r'''
|
| main() {
|
| List<int> x;
|
| List<num> y = x ?? /*info:INFERRED_TYPE_LITERAL*/[];
|
| }
|
| ''');
|
| - var y = unit.functions[0].localVariables[1];
|
| + var y = findLocalVariable(unit, 'y');
|
| expect(y.initializer.returnType.toString(), 'List<num>');
|
| }
|
|
|
| @@ -4312,12 +4317,12 @@ class C {
|
|
|
| test_unsafeBlockClosureInference_closureCall() async {
|
| // Regression test for https://github.com/dart-lang/sdk/issues/26962
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = ((x) => 1.0)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'double');
|
| }
|
| @@ -4347,7 +4352,7 @@ var v = new C<int>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
|
|
| test_unsafeBlockClosureInference_constructorCall_implicitTypeParam() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C<T> {
|
| C(T x());
|
| }
|
| @@ -4358,7 +4363,7 @@ main() {
|
| });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.name, 'v');
|
| expect(v.type.toString(), 'C<int>');
|
| }
|
| @@ -4508,7 +4513,7 @@ var v = (f)/*<int>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = f(
|
| /*info:INFERRED_TYPE_CLOSURE*/() {
|
| @@ -4517,13 +4522,12 @@ main() {
|
| }
|
| List<T> f<T>(T g()) => <T>[g()];
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam_comment() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = f(
|
| /*info:INFERRED_TYPE_CLOSURE*/() {
|
| @@ -4532,13 +4536,12 @@ main() {
|
| }
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = (f)(
|
| /*info:INFERRED_TYPE_CLOSURE*/() {
|
| @@ -4547,13 +4550,12 @@ main() {
|
| }
|
| List<T> f<T>(T g()) => <T>[g()];
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_implicitTypeParam_viaExpr_comment() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = (f)(
|
| /*info:INFERRED_TYPE_CLOSURE*/() {
|
| @@ -4562,60 +4564,55 @@ main() {
|
| }
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_noTypeParam() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = f(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
| double f(x) => 1.0;
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'double');
|
| }
|
|
|
| test_unsafeBlockClosureInference_functionCall_noTypeParam_viaExpr() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = (f)(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
| double f(x) => 1.0;
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'double');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inList_dynamic() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = <dynamic>[/*info:INFERRED_TYPE_CLOSURE*/() { return 1; }];
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<dynamic>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inList_typed() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| typedef int F();
|
| main() {
|
| var v = <F>[/*info:INFERRED_TYPE_CLOSURE*/() { return 1; }];
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<() → int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inList_untyped() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = /*info:INFERRED_TYPE_LITERAL*/[
|
| /*info:INFERRED_TYPE_CLOSURE*/() {
|
| @@ -4623,36 +4620,33 @@ main() {
|
| }];
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<() → int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inMap_dynamic() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = <int, dynamic>{1: /*info:INFERRED_TYPE_CLOSURE*/() { return 1; }};
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'Map<int, dynamic>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inMap_typed() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| typedef int F();
|
| main() {
|
| var v = <int, F>{1: /*info:INFERRED_TYPE_CLOSURE*/() { return 1; }};
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'Map<int, () → int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_inMap_untyped() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| main() {
|
| var v = /*info:INFERRED_TYPE_LITERAL*/{
|
| 1: /*info:INFERRED_TYPE_CLOSURE*/() {
|
| @@ -4660,13 +4654,12 @@ main() {
|
| }};
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'Map<int, () → int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_methodCall_explicitDynamicParam() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| List<T> f<T>(T g()) => <T>[g()];
|
| }
|
| @@ -4674,13 +4667,12 @@ main() {
|
| var v = new C().f<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<dynamic>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_methodCall_explicitDynamicParam_comment() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| }
|
| @@ -4688,13 +4680,12 @@ main() {
|
| var v = new C().f/*<dynamic>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<dynamic>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_methodCall_explicitTypeParam() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| List<T> f<T>(T g()) => <T>[g()];
|
| }
|
| @@ -4702,13 +4693,12 @@ main() {
|
| var v = new C().f<int>(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_methodCall_explicitTypeParam_comment() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| }
|
| @@ -4716,13 +4706,12 @@ main() {
|
| var v = new C().f/*<int>*/(/*info:INFERRED_TYPE_CLOSURE*/() { return 1; });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_methodCall_implicitTypeParam() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| List<T> f<T>(T g()) => <T>[g()];
|
| }
|
| @@ -4733,13 +4722,12 @@ main() {
|
| });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
| test_unsafeBlockClosureInference_methodCall_implicitTypeParam_comment() async {
|
| - var mainUnit = await checkFileElement('''
|
| + var unit = await checkFile('''
|
| class C {
|
| dynamic /*=List<T>*/ f/*<T>*/(dynamic/*=T*/ g()) => <T>[g()];
|
| }
|
| @@ -4750,8 +4738,7 @@ main() {
|
| });
|
| }
|
| ''');
|
| - var v = mainUnit.functions[0].localVariables[0];
|
| - expect(v.name, 'v');
|
| + var v = findLocalVariable(unit, 'v');
|
| expect(v.type.toString(), 'List<int>');
|
| }
|
|
|
|
|