Chromium Code Reviews| Index: tests/compiler/dart2js/cpa_inference_test.dart |
| diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart |
| index bbe7d385615fc5392dab33b4536bff1e0c4fc2fe..74e6ee80fad05596bc8baad812af5e4a80b2449b 100644 |
| --- a/tests/compiler/dart2js/cpa_inference_test.dart |
| +++ b/tests/compiler/dart2js/cpa_inference_test.dart |
| @@ -2,7 +2,9 @@ |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| +import 'dart:async'; |
| import "package:expect/expect.dart"; |
| +import "../../async_helper.dart"; |
| import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart'; |
| import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'; |
| import '../../../sdk/lib/_internal/compiler/implementation/types/concrete_types_inferrer.dart'; |
|
ahe
2013/09/02 15:24:41
There is a bunch of then blocks in this test that
Johnni Winther
2013/09/03 07:51:39
Done.
|
| @@ -145,7 +147,7 @@ class AnalysisResult { |
| const String CORELIB = r''' |
| print(var obj) {} |
| - abstract class num { |
| + abstract class num { |
| num operator +(num x); |
| num operator *(num x); |
| num operator -(num x); |
| @@ -174,7 +176,7 @@ const String CORELIB = r''' |
| class Dynamic_ {} |
| bool identical(Object a, Object b) {}'''; |
| -AnalysisResult analyze(String code, {int maxConcreteTypeSize: 1000}) { |
| +Future<AnalysisResult> analyze(String code, {int maxConcreteTypeSize: 1000}) { |
| Uri uri = new Uri(scheme: 'source'); |
| MockCompiler compiler = new MockCompiler( |
| coreSource: CORELIB, |
| @@ -182,8 +184,9 @@ AnalysisResult analyze(String code, {int maxConcreteTypeSize: 1000}) { |
| maxConcreteTypeSize: maxConcreteTypeSize); |
| compiler.sourceFiles[uri.toString()] = new SourceFile(uri.toString(), code); |
| compiler.typesTask.concreteTypesInferrer.testMode = true; |
| - compiler.runCompiler(uri); |
| - return new AnalysisResult(compiler); |
| + return compiler.runCompiler(uri).then((_) { |
| + return new AnalysisResult(compiler); |
| + }); |
| } |
| testDynamicBackDoor() { |
| @@ -193,8 +196,9 @@ testDynamicBackDoor() { |
| x; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasUnknownType('x'); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasUnknownType('x'); |
| + }); |
| } |
| testVariableDeclaration() { |
| @@ -206,9 +210,10 @@ testVariableDeclaration() { |
| v1; v2; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('v1', [result.nullType]); |
| - result.checkNodeHasType('v2', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('v1', [result.nullType]); |
| + result.checkNodeHasType('v2', [result.int]); |
| + }); |
| } |
| testLiterals() { |
| @@ -222,12 +227,13 @@ testLiterals() { |
| v1; v2; v3; v4; v5; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('v1', [result.int]); |
| - result.checkNodeHasType('v2', [result.double]); |
| - result.checkNodeHasType('v3', [result.string]); |
| - result.checkNodeHasType('v4', [result.bool]); |
| - result.checkNodeHasType('v5', [result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('v1', [result.int]); |
| + result.checkNodeHasType('v2', [result.double]); |
| + result.checkNodeHasType('v3', [result.string]); |
| + result.checkNodeHasType('v4', [result.bool]); |
| + result.checkNodeHasType('v5', [result.nullType]); |
| + }); |
| } |
| testRedefinition() { |
| @@ -238,8 +244,9 @@ testRedefinition() { |
| foo; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.string]); |
| + }); |
| } |
| testIfThenElse() { |
| @@ -254,8 +261,9 @@ testIfThenElse() { |
| foo; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.string, result.bool]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.string, result.bool]); |
| + }); |
| } |
| testTernaryIf() { |
| @@ -266,8 +274,9 @@ testTernaryIf() { |
| foo; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.string, result.bool]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.string, result.bool]); |
| + }); |
| } |
| testWhile() { |
| @@ -284,12 +293,13 @@ testWhile() { |
| foo; bar; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType( |
| - 'foo', |
| - [result.base('A'), result.base('B'), result.base('C')]); |
| - // Check that the condition is evaluated. |
| - result.checkNodeHasType('bar', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType( |
| + 'foo', |
| + [result.base('A'), result.base('B'), result.base('C')]); |
| + // Check that the condition is evaluated. |
| + result.checkNodeHasType('bar', [result.int]); |
| + }); |
| } |
| testDoWhile() { |
| @@ -306,12 +316,13 @@ testDoWhile() { |
| foo; bar; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType( |
| - 'foo', |
| - [result.base('A'), result.base('B'), result.base('C')]); |
| - // Check that the condition is evaluated. |
| - result.checkNodeHasType('bar', [result.int]); |
| + return analyze(source).then((AnalysisResult result) { |
| + result.checkNodeHasType( |
| + 'foo', |
| + [result.base('A'), result.base('B'), result.base('C')]); |
| + // Check that the condition is evaluated. |
| + result.checkNodeHasType('bar', [result.int]); |
| + }); |
| } |
| testFor1() { |
| @@ -327,10 +338,11 @@ testFor1() { |
| foo; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType( |
| - 'foo', |
| - [result.base('A'), result.base('B'), result.base('C')]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType( |
| + 'foo', |
| + [result.base('A'), result.base('B'), result.base('C')]); |
| + }); |
| } |
| testFor2() { |
| @@ -346,10 +358,11 @@ testFor2() { |
| foo; bar; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.base('A'), result.base('B')]); |
| - // Check that the condition is evaluated. |
| - result.checkNodeHasType('bar', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.base('A'), result.base('B')]); |
| + // Check that the condition is evaluated. |
| + result.checkNodeHasType('bar', [result.int]); |
| + }); |
| } |
| testFor3() { |
| @@ -363,8 +376,9 @@ testFor3() { |
| i; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('i', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('i', [result.int]); |
| + }); |
| } |
| testForIn() { |
| @@ -399,8 +413,10 @@ testForIn() { |
| res; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('res', [result.int, result.string, result.nullType]); |
| + return analyze(source).then((AnalysisResult result) { |
| + result.checkNodeHasType('res', |
| + [result.int, result.string, result.nullType]); |
| + }); |
| } |
| testToplevelVariable() { |
| @@ -409,15 +425,16 @@ testToplevelVariable() { |
| class A { |
| f() => top; |
| } |
| - main() { |
| + main() { |
| var foo = top; |
| var bar = new A().f(); |
| foo; bar; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.string]); |
| - result.checkNodeHasType('bar', [result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.string]); |
| + result.checkNodeHasType('bar', [result.string]); |
| + }); |
| } |
| testNonRecusiveFunction() { |
| @@ -425,8 +442,9 @@ testNonRecusiveFunction() { |
| f(x, y) => true ? x : y; |
| main() { var foo = f(42, "abc"); foo; } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int, result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int, result.string]); |
| + }); |
| } |
| testRecusiveFunction() { |
| @@ -437,18 +455,20 @@ testRecusiveFunction() { |
| } |
| main() { var foo = f(42); foo; } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int, result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int, result.string]); |
| + }); |
| } |
| testMutuallyRecusiveFunction() { |
| final String source = r""" |
| f() => true ? 42 : g(); |
| - g() => true ? "abc" : f(); |
| + g() => true ? "abc" : f(); |
| main() { var foo = f(); foo; } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int, result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int, result.string]); |
| + }); |
| } |
| testSimpleSend() { |
| @@ -463,7 +483,7 @@ testSimpleSend() { |
| f(x) => 3.14; |
| } |
| class D { |
| - var f; // we check that this field is ignored in calls to dynamic.f() |
| + var f; // we check that this field is ignored in calls to dynamic.f() |
| D(this.f); |
| } |
| main() { |
| @@ -473,9 +493,10 @@ testSimpleSend() { |
| foo; bar; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int]); |
| - result.checkNodeHasType('bar', [result.int, result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int]); |
| + result.checkNodeHasType('bar', [result.int, result.string]); |
| + }); |
| } |
| testSendToClosureField() { |
| @@ -490,8 +511,9 @@ testSendToClosureField() { |
| foo; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int]); |
| + }); |
| } |
| testSendToThis1() { |
| @@ -506,8 +528,9 @@ testSendToThis1() { |
| foo; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int]); |
| + }); |
| } |
| testSendToThis2() { |
| @@ -523,8 +546,9 @@ testSendToThis2() { |
| x; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.base('B')]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.base('B')]); |
| + }); |
| } |
| testSendToThis3() { |
| @@ -541,8 +565,9 @@ testSendToThis3() { |
| x; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.string]); |
| + return analyze(source).then((AnalysisResult result) { |
| + result.checkNodeHasType('x', [result.string]); |
| + }); |
| } |
| testConstructor() { |
| @@ -556,11 +581,12 @@ testConstructor() { |
| new A(true, null); |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkFieldHasType('A', 'x', [result.int, result.bool]); |
| - result.checkFieldHasType('A', 'y', [result.string, result.nullType]); |
| - // TODO(polux): we can be smarter and infer {string} for z |
| - result.checkFieldHasType('A', 'z', [result.string, result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkFieldHasType('A', 'x', [result.int, result.bool]); |
| + result.checkFieldHasType('A', 'y', [result.string, result.nullType]); |
| + // TODO(polux): we can be smarter and infer {string} for z |
| + result.checkFieldHasType('A', 'z', [result.string, result.nullType]); |
| + }); |
| } |
| testGetters() { |
| @@ -586,12 +612,13 @@ testGetters() { |
| foo; bar; baz; qux; quux; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int]); |
| - result.checkNodeHasType('bar', [result.int]); |
| - result.checkNodeHasType('baz', [result.int]); |
| - result.checkNodeHasType('qux', []); |
| - result.checkNodeHasType('quux', [result.int, result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int]); |
| + result.checkNodeHasType('bar', [result.int]); |
| + result.checkNodeHasType('baz', [result.int]); |
| + result.checkNodeHasType('qux', []); |
| + result.checkNodeHasType('quux', [result.int, result.string]); |
| + }); |
| } |
| testSetters() { |
| @@ -617,20 +644,21 @@ testSetters() { |
| "__dynamic_for_test".y = 3.14; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkFieldHasType('B', 'x', |
| - [result.int, // new B(42) |
| - result.nullType]); // dynamic.x = null |
| - result.checkFieldHasType('A', 'x', |
| - [result.int, // new A(42, ...) |
| - result.string, // a.x = 'abc' |
| - result.bool, // a.y = true |
| - result.nullType, // dynamic.x = null |
| - result.double]); // dynamic.y = 3.14 |
| - result.checkFieldHasType('A', 'w', |
| - [result.int, // new A(..., 42) |
| - result.bool, // a.y = true |
| - result.double]); // dynamic.y = double |
| + return analyze(source).then((result) { |
| + result.checkFieldHasType('B', 'x', |
| + [result.int, // new B(42) |
| + result.nullType]); // dynamic.x = null |
| + result.checkFieldHasType('A', 'x', |
| + [result.int, // new A(42, ...) |
| + result.string, // a.x = 'abc' |
| + result.bool, // a.y = true |
| + result.nullType, // dynamic.x = null |
| + result.double]); // dynamic.y = 3.14 |
| + result.checkFieldHasType('A', 'w', |
| + [result.int, // new A(..., 42) |
| + result.bool, // a.y = true |
| + result.double]); // dynamic.y = double |
| + }); |
| } |
| testOptionalNamedParameters() { |
| @@ -695,29 +723,30 @@ testOptionalNamedParameters() { |
| test.f3(1, z: 2); // non-existing named parameter |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - |
| - final foo = result.base('Foo'); |
| - final nil = result.nullType; |
| - |
| - result.checkFieldHasType('A', 'x', [result.int, result.string]); |
| - result.checkFieldHasType('A', 'y', [nil]); |
| - result.checkFieldHasType('A', 'z', [nil, result.double]); |
| - result.checkFieldHasType('A', 'w', [nil, result.bool]); |
| - result.checkFieldHasType('Test', 'a', [foo, result.int, result.string]); |
| - result.checkFieldHasType('Test', 'b', [foo, nil]); |
| - result.checkFieldHasType('Test', 'c', [foo, nil, result.double]); |
| - result.checkFieldHasType('Test', 'd', [foo, nil, result.bool]); |
| - |
| - result.checkFieldHasType('B', 'x', [result.string]); |
| - result.checkFieldHasType('B', 'y', [result.bool]); |
| - result.checkFieldHasType('Test', 'e', [foo, result.string]); |
| - result.checkFieldHasType('Test', 'f', [foo, result.bool]); |
| - |
| - result.checkFieldHasType('C', 'x', [result.string]); |
| - result.checkFieldHasType('C', 'y', [result.bool]); |
| - result.checkFieldHasType('Test', 'g', [foo, result.string]); |
| - result.checkFieldHasType('Test', 'h', [foo, result.bool]); |
| + return analyze(source).then((result) { |
| + |
| + final foo = result.base('Foo'); |
| + final nil = result.nullType; |
| + |
| + result.checkFieldHasType('A', 'x', [result.int, result.string]); |
| + result.checkFieldHasType('A', 'y', [nil]); |
| + result.checkFieldHasType('A', 'z', [nil, result.double]); |
| + result.checkFieldHasType('A', 'w', [nil, result.bool]); |
| + result.checkFieldHasType('Test', 'a', [foo, result.int, result.string]); |
| + result.checkFieldHasType('Test', 'b', [foo, nil]); |
| + result.checkFieldHasType('Test', 'c', [foo, nil, result.double]); |
| + result.checkFieldHasType('Test', 'd', [foo, nil, result.bool]); |
| + |
| + result.checkFieldHasType('B', 'x', [result.string]); |
| + result.checkFieldHasType('B', 'y', [result.bool]); |
| + result.checkFieldHasType('Test', 'e', [foo, result.string]); |
| + result.checkFieldHasType('Test', 'f', [foo, result.bool]); |
| + |
| + result.checkFieldHasType('C', 'x', [result.string]); |
| + result.checkFieldHasType('C', 'y', [result.bool]); |
| + result.checkFieldHasType('Test', 'g', [foo, result.string]); |
| + result.checkFieldHasType('Test', 'h', [foo, result.bool]); |
| + }); |
| } |
| testOptionalPositionalParameters() { |
| @@ -767,24 +796,25 @@ testOptionalPositionalParameters() { |
| test.f2(1, 2, 3); // too many arguments |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - |
| - final foo = result.base('Foo'); |
| - final nil = result.nullType; |
| - |
| - result.checkFieldHasType('A', 'x', [result.int, result.string]); |
| - result.checkFieldHasType('A', 'y', [nil, result.bool]); |
| - result.checkFieldHasType('A', 'z', [nil, result.double]); |
| - result.checkFieldHasType('A', 'w', [nil]); |
| - result.checkFieldHasType('Test', 'a', [foo, result.int, result.string]); |
| - result.checkFieldHasType('Test', 'b', [foo, nil, result.bool]); |
| - result.checkFieldHasType('Test', 'c', [foo, nil, result.double]); |
| - result.checkFieldHasType('Test', 'd', [foo, nil]); |
| - |
| - result.checkFieldHasType('B', 'x', [result.string]); |
| - result.checkFieldHasType('B', 'y', [result.bool]); |
| - result.checkFieldHasType('Test', 'e', [foo, result.string]); |
| - result.checkFieldHasType('Test', 'f', [foo, result.bool]); |
| + return analyze(source).then((result) { |
| + |
| + final foo = result.base('Foo'); |
| + final nil = result.nullType; |
| + |
| + result.checkFieldHasType('A', 'x', [result.int, result.string]); |
| + result.checkFieldHasType('A', 'y', [nil, result.bool]); |
| + result.checkFieldHasType('A', 'z', [nil, result.double]); |
| + result.checkFieldHasType('A', 'w', [nil]); |
| + result.checkFieldHasType('Test', 'a', [foo, result.int, result.string]); |
| + result.checkFieldHasType('Test', 'b', [foo, nil, result.bool]); |
| + result.checkFieldHasType('Test', 'c', [foo, nil, result.double]); |
| + result.checkFieldHasType('Test', 'd', [foo, nil]); |
| + |
| + result.checkFieldHasType('B', 'x', [result.string]); |
| + result.checkFieldHasType('B', 'y', [result.bool]); |
| + result.checkFieldHasType('Test', 'e', [foo, result.string]); |
| + result.checkFieldHasType('Test', 'f', [foo, result.bool]); |
| + }); |
| } |
| testListLiterals() { |
| @@ -799,10 +829,11 @@ testListLiterals() { |
| x; y; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.growableList]); |
| - result.checkNodeHasType('y', [result.growableList]); |
| - result.checkFieldHasType('A', 'x', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.growableList]); |
| + result.checkNodeHasType('y', [result.growableList]); |
| + result.checkFieldHasType('A', 'x', [result.int]); |
| + }); |
| } |
| testMapLiterals() { |
| @@ -817,10 +848,11 @@ testMapLiterals() { |
| x; y; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.map]); |
| - result.checkNodeHasType('y', [result.map]); |
| - result.checkFieldHasType('A', 'x', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.map]); |
| + result.checkNodeHasType('y', [result.map]); |
| + result.checkFieldHasType('A', 'x', [result.int]); |
| + }); |
| } |
| testReturn() { |
| @@ -833,9 +865,10 @@ testReturn() { |
| x; y; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.int, result.string]); |
| - result.checkNodeHasType('y', [result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.int, result.string]); |
| + result.checkNodeHasType('y', [result.nullType]); |
| + }); |
| } |
| testNoReturn() { |
| @@ -848,9 +881,10 @@ testNoReturn() { |
| x; y; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.int, result.nullType]); |
| - result.checkNodeHasType('y', [result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.int, result.nullType]); |
| + result.checkNodeHasType('y', [result.nullType]); |
| + }); |
| } |
| testArithmeticOperators() { |
| @@ -873,19 +907,20 @@ testArithmeticOperators() { |
| }"""; |
| } |
| for (String op in ['+', '*', '-']) { |
| - AnalysisResult result = analyze(source(op)); |
| - result.checkNodeHasType('a', [result.int]); |
| - result.checkNodeHasType('b', [result.num]); |
| - result.checkNodeHasType('c', [result.num]); |
| - result.checkNodeHasType('d', [result.double]); |
| - result.checkNodeHasType('e', [result.num]); |
| - result.checkNodeHasType('f', [result.num]); |
| - result.checkNodeHasType('g', [result.num]); |
| - result.checkNodeHasType('h', [result.num]); |
| - result.checkNodeHasType('i', [result.int]); |
| - result.checkNodeHasType('j', [result.int]); |
| - result.checkNodeHasType('k', [result.double]); |
| - result.checkNodeHasType('l', [result.double]); |
| + analyze(source(op)).then((result) { |
| + result.checkNodeHasType('a', [result.int]); |
| + result.checkNodeHasType('b', [result.num]); |
| + result.checkNodeHasType('c', [result.num]); |
| + result.checkNodeHasType('d', [result.double]); |
| + result.checkNodeHasType('e', [result.num]); |
| + result.checkNodeHasType('f', [result.num]); |
| + result.checkNodeHasType('g', [result.num]); |
| + result.checkNodeHasType('h', [result.num]); |
| + result.checkNodeHasType('i', [result.int]); |
| + result.checkNodeHasType('j', [result.int]); |
| + result.checkNodeHasType('k', [result.double]); |
| + result.checkNodeHasType('l', [result.double]); |
| + }); |
| } |
| } |
| @@ -901,11 +936,12 @@ testBooleanOperators() { |
| }"""; |
| } |
| for (String op in ['&&', '||']) { |
| - AnalysisResult result = analyze(source(op)); |
| - result.checkNodeHasType('a', [result.bool]); |
| - result.checkNodeHasType('b', [result.bool]); |
| - result.checkNodeHasType('c', [result.bool]); |
| - result.checkNodeHasType('d', [result.bool]); |
| + analyze(source(op)).then((result) { |
| + result.checkNodeHasType('a', [result.bool]); |
| + result.checkNodeHasType('b', [result.bool]); |
| + result.checkNodeHasType('c', [result.bool]); |
| + result.checkNodeHasType('d', [result.bool]); |
| + }); |
| } |
| } |
| @@ -919,8 +955,9 @@ testBooleanOperatorsShortCirtcuit() { |
| }"""; |
| } |
| for (String op in ['&&', '||']) { |
| - AnalysisResult result = analyze(source(op)); |
| - result.checkNodeHasType('x', [result.nullType, result.int]); |
| + analyze(source(op)).then((AnalysisResult result) { |
| + result.checkNodeHasType('x', [result.nullType, result.int]); |
| + }); |
| } |
| } |
| @@ -936,9 +973,10 @@ testOperators() { |
| x; y; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.int]); |
| - result.checkNodeHasType('y', [result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.int]); |
| + result.checkNodeHasType('y', [result.string]); |
| + }); |
| } |
| testSetIndexOperator() { |
| @@ -953,10 +991,11 @@ testSetIndexOperator() { |
| x; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.string]); |
| - result.checkFieldHasType('A', 'witness1', [result.int, result.nullType]); |
| - result.checkFieldHasType('A', 'witness2', [result.string, result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.string]); |
| + result.checkFieldHasType('A', 'witness1', [result.int, result.nullType]); |
| + result.checkFieldHasType('A', 'witness2', [result.string, result.nullType]); |
| + }); |
| } |
| testCompoundOperators1() { |
| @@ -981,13 +1020,14 @@ testCompoundOperators1() { |
| x1; x2; x3; x4; x5; x6; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x1', [result.int]); |
| - result.checkNodeHasType('x2', [result.int]); |
| - result.checkNodeHasType('x3', [result.int]); |
| - result.checkNodeHasType('x4', [result.string]); |
| - result.checkNodeHasType('x5', [result.string]); |
| - result.checkNodeHasType('x6', [result.string]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x1', [result.int]); |
| + result.checkNodeHasType('x2', [result.int]); |
| + result.checkNodeHasType('x3', [result.int]); |
| + result.checkNodeHasType('x4', [result.string]); |
| + result.checkNodeHasType('x5', [result.string]); |
| + result.checkNodeHasType('x6', [result.string]); |
| + }); |
| } |
| @@ -1010,16 +1050,17 @@ testCompoundOperators2() { |
| main () { |
| var a = new A(1, 1); |
| a.x++; |
| - a.y++; |
| + a.y++; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkFieldHasType('A', 'xx', [result.int]); |
| - result.checkFieldHasType('A', 'yy', [result.int]); |
| - result.checkFieldHasType('A', 'witness1', [result.string, result.nullType]); |
| - result.checkFieldHasType('A', 'witness2', [result.string, result.nullType]); |
| - result.checkFieldHasType('A', 'witness3', [result.string, result.nullType]); |
| - result.checkFieldHasType('A', 'witness4', [result.string, result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkFieldHasType('A', 'xx', [result.int]); |
| + result.checkFieldHasType('A', 'yy', [result.int]); |
| + result.checkFieldHasType('A', 'witness1', [result.string, result.nullType]); |
| + result.checkFieldHasType('A', 'witness2', [result.string, result.nullType]); |
| + result.checkFieldHasType('A', 'witness3', [result.string, result.nullType]); |
| + result.checkFieldHasType('A', 'witness4', [result.string, result.nullType]); |
| + }); |
| } |
| testInequality() { |
| @@ -1038,11 +1079,12 @@ testInequality() { |
| foo; bar; baz; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.bool]); |
| - result.checkNodeHasType('bar', [result.bool]); |
| - result.checkNodeHasType('baz', []); |
| - result.checkFieldHasType('A', 'witness', [result.string, result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.bool]); |
| + result.checkNodeHasType('bar', [result.bool]); |
| + result.checkNodeHasType('baz', []); |
| + result.checkFieldHasType('A', 'witness', [result.string, result.nullType]); |
| + }); |
| } |
| testFieldInitialization1() { |
| @@ -1058,10 +1100,11 @@ testFieldInitialization1() { |
| new B(); |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkFieldHasType('A', 'x', [result.nullType]); |
| - result.checkFieldHasType('A', 'y', [result.int]); |
| - result.checkFieldHasType('B', 'z', [result.string]); |
| + return analyze(source).then((result) { |
| + result.checkFieldHasType('A', 'x', [result.nullType]); |
| + result.checkFieldHasType('A', 'y', [result.int]); |
| + result.checkFieldHasType('B', 'z', [result.string]); |
| + }); |
| } |
| testFieldInitialization2() { |
| @@ -1074,8 +1117,9 @@ testFieldInitialization2() { |
| new A(); |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkFieldHasType('A', 'x', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkFieldHasType('A', 'x', [result.int]); |
| + }); |
| } |
| testFieldInitialization3() { |
| @@ -1095,15 +1139,16 @@ testFieldInitialization3() { |
| foo; bar; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - // checks that B.B is set as a reader of A.x |
| - result.checkFieldHasType('B', 'x', [result.nullType, result.string]); |
| - // checks that B.B is set as a caller of f |
| - result.checkFieldHasType('B', 'y', [result.nullType, result.string]); |
| - // checks that readers of x are notified by changes in x's type |
| - result.checkNodeHasType('foo', [result.nullType, result.string]); |
| - // checks that readers of y are notified by changes in y's type |
| - result.checkNodeHasType('bar', [result.nullType, result.string]); |
| + return analyze(source).then((result) { |
| + // checks that B.B is set as a reader of A.x |
| + result.checkFieldHasType('B', 'x', [result.nullType, result.string]); |
| + // checks that B.B is set as a caller of f |
| + result.checkFieldHasType('B', 'y', [result.nullType, result.string]); |
| + // checks that readers of x are notified by changes in x's type |
| + result.checkNodeHasType('foo', [result.nullType, result.string]); |
| + // checks that readers of y are notified by changes in y's type |
| + result.checkNodeHasType('bar', [result.nullType, result.string]); |
| + }); |
| } |
| testLists() { |
| @@ -1135,16 +1180,17 @@ testLists() { |
| var x8 = l2.removeLast(); |
| x1; x2; x3; x4; x5; x6; x7; x8; |
| }"""; |
| - AnalysisResult result = analyze(source); |
| - final expectedTypes = ['A', 'C', 'D', 'F', 'G'].map(result.base).toList(); |
| - result.checkNodeHasType('x1', expectedTypes); |
| - result.checkNodeHasType('x2', expectedTypes); |
| - result.checkNodeHasType('x3', []); |
| - result.checkNodeHasType('x4', expectedTypes); |
| - result.checkNodeHasType('x5', expectedTypes); |
| - result.checkNodeHasType('x6', []); |
| - result.checkNodeHasType('x7', expectedTypes); |
| - result.checkNodeHasType('x8', expectedTypes); |
| + return analyze(source).then((result) { |
| + final expectedTypes = ['A', 'C', 'D', 'F', 'G'].map(result.base).toList(); |
| + result.checkNodeHasType('x1', expectedTypes); |
| + result.checkNodeHasType('x2', expectedTypes); |
| + result.checkNodeHasType('x3', []); |
| + result.checkNodeHasType('x4', expectedTypes); |
| + result.checkNodeHasType('x5', expectedTypes); |
| + result.checkNodeHasType('x6', []); |
| + result.checkNodeHasType('x7', expectedTypes); |
| + result.checkNodeHasType('x8', expectedTypes); |
| + }); |
| } |
| testListWithCapacity() { |
| @@ -1154,8 +1200,9 @@ testListWithCapacity() { |
| var x = [][0]; |
| x; |
| }"""; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.nullType]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.nullType]); |
| + }); |
| } |
| testEmptyList() { |
| @@ -1165,8 +1212,9 @@ testEmptyList() { |
| var x = l[0]; |
| x; |
| }"""; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', []); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', []); |
| + }); |
| } |
| testSendWithWrongArity() { |
| @@ -1181,11 +1229,12 @@ testSendWithWrongArity() { |
| x; y; z; w; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', []); |
| - result.checkNodeHasType('y', []); |
| - result.checkNodeHasType('z', []); |
| - result.checkNodeHasType('w', []); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', []); |
| + result.checkNodeHasType('y', []); |
| + result.checkNodeHasType('z', []); |
| + result.checkNodeHasType('w', []); |
| + }); |
| } |
| testBigTypesWidening1() { |
| @@ -1198,9 +1247,10 @@ testBigTypesWidening1() { |
| x; y; |
| } |
| """; |
| - AnalysisResult result = analyze(source, maxConcreteTypeSize: 2); |
| - result.checkNodeHasType('x', [result.int, result.string]); |
| - result.checkNodeHasUnknownType('y'); |
| + analyze(source, maxConcreteTypeSize: 2).then((result) { |
| + result.checkNodeHasType('x', [result.int, result.string]); |
| + result.checkNodeHasUnknownType('y'); |
| + }); |
| } |
| testBigTypesWidening2() { |
| @@ -1216,9 +1266,10 @@ testBigTypesWidening2() { |
| a.y = true; |
| } |
| """; |
| - AnalysisResult result = analyze(source, maxConcreteTypeSize: 2); |
| - result.checkFieldHasType('A', 'x', [result.int, result.string]); |
| - result.checkFieldHasUknownType('A', 'y'); |
| + analyze(source, maxConcreteTypeSize: 2).then((result) { |
| + result.checkFieldHasType('A', 'x', [result.int, result.string]); |
| + result.checkFieldHasUknownType('A', 'y'); |
| + }); |
| } |
| testDynamicIsAbsorbing() { |
| @@ -1233,8 +1284,9 @@ testDynamicIsAbsorbing() { |
| x; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasUnknownType('x'); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasUnknownType('x'); |
| + }); |
| } |
| testJsCall() { |
| @@ -1279,34 +1331,35 @@ testJsCall() { |
| iNull; j; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - List maybe(List types) => new List.from(types)..add(result.nullType); |
| - result.checkNodeHasUnknownType('a'); |
| - result.checkNodeHasUnknownType('b'); |
| - final expectedCType = [result.growableList]; |
| - result.checkNodeHasType('c', expectedCType); |
| - result.checkNodeHasType('cNull', maybe(expectedCType)); |
| - final expectedDType = [result.string]; |
| - result.checkNodeHasType('d', expectedDType); |
| - result.checkNodeHasType('dNull', maybe(expectedDType)); |
| - final expectedEType = [result.int]; |
| - result.checkNodeHasType('e', expectedEType); |
| - result.checkNodeHasType('eNull', maybe(expectedEType)); |
| - final expectedFType = [result.double]; |
| - result.checkNodeHasType('f', expectedFType); |
| - result.checkNodeHasType('fNull', maybe(expectedFType)); |
| - final expectedGType = [result.num]; |
| - result.checkNodeHasType('g', expectedGType); |
| - result.checkNodeHasType('gNull', maybe(expectedGType)); |
| - final expectedHType = [result.bool]; |
| - result.checkNodeHasType('h', expectedHType); |
| - result.checkNodeHasType('hNull', maybe(expectedHType)); |
| - final expectedIType = [result.base('A'), result.base('B'), |
| - result.base('BB'), result.base('C'), |
| - result.base('D')]; |
| - result.checkNodeHasType('i', expectedIType); |
| - result.checkNodeHasType('iNull', maybe(expectedIType)); |
| - result.checkNodeHasType('j', []); |
| + return analyze(source).then((result) { |
| + List maybe(List types) => new List.from(types)..add(result.nullType); |
| + result.checkNodeHasUnknownType('a'); |
| + result.checkNodeHasUnknownType('b'); |
| + final expectedCType = [result.growableList]; |
| + result.checkNodeHasType('c', expectedCType); |
| + result.checkNodeHasType('cNull', maybe(expectedCType)); |
| + final expectedDType = [result.string]; |
| + result.checkNodeHasType('d', expectedDType); |
| + result.checkNodeHasType('dNull', maybe(expectedDType)); |
| + final expectedEType = [result.int]; |
| + result.checkNodeHasType('e', expectedEType); |
| + result.checkNodeHasType('eNull', maybe(expectedEType)); |
| + final expectedFType = [result.double]; |
| + result.checkNodeHasType('f', expectedFType); |
| + result.checkNodeHasType('fNull', maybe(expectedFType)); |
| + final expectedGType = [result.num]; |
| + result.checkNodeHasType('g', expectedGType); |
| + result.checkNodeHasType('gNull', maybe(expectedGType)); |
| + final expectedHType = [result.bool]; |
| + result.checkNodeHasType('h', expectedHType); |
| + result.checkNodeHasType('hNull', maybe(expectedHType)); |
| + final expectedIType = [result.base('A'), result.base('B'), |
| + result.base('BB'), result.base('C'), |
| + result.base('D')]; |
| + result.checkNodeHasType('i', expectedIType); |
| + result.checkNodeHasType('iNull', maybe(expectedIType)); |
| + result.checkNodeHasType('j', []); |
| + }); |
| } |
| testJsCallAugmentsSeenClasses() { |
| @@ -1316,8 +1369,9 @@ testJsCallAugmentsSeenClasses() { |
| x; |
| } |
| """; |
| - AnalysisResult result1 = analyze(source1); |
| - result1.checkNodeHasType('x', []); |
| + analyze(source1).then((AnalysisResult result) { |
| + result.checkNodeHasType('x', []); |
| + }); |
| final String source2 = r""" |
| import 'dart:foreign'; |
| @@ -1328,8 +1382,9 @@ testJsCallAugmentsSeenClasses() { |
| x; |
| } |
| """; |
| - AnalysisResult result2 = analyze(source2); |
| - result2.checkNodeHasType('x', [result2.int]); |
| + analyze(source2).then((AnalysisResult result) { |
| + result.checkNodeHasType('x', [result.int]); |
| + }); |
| } |
| testIsCheck() { |
| @@ -1339,8 +1394,9 @@ testIsCheck() { |
| x; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.bool]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.bool]); |
| + }); |
| } |
| testSeenClasses() { |
| @@ -1366,8 +1422,9 @@ testSeenClasses() { |
| foo; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('foo', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('foo', [result.int]); |
| + }); |
| } |
| testIntDoubleNum() { |
| @@ -1379,10 +1436,11 @@ testIntDoubleNum() { |
| a; b; c; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('a', [result.int]); |
| - result.checkNodeHasType('b', [result.double]); |
| - result.checkNodeHasType('c', [result.num]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('a', [result.int]); |
| + result.checkNodeHasType('b', [result.double]); |
| + result.checkNodeHasType('c', [result.num]); |
| + }); |
| } |
| testConcreteTypeToTypeMask() { |
| @@ -1398,46 +1456,47 @@ testConcreteTypeToTypeMask() { |
| new D(); |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| + return analyze(source).then((result) { |
| - convert(ConcreteType type) { |
| - return result.compiler.typesTask.concreteTypesInferrer |
| - .concreteTypeToTypeMask(type); |
| - } |
| + convert(ConcreteType type) { |
| + return result.compiler.typesTask.concreteTypesInferrer |
| + .concreteTypeToTypeMask(type); |
| + } |
| - final nullSingleton = |
| - result.compiler.typesTask.concreteTypesInferrer.singletonConcreteType( |
| - new NullBaseType()); |
| + final nullSingleton = |
| + result.compiler.typesTask.concreteTypesInferrer.singletonConcreteType( |
| + new NullBaseType()); |
| - singleton(ClassElement element) { |
| - return result.compiler.typesTask.concreteTypesInferrer |
| - .singletonConcreteType(new ClassBaseType(element)); |
| - } |
| + singleton(ClassElement element) { |
| + return result.compiler.typesTask.concreteTypesInferrer |
| + .singletonConcreteType(new ClassBaseType(element)); |
| + } |
| - ClassElement a = findElement(result.compiler, 'A'); |
| - ClassElement b = findElement(result.compiler, 'B'); |
| - ClassElement c = findElement(result.compiler, 'C'); |
| - ClassElement d = findElement(result.compiler, 'D'); |
| + ClassElement a = findElement(result.compiler, 'A'); |
| + ClassElement b = findElement(result.compiler, 'B'); |
| + ClassElement c = findElement(result.compiler, 'C'); |
| + ClassElement d = findElement(result.compiler, 'D'); |
| - for (ClassElement cls in [a, b, c, d]) { |
| - Expect.equals(convert(singleton(cls)), |
| - new TypeMask.nonNullExact(cls.rawType)); |
| - } |
| + for (ClassElement cls in [a, b, c, d]) { |
| + Expect.equals(convert(singleton(cls)), |
| + new TypeMask.nonNullExact(cls.rawType)); |
| + } |
| - for (ClassElement cls in [a, b, c, d]) { |
| - Expect.equals(convert(singleton(cls).union(nullSingleton)), |
| - new TypeMask.exact(cls.rawType)); |
| - } |
| + for (ClassElement cls in [a, b, c, d]) { |
| + Expect.equals(convert(singleton(cls).union(nullSingleton)), |
| + new TypeMask.exact(cls.rawType)); |
| + } |
| - Expect.equals(convert(singleton(a).union(singleton(b))), |
| - new TypeMask.nonNullSubclass(a.rawType)); |
| + Expect.equals(convert(singleton(a).union(singleton(b))), |
| + new TypeMask.nonNullSubclass(a.rawType)); |
| - Expect.equals(convert(singleton(a).union(singleton(b)).union(nullSingleton)), |
| - new TypeMask.subclass(a.rawType)); |
| + Expect.equals(convert(singleton(a).union(singleton(b)).union(nullSingleton)), |
|
ahe
2013/09/02 15:24:41
Long line.
Johnni Winther
2013/09/03 07:51:39
Done.
|
| + new TypeMask.subclass(a.rawType)); |
| - Expect.equals( |
| - convert(singleton(b).union(singleton(d))).simplify(result.compiler), |
| - new TypeMask.nonNullSubtype(a.rawType)); |
| + Expect.equals( |
| + convert(singleton(b).union(singleton(d))).simplify(result.compiler), |
| + new TypeMask.nonNullSubtype(a.rawType)); |
| + }); |
| } |
| testSelectors() { |
| @@ -1463,45 +1522,46 @@ testSelectors() { |
| new Z().foo(); |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| + return analyze(source).then((result) { |
| - inferredType(Selector selector) { |
| - return result.compiler.typesTask.concreteTypesInferrer |
| - .getTypeOfSelector(selector); |
| - } |
| + inferredType(Selector selector) { |
| + return result.compiler.typesTask.concreteTypesInferrer |
| + .getTypeOfSelector(selector); |
| + } |
| - ClassElement abc = findElement(result.compiler, 'ABC'); |
| - ClassElement bc = findElement(result.compiler, 'BC'); |
| - ClassElement a = findElement(result.compiler, 'A'); |
| - ClassElement b = findElement(result.compiler, 'B'); |
| - ClassElement c = findElement(result.compiler, 'C'); |
| - ClassElement xy = findElement(result.compiler, 'XY'); |
| - ClassElement x = findElement(result.compiler, 'X'); |
| - ClassElement y = findElement(result.compiler, 'Y'); |
| - ClassElement z = findElement(result.compiler, 'Z'); |
| - |
| - Selector foo = new Selector.call(buildSourceString("foo"), null, 0); |
| - |
| - Expect.equals( |
| - inferredType(foo).simplify(result.compiler), |
| - new TypeMask.nonNullSubclass(abc.rawType)); |
| - Expect.equals( |
| - inferredType(new TypedSelector.subclass(x.rawType, foo)), |
| - new TypeMask.nonNullExact(b.rawType)); |
| - Expect.equals( |
| - inferredType(new TypedSelector.subclass(y.rawType, foo)), |
| - new TypeMask.nonNullExact(c.rawType)); |
| - Expect.equals( |
| - inferredType(new TypedSelector.subclass(z.rawType, foo)), |
| - new TypeMask.nonNullExact(a.rawType)); |
| - Expect.equals( |
| - inferredType(new TypedSelector.subclass( |
| - xy.rawType, foo)).simplify(result.compiler), |
| - new TypeMask.nonNullSubclass(bc.rawType)); |
| - |
| - Selector bar = new Selector.call(buildSourceString("bar"), null, 0); |
| - |
| - Expect.isNull(inferredType(bar)); |
| + ClassElement abc = findElement(result.compiler, 'ABC'); |
| + ClassElement bc = findElement(result.compiler, 'BC'); |
| + ClassElement a = findElement(result.compiler, 'A'); |
| + ClassElement b = findElement(result.compiler, 'B'); |
| + ClassElement c = findElement(result.compiler, 'C'); |
| + ClassElement xy = findElement(result.compiler, 'XY'); |
| + ClassElement x = findElement(result.compiler, 'X'); |
| + ClassElement y = findElement(result.compiler, 'Y'); |
| + ClassElement z = findElement(result.compiler, 'Z'); |
| + |
| + Selector foo = new Selector.call(buildSourceString("foo"), null, 0); |
| + |
| + Expect.equals( |
| + inferredType(foo).simplify(result.compiler), |
| + new TypeMask.nonNullSubclass(abc.rawType)); |
| + Expect.equals( |
| + inferredType(new TypedSelector.subclass(x.rawType, foo)), |
| + new TypeMask.nonNullExact(b.rawType)); |
| + Expect.equals( |
| + inferredType(new TypedSelector.subclass(y.rawType, foo)), |
| + new TypeMask.nonNullExact(c.rawType)); |
| + Expect.equals( |
| + inferredType(new TypedSelector.subclass(z.rawType, foo)), |
| + new TypeMask.nonNullExact(a.rawType)); |
| + Expect.equals( |
| + inferredType(new TypedSelector.subclass( |
| + xy.rawType, foo)).simplify(result.compiler), |
| + new TypeMask.nonNullSubclass(bc.rawType)); |
| + |
| + Selector bar = new Selector.call(buildSourceString("bar"), null, 0); |
| + |
| + Expect.isNull(inferredType(bar)); |
| + }); |
| } |
| testMixins() { |
| @@ -1523,11 +1583,12 @@ testMixins() { |
| x; y; z; w; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('x', [result.string]); |
| - result.checkNodeHasType('y', [result.string]); |
| - result.checkNodeHasType('z', [result.int]); |
| - result.checkNodeHasType('w', [result.int]); |
| + return analyze(source).then((result) { |
| + result.checkNodeHasType('x', [result.string]); |
| + result.checkNodeHasType('y', [result.string]); |
| + result.checkNodeHasType('z', [result.int]); |
| + result.checkNodeHasType('w', [result.int]); |
| + }); |
| } |
| testClosures() { |
| @@ -1549,10 +1610,11 @@ testClosures() { |
| a; b; f; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('a', [result.int, result.string]); |
| - result.checkNodeHasType('f', [result.functionType]); |
| - result.checkNodeHasUnknownType('b'); |
| + return analyze(source).then((AnalysisResult result) { |
| + result.checkNodeHasType('a', [result.int, result.string]); |
| + result.checkNodeHasType('f', [result.functionType]); |
| + result.checkNodeHasUnknownType('b'); |
| + }); |
| } |
| testNestedFunctions() { |
| @@ -1574,69 +1636,72 @@ testNestedFunctions() { |
| a; b; f; |
| } |
| """; |
| - AnalysisResult result = analyze(source); |
| - result.checkNodeHasType('a', [result.int, result.string]); |
| - result.checkNodeHasType('f', [result.functionType]); |
| - result.checkNodeHasUnknownType('b'); |
| + return analyze(source).then((AnalysisResult result) { |
| + result.checkNodeHasType('a', [result.int, result.string]); |
| + result.checkNodeHasType('f', [result.functionType]); |
| + result.checkNodeHasUnknownType('b'); |
| + }); |
| } |
| void main() { |
| - testDynamicBackDoor(); |
| - testVariableDeclaration(); |
| - testLiterals(); |
| - testRedefinition(); |
| - testIfThenElse(); |
| - testTernaryIf(); |
| - testWhile(); |
| - testDoWhile(); |
| - testFor1(); |
| - testFor2(); |
| - testFor3(); |
| - testForIn(); |
| - testToplevelVariable(); |
| - testNonRecusiveFunction(); |
| - testRecusiveFunction(); |
| - testMutuallyRecusiveFunction(); |
| - testSimpleSend(); |
| - // testSendToClosureField(); // closures are not yet supported |
| - testSendToThis1(); |
| - testSendToThis2(); |
| - testSendToThis3(); |
| - testConstructor(); |
| - testGetters(); |
| - testSetters(); |
| - testOptionalNamedParameters(); |
| - testOptionalPositionalParameters(); |
| - testListLiterals(); |
| - testMapLiterals(); |
| - testReturn(); |
| - // testNoReturn(); // right now we infer the empty type instead of null |
| - testArithmeticOperators(); |
| - testBooleanOperators(); |
| - testBooleanOperatorsShortCirtcuit(); |
| - testOperators(); |
| - testCompoundOperators1(); |
| - testCompoundOperators2(); |
| - testSetIndexOperator(); |
| - testInequality(); |
| - testFieldInitialization1(); |
| - testFieldInitialization2(); |
| - testFieldInitialization3(); |
| - testSendWithWrongArity(); |
| - testBigTypesWidening1(); |
| - testBigTypesWidening2(); |
| - testDynamicIsAbsorbing(); |
| - testLists(); |
| - testListWithCapacity(); |
| - testEmptyList(); |
| - testJsCall(); |
| - testJsCallAugmentsSeenClasses(); |
| - testIsCheck(); |
| - testSeenClasses(); |
| - testIntDoubleNum(); |
| - testConcreteTypeToTypeMask(); |
| - testSelectors(); |
| - testMixins(); |
| - testClosures(); |
| - testNestedFunctions(); |
| + asyncTest(() => Future.forEach([ |
| + testDynamicBackDoor, |
| + testVariableDeclaration, |
| + testLiterals, |
| + testRedefinition, |
| + testIfThenElse, |
| + testTernaryIf, |
| + testWhile, |
| + testDoWhile, |
| + testFor1, |
| + testFor2, |
| + testFor3, |
| + testForIn, |
| + testToplevelVariable, |
| + testNonRecusiveFunction, |
| + testRecusiveFunction, |
| + testMutuallyRecusiveFunction, |
| + testSimpleSend, |
| + // testSendToClosureField, // closures are not yet supported |
| + testSendToThis1, |
| + testSendToThis2, |
| + testSendToThis3, |
| + testConstructor, |
| + testGetters, |
| + testSetters, |
| + testOptionalNamedParameters, |
| + testOptionalPositionalParameters, |
| + testListLiterals, |
| + testMapLiterals, |
| + testReturn, |
| + // testNoReturn, // right now we infer the empty type instead of null |
| + testArithmeticOperators, |
| + testBooleanOperators, |
| + testBooleanOperatorsShortCirtcuit, |
| + testOperators, |
| + testCompoundOperators1, |
| + testCompoundOperators2, |
| + testSetIndexOperator, |
| + testInequality, |
| + testFieldInitialization1, |
| + testFieldInitialization2, |
| + testFieldInitialization3, |
| + testSendWithWrongArity, |
| + testBigTypesWidening1, |
| + testBigTypesWidening2, |
| + testDynamicIsAbsorbing, |
| + testLists, |
| + testListWithCapacity, |
| + testEmptyList, |
| + testJsCall, |
| + testJsCallAugmentsSeenClasses, |
| + testIsCheck, |
| + testSeenClasses, |
| + testIntDoubleNum, |
| + testConcreteTypeToTypeMask, |
| + testSelectors, |
| + testMixins, |
| + testClosures, |
| + testNestedFunctions, |
| + ], (f) => f())); |
| } |