| Index: tests/compiler/dart2js/subtype_test.dart
|
| diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart
|
| index 35a46517582f585d7092c458cbe068ef433df522..2322ee01187906f102314e46d108a1845ddaba07 100644
|
| --- a/tests/compiler/dart2js/subtype_test.dart
|
| +++ b/tests/compiler/dart2js/subtype_test.dart
|
| @@ -5,6 +5,7 @@
|
| library subtype_test;
|
|
|
| import 'package:expect/expect.dart';
|
| +import "package:async_helper/async_helper.dart";
|
| import 'type_test_helper.dart';
|
| import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
|
| import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
|
| @@ -23,210 +24,210 @@ void main() {
|
| }
|
|
|
| void testInterfaceSubtype() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| class A<T> {}
|
| class B<T1, T2> extends A<T1> {}
|
| // TODO(johnniwinther): Inheritance with different type arguments is
|
| // currently not supported by the implementation.
|
| class C<T1, T2> extends B<T2, T1> /*implements A<A<T1>>*/ {}
|
| - """);
|
| -
|
| - void expect(bool value, DartType T, DartType S) {
|
| - Expect.equals(value, env.isSubtype(T, S), '$T <: $S');
|
| - }
|
| -
|
| - ClassElement A = env.getElement('A');
|
| - ClassElement B = env.getElement('B');
|
| - ClassElement C = env.getElement('C');
|
| - DartType Object_ = env['Object'];
|
| - DartType num_ = env['num'];
|
| - DartType int_ = env['int'];
|
| - DartType String_ = env['String'];
|
| - DartType dynamic_ = env['dynamic'];
|
| -
|
| - expect(true, Object_, Object_);
|
| - expect(true, num_, Object_);
|
| - expect(true, int_, Object_);
|
| - expect(true, String_, Object_);
|
| - expect(true, dynamic_, Object_);
|
| -
|
| - expect(false, Object_, num_);
|
| - expect(true, num_, num_);
|
| - expect(true, int_, num_);
|
| - expect(false, String_, num_);
|
| - expect(true, dynamic_, num_);
|
| -
|
| - expect(false, Object_, int_);
|
| - expect(false, num_, int_);
|
| - expect(true, int_, int_);
|
| - expect(false, String_, int_);
|
| - expect(true, dynamic_, int_);
|
| -
|
| - expect(false, Object_, String_);
|
| - expect(false, num_, String_);
|
| - expect(false, int_, String_);
|
| - expect(true, String_, String_);
|
| - expect(true, dynamic_, String_);
|
| -
|
| - expect(true, Object_, dynamic_);
|
| - expect(true, num_, dynamic_);
|
| - expect(true, int_, dynamic_);
|
| - expect(true, String_, dynamic_);
|
| - expect(true, dynamic_, dynamic_);
|
| -
|
| - DartType A_Object = instantiate(A, [Object_]);
|
| - DartType A_num = instantiate(A, [num_]);
|
| - DartType A_int = instantiate(A, [int_]);
|
| - DartType A_String = instantiate(A, [String_]);
|
| - DartType A_dynamic = instantiate(A, [dynamic_]);
|
| -
|
| - expect(true, A_Object, Object_);
|
| - expect(false, A_Object, num_);
|
| - expect(false, A_Object, int_);
|
| - expect(false, A_Object, String_);
|
| - expect(true, A_Object, dynamic_);
|
| -
|
| - expect(true, A_Object, A_Object);
|
| - expect(true, A_num, A_Object);
|
| - expect(true, A_int, A_Object);
|
| - expect(true, A_String, A_Object);
|
| - expect(true, A_dynamic, A_Object);
|
| -
|
| - expect(false, A_Object, A_num);
|
| - expect(true, A_num, A_num);
|
| - expect(true, A_int, A_num);
|
| - expect(false, A_String, A_num);
|
| - expect(true, A_dynamic, A_num);
|
| -
|
| - expect(false, A_Object, A_int);
|
| - expect(false, A_num, A_int);
|
| - expect(true, A_int, A_int);
|
| - expect(false, A_String, A_int);
|
| - expect(true, A_dynamic, A_int);
|
| -
|
| - expect(false, A_Object, A_String);
|
| - expect(false, A_num, A_String);
|
| - expect(false, A_int, A_String);
|
| - expect(true, A_String, A_String);
|
| - expect(true, A_dynamic, A_String);
|
| -
|
| - expect(true, A_Object, A_dynamic);
|
| - expect(true, A_num, A_dynamic);
|
| - expect(true, A_int, A_dynamic);
|
| - expect(true, A_String, A_dynamic);
|
| - expect(true, A_dynamic, A_dynamic);
|
| -
|
| - DartType B_Object_Object = instantiate(B, [Object_, Object_]);
|
| - DartType B_num_num = instantiate(B, [num_, num_]);
|
| - DartType B_int_num = instantiate(B, [int_, num_]);
|
| - DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]);
|
| - DartType B_String_dynamic = instantiate(B, [String_, dynamic_]);
|
| -
|
| - expect(true, B_Object_Object, Object_);
|
| - expect(true, B_Object_Object, A_Object);
|
| - expect(false, B_Object_Object, A_num);
|
| - expect(false, B_Object_Object, A_int);
|
| - expect(false, B_Object_Object, A_String);
|
| - expect(true, B_Object_Object, A_dynamic);
|
| -
|
| - expect(true, B_num_num, Object_);
|
| - expect(true, B_num_num, A_Object);
|
| - expect(true, B_num_num, A_num);
|
| - expect(false, B_num_num, A_int);
|
| - expect(false, B_num_num, A_String);
|
| - expect(true, B_num_num, A_dynamic);
|
| -
|
| - expect(true, B_int_num, Object_);
|
| - expect(true, B_int_num, A_Object);
|
| - expect(true, B_int_num, A_num);
|
| - expect(true, B_int_num, A_int);
|
| - expect(false, B_int_num, A_String);
|
| - expect(true, B_int_num, A_dynamic);
|
| -
|
| - expect(true, B_dynamic_dynamic, Object_);
|
| - expect(true, B_dynamic_dynamic, A_Object);
|
| - expect(true, B_dynamic_dynamic, A_num);
|
| - expect(true, B_dynamic_dynamic, A_int);
|
| - expect(true, B_dynamic_dynamic, A_String);
|
| - expect(true, B_dynamic_dynamic, A_dynamic);
|
| -
|
| - expect(true, B_String_dynamic, Object_);
|
| - expect(true, B_String_dynamic, A_Object);
|
| - expect(false, B_String_dynamic, A_num);
|
| - expect(false, B_String_dynamic, A_int);
|
| - expect(true, B_String_dynamic, A_String);
|
| - expect(true, B_String_dynamic, A_dynamic);
|
| -
|
| - expect(true, B_Object_Object, B_Object_Object);
|
| - expect(true, B_num_num, B_Object_Object);
|
| - expect(true, B_int_num, B_Object_Object);
|
| - expect(true, B_dynamic_dynamic, B_Object_Object);
|
| - expect(true, B_String_dynamic, B_Object_Object);
|
| -
|
| - expect(false, B_Object_Object, B_num_num);
|
| - expect(true, B_num_num, B_num_num);
|
| - expect(true, B_int_num, B_num_num);
|
| - expect(true, B_dynamic_dynamic, B_num_num);
|
| - expect(false, B_String_dynamic, B_num_num);
|
| -
|
| - expect(false, B_Object_Object, B_int_num);
|
| - expect(false, B_num_num, B_int_num);
|
| - expect(true, B_int_num, B_int_num);
|
| - expect(true, B_dynamic_dynamic, B_int_num);
|
| - expect(false, B_String_dynamic, B_int_num);
|
| -
|
| - expect(true, B_Object_Object, B_dynamic_dynamic);
|
| - expect(true, B_num_num, B_dynamic_dynamic);
|
| - expect(true, B_int_num, B_dynamic_dynamic);
|
| - expect(true, B_dynamic_dynamic, B_dynamic_dynamic);
|
| - expect(true, B_String_dynamic, B_dynamic_dynamic);
|
| -
|
| - expect(false, B_Object_Object, B_String_dynamic);
|
| - expect(false, B_num_num, B_String_dynamic);
|
| - expect(false, B_int_num, B_String_dynamic);
|
| - expect(true, B_dynamic_dynamic, B_String_dynamic);
|
| - expect(true, B_String_dynamic, B_String_dynamic);
|
| -
|
| - DartType C_Object_Object = instantiate(C, [Object_, Object_]);
|
| - DartType C_num_num = instantiate(C, [num_, num_]);
|
| - DartType C_int_String = instantiate(C, [int_, String_]);
|
| - DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]);
|
| -
|
| - expect(true, C_Object_Object, B_Object_Object);
|
| - expect(false, C_Object_Object, B_num_num);
|
| - expect(false, C_Object_Object, B_int_num);
|
| - expect(true, C_Object_Object, B_dynamic_dynamic);
|
| - expect(false, C_Object_Object, B_String_dynamic);
|
| -
|
| - expect(true, C_num_num, B_Object_Object);
|
| - expect(true, C_num_num, B_num_num);
|
| - expect(false, C_num_num, B_int_num);
|
| - expect(true, C_num_num, B_dynamic_dynamic);
|
| - expect(false, C_num_num, B_String_dynamic);
|
| -
|
| - expect(true, C_int_String, B_Object_Object);
|
| - expect(false, C_int_String, B_num_num);
|
| - expect(false, C_int_String, B_int_num);
|
| - expect(true, C_int_String, B_dynamic_dynamic);
|
| - expect(true, C_int_String, B_String_dynamic);
|
| -
|
| - expect(true, C_dynamic_dynamic, B_Object_Object);
|
| - expect(true, C_dynamic_dynamic, B_num_num);
|
| - expect(true, C_dynamic_dynamic, B_int_num);
|
| - expect(true, C_dynamic_dynamic, B_dynamic_dynamic);
|
| - expect(true, C_dynamic_dynamic, B_String_dynamic);
|
| -
|
| - expect(false, C_int_String, A_int);
|
| - expect(true, C_int_String, A_String);
|
| - // TODO(johnniwinther): Inheritance with different type arguments is
|
| - // currently not supported by the implementation.
|
| - //expect(true, C_int_String, instantiate(A, [A_int]));
|
| - expect(false, C_int_String, instantiate(A, [A_String]));
|
| + """).then((env) {
|
| +
|
| + void expect(bool value, DartType T, DartType S) {
|
| + Expect.equals(value, env.isSubtype(T, S), '$T <: $S');
|
| + }
|
| +
|
| + ClassElement A = env.getElement('A');
|
| + ClassElement B = env.getElement('B');
|
| + ClassElement C = env.getElement('C');
|
| + DartType Object_ = env['Object'];
|
| + DartType num_ = env['num'];
|
| + DartType int_ = env['int'];
|
| + DartType String_ = env['String'];
|
| + DartType dynamic_ = env['dynamic'];
|
| +
|
| + expect(true, Object_, Object_);
|
| + expect(true, num_, Object_);
|
| + expect(true, int_, Object_);
|
| + expect(true, String_, Object_);
|
| + expect(true, dynamic_, Object_);
|
| +
|
| + expect(false, Object_, num_);
|
| + expect(true, num_, num_);
|
| + expect(true, int_, num_);
|
| + expect(false, String_, num_);
|
| + expect(true, dynamic_, num_);
|
| +
|
| + expect(false, Object_, int_);
|
| + expect(false, num_, int_);
|
| + expect(true, int_, int_);
|
| + expect(false, String_, int_);
|
| + expect(true, dynamic_, int_);
|
| +
|
| + expect(false, Object_, String_);
|
| + expect(false, num_, String_);
|
| + expect(false, int_, String_);
|
| + expect(true, String_, String_);
|
| + expect(true, dynamic_, String_);
|
| +
|
| + expect(true, Object_, dynamic_);
|
| + expect(true, num_, dynamic_);
|
| + expect(true, int_, dynamic_);
|
| + expect(true, String_, dynamic_);
|
| + expect(true, dynamic_, dynamic_);
|
| +
|
| + DartType A_Object = instantiate(A, [Object_]);
|
| + DartType A_num = instantiate(A, [num_]);
|
| + DartType A_int = instantiate(A, [int_]);
|
| + DartType A_String = instantiate(A, [String_]);
|
| + DartType A_dynamic = instantiate(A, [dynamic_]);
|
| +
|
| + expect(true, A_Object, Object_);
|
| + expect(false, A_Object, num_);
|
| + expect(false, A_Object, int_);
|
| + expect(false, A_Object, String_);
|
| + expect(true, A_Object, dynamic_);
|
| +
|
| + expect(true, A_Object, A_Object);
|
| + expect(true, A_num, A_Object);
|
| + expect(true, A_int, A_Object);
|
| + expect(true, A_String, A_Object);
|
| + expect(true, A_dynamic, A_Object);
|
| +
|
| + expect(false, A_Object, A_num);
|
| + expect(true, A_num, A_num);
|
| + expect(true, A_int, A_num);
|
| + expect(false, A_String, A_num);
|
| + expect(true, A_dynamic, A_num);
|
| +
|
| + expect(false, A_Object, A_int);
|
| + expect(false, A_num, A_int);
|
| + expect(true, A_int, A_int);
|
| + expect(false, A_String, A_int);
|
| + expect(true, A_dynamic, A_int);
|
| +
|
| + expect(false, A_Object, A_String);
|
| + expect(false, A_num, A_String);
|
| + expect(false, A_int, A_String);
|
| + expect(true, A_String, A_String);
|
| + expect(true, A_dynamic, A_String);
|
| +
|
| + expect(true, A_Object, A_dynamic);
|
| + expect(true, A_num, A_dynamic);
|
| + expect(true, A_int, A_dynamic);
|
| + expect(true, A_String, A_dynamic);
|
| + expect(true, A_dynamic, A_dynamic);
|
| +
|
| + DartType B_Object_Object = instantiate(B, [Object_, Object_]);
|
| + DartType B_num_num = instantiate(B, [num_, num_]);
|
| + DartType B_int_num = instantiate(B, [int_, num_]);
|
| + DartType B_dynamic_dynamic = instantiate(B, [dynamic_, dynamic_]);
|
| + DartType B_String_dynamic = instantiate(B, [String_, dynamic_]);
|
| +
|
| + expect(true, B_Object_Object, Object_);
|
| + expect(true, B_Object_Object, A_Object);
|
| + expect(false, B_Object_Object, A_num);
|
| + expect(false, B_Object_Object, A_int);
|
| + expect(false, B_Object_Object, A_String);
|
| + expect(true, B_Object_Object, A_dynamic);
|
| +
|
| + expect(true, B_num_num, Object_);
|
| + expect(true, B_num_num, A_Object);
|
| + expect(true, B_num_num, A_num);
|
| + expect(false, B_num_num, A_int);
|
| + expect(false, B_num_num, A_String);
|
| + expect(true, B_num_num, A_dynamic);
|
| +
|
| + expect(true, B_int_num, Object_);
|
| + expect(true, B_int_num, A_Object);
|
| + expect(true, B_int_num, A_num);
|
| + expect(true, B_int_num, A_int);
|
| + expect(false, B_int_num, A_String);
|
| + expect(true, B_int_num, A_dynamic);
|
| +
|
| + expect(true, B_dynamic_dynamic, Object_);
|
| + expect(true, B_dynamic_dynamic, A_Object);
|
| + expect(true, B_dynamic_dynamic, A_num);
|
| + expect(true, B_dynamic_dynamic, A_int);
|
| + expect(true, B_dynamic_dynamic, A_String);
|
| + expect(true, B_dynamic_dynamic, A_dynamic);
|
| +
|
| + expect(true, B_String_dynamic, Object_);
|
| + expect(true, B_String_dynamic, A_Object);
|
| + expect(false, B_String_dynamic, A_num);
|
| + expect(false, B_String_dynamic, A_int);
|
| + expect(true, B_String_dynamic, A_String);
|
| + expect(true, B_String_dynamic, A_dynamic);
|
| +
|
| + expect(true, B_Object_Object, B_Object_Object);
|
| + expect(true, B_num_num, B_Object_Object);
|
| + expect(true, B_int_num, B_Object_Object);
|
| + expect(true, B_dynamic_dynamic, B_Object_Object);
|
| + expect(true, B_String_dynamic, B_Object_Object);
|
| +
|
| + expect(false, B_Object_Object, B_num_num);
|
| + expect(true, B_num_num, B_num_num);
|
| + expect(true, B_int_num, B_num_num);
|
| + expect(true, B_dynamic_dynamic, B_num_num);
|
| + expect(false, B_String_dynamic, B_num_num);
|
| +
|
| + expect(false, B_Object_Object, B_int_num);
|
| + expect(false, B_num_num, B_int_num);
|
| + expect(true, B_int_num, B_int_num);
|
| + expect(true, B_dynamic_dynamic, B_int_num);
|
| + expect(false, B_String_dynamic, B_int_num);
|
| +
|
| + expect(true, B_Object_Object, B_dynamic_dynamic);
|
| + expect(true, B_num_num, B_dynamic_dynamic);
|
| + expect(true, B_int_num, B_dynamic_dynamic);
|
| + expect(true, B_dynamic_dynamic, B_dynamic_dynamic);
|
| + expect(true, B_String_dynamic, B_dynamic_dynamic);
|
| +
|
| + expect(false, B_Object_Object, B_String_dynamic);
|
| + expect(false, B_num_num, B_String_dynamic);
|
| + expect(false, B_int_num, B_String_dynamic);
|
| + expect(true, B_dynamic_dynamic, B_String_dynamic);
|
| + expect(true, B_String_dynamic, B_String_dynamic);
|
| +
|
| + DartType C_Object_Object = instantiate(C, [Object_, Object_]);
|
| + DartType C_num_num = instantiate(C, [num_, num_]);
|
| + DartType C_int_String = instantiate(C, [int_, String_]);
|
| + DartType C_dynamic_dynamic = instantiate(C, [dynamic_, dynamic_]);
|
| +
|
| + expect(true, C_Object_Object, B_Object_Object);
|
| + expect(false, C_Object_Object, B_num_num);
|
| + expect(false, C_Object_Object, B_int_num);
|
| + expect(true, C_Object_Object, B_dynamic_dynamic);
|
| + expect(false, C_Object_Object, B_String_dynamic);
|
| +
|
| + expect(true, C_num_num, B_Object_Object);
|
| + expect(true, C_num_num, B_num_num);
|
| + expect(false, C_num_num, B_int_num);
|
| + expect(true, C_num_num, B_dynamic_dynamic);
|
| + expect(false, C_num_num, B_String_dynamic);
|
| +
|
| + expect(true, C_int_String, B_Object_Object);
|
| + expect(false, C_int_String, B_num_num);
|
| + expect(false, C_int_String, B_int_num);
|
| + expect(true, C_int_String, B_dynamic_dynamic);
|
| + expect(true, C_int_String, B_String_dynamic);
|
| +
|
| + expect(true, C_dynamic_dynamic, B_Object_Object);
|
| + expect(true, C_dynamic_dynamic, B_num_num);
|
| + expect(true, C_dynamic_dynamic, B_int_num);
|
| + expect(true, C_dynamic_dynamic, B_dynamic_dynamic);
|
| + expect(true, C_dynamic_dynamic, B_String_dynamic);
|
| +
|
| + expect(false, C_int_String, A_int);
|
| + expect(true, C_int_String, A_String);
|
| + // TODO(johnniwinther): Inheritance with different type arguments is
|
| + // currently not supported by the implementation.
|
| + //expect(true, C_int_String, instantiate(A, [A_int]));
|
| + expect(false, C_int_String, instantiate(A, [A_String]));
|
| + }));
|
| }
|
|
|
| void testCallableSubtype() {
|
| -
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| class U {}
|
| class V extends U {}
|
| class W extends V {}
|
| @@ -239,31 +240,31 @@ void testCallableSubtype() {
|
| int m4(V v, U u);
|
| void m5(V v, int i);
|
| }
|
| - """);
|
| -
|
| - void expect(bool value, DartType T, DartType S) {
|
| - Expect.equals(value, env.isSubtype(T, S), '$T <: $S');
|
| - }
|
| -
|
| - ClassElement classA = env.getElement('A');
|
| - DartType A = classA.rawType;
|
| - DartType function = env['Function'];
|
| - DartType m1 = env.getMemberType(classA, 'm1');
|
| - DartType m2 = env.getMemberType(classA, 'm2');
|
| - DartType m3 = env.getMemberType(classA, 'm3');
|
| - DartType m4 = env.getMemberType(classA, 'm4');
|
| - DartType m5 = env.getMemberType(classA, 'm5');
|
| -
|
| - expect(true, A, function);
|
| - expect(true, A, m1);
|
| - expect(true, A, m2);
|
| - expect(false, A, m3);
|
| - expect(false, A, m4);
|
| - expect(true, A, m5);
|
| + """).then((env) {
|
| + void expect(bool value, DartType T, DartType S) {
|
| + Expect.equals(value, env.isSubtype(T, S), '$T <: $S');
|
| + }
|
| +
|
| + ClassElement classA = env.getElement('A');
|
| + DartType A = classA.rawType;
|
| + DartType function = env['Function'];
|
| + DartType m1 = env.getMemberType(classA, 'm1');
|
| + DartType m2 = env.getMemberType(classA, 'm2');
|
| + DartType m3 = env.getMemberType(classA, 'm3');
|
| + DartType m4 = env.getMemberType(classA, 'm4');
|
| + DartType m5 = env.getMemberType(classA, 'm5');
|
| +
|
| + expect(true, A, function);
|
| + expect(true, A, m1);
|
| + expect(true, A, m2);
|
| + expect(false, A, m3);
|
| + expect(false, A, m4);
|
| + expect(true, A, m5);
|
| + }));
|
| }
|
|
|
| testFunctionSubtyping() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| _() => null;
|
| void void_() {}
|
| void void_2() {}
|
| @@ -280,12 +281,11 @@ testFunctionSubtyping() {
|
| int int__int_int(int i1, int i2) => 0;
|
| void inline_void_(void f()) {}
|
| void inline_void__int(void f(int i)) {}
|
| - """);
|
| - functionSubtypingHelper(env);
|
| + """).then(functionSubtypingHelper));
|
| }
|
|
|
| testTypedefSubtyping() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| typedef _();
|
| typedef void void_();
|
| typedef void void_2();
|
| @@ -302,8 +302,7 @@ testTypedefSubtyping() {
|
| typedef int int__int_int(int i1, int i2);
|
| typedef void inline_void_(void f());
|
| typedef void inline_void__int(void f(int i));
|
| - """);
|
| - functionSubtypingHelper(env);
|
| + """).then(functionSubtypingHelper));
|
| }
|
|
|
| functionSubtypingHelper(TypeEnvironment env) {
|
| @@ -363,7 +362,7 @@ functionSubtypingHelper(TypeEnvironment env) {
|
| }
|
|
|
| testFunctionSubtypingOptional() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| void void_() {}
|
| void void__int(int i) {}
|
| void void___int([int i]) {}
|
| @@ -376,12 +375,11 @@ testFunctionSubtypingOptional() {
|
| void void___int_int([int i1, int i2]) {}
|
| void void___int_int_int([int i1, int i2, int i3]);
|
| void void___Object_int([Object o, int i]) {}
|
| - """);
|
| - functionSubtypingOptionalHelper(env);
|
| + """).then(functionSubtypingOptionalHelper));
|
| }
|
|
|
| testTypedefSubtypingOptional() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| typedef void void_();
|
| typedef void void__int(int i);
|
| typedef void void___int([int i]);
|
| @@ -394,8 +392,7 @@ testTypedefSubtypingOptional() {
|
| typedef void void___int_int([int i1, int i2]);
|
| typedef void void___int_int_int([int i1, int i2, int i3]);
|
| typedef void void___Object_int([Object o, int i]);
|
| - """);
|
| - functionSubtypingOptionalHelper(env);
|
| + """).then(functionSubtypingOptionalHelper));
|
| }
|
|
|
| functionSubtypingOptionalHelper(TypeEnvironment env) {
|
| @@ -443,7 +440,7 @@ functionSubtypingOptionalHelper(TypeEnvironment env) {
|
| }
|
|
|
| testFunctionSubtypingNamed() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| void void_() {}
|
| void void__int(int i) {}
|
| void void___a_int({int a}) {}
|
| @@ -458,12 +455,11 @@ testFunctionSubtypingNamed() {
|
| void void___a_int_c_int({int a, int c}) {}
|
| void void___b_int_c_int({int b, int c}) {}
|
| void void___c_int({int c}) {}
|
| - """);
|
| - functionSubtypingNamedHelper(env);
|
| + """).then(functionSubtypingNamedHelper));
|
| }
|
|
|
| testTypedefSubtypingNamed() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| typedef void void_();
|
| typedef void void__int(int i);
|
| typedef void void___a_int({int a});
|
| @@ -478,8 +474,7 @@ testTypedefSubtypingNamed() {
|
| typedef void void___a_int_c_int({int a, int c});
|
| typedef void void___b_int_c_int({int b, int c});
|
| typedef void void___c_int({int c});
|
| - """);
|
| - functionSubtypingNamedHelper(env);
|
| + """).then(functionSubtypingNamedHelper));
|
| }
|
|
|
| functionSubtypingNamedHelper(TypeEnvironment env) {
|
| @@ -521,7 +516,7 @@ functionSubtypingNamedHelper(TypeEnvironment env) {
|
| }
|
|
|
| void testTypeVariableSubtype() {
|
| - var env = new TypeEnvironment(r"""
|
| + asyncTest(() => TypeEnvironment.create(r"""
|
| class A<T> {}
|
| class B<T extends Object> {}
|
| class C<T extends num> {}
|
| @@ -532,207 +527,207 @@ void testTypeVariableSubtype() {
|
| class H<T extends S, S extends T> {}
|
| class I<T extends S, S extends U, U extends T> {}
|
| class J<T extends S, S extends U, U extends S> {}
|
| - """);
|
| -
|
| - void expect(bool value, DartType T, DartType S) {
|
| - Expect.equals(value, env.isSubtype(T, S), '$T <: $S');
|
| - }
|
| -
|
| - ClassElement A = env.getElement('A');
|
| - TypeVariableType A_T = A.thisType.typeArguments.head;
|
| - ClassElement B = env.getElement('B');
|
| - TypeVariableType B_T = B.thisType.typeArguments.head;
|
| - ClassElement C = env.getElement('C');
|
| - TypeVariableType C_T = C.thisType.typeArguments.head;
|
| - ClassElement D = env.getElement('D');
|
| - TypeVariableType D_T = D.thisType.typeArguments.head;
|
| - ClassElement E = env.getElement('E');
|
| - TypeVariableType E_T = E.thisType.typeArguments.head;
|
| - TypeVariableType E_S = E.thisType.typeArguments.tail.head;
|
| - ClassElement F = env.getElement('F');
|
| - TypeVariableType F_T = F.thisType.typeArguments.head;
|
| - TypeVariableType F_S = F.thisType.typeArguments.tail.head;
|
| - ClassElement G = env.getElement('G');
|
| - TypeVariableType G_T = G.thisType.typeArguments.head;
|
| - ClassElement H = env.getElement('H');
|
| - TypeVariableType H_T = H.thisType.typeArguments.head;
|
| - TypeVariableType H_S = H.thisType.typeArguments.tail.head;
|
| - ClassElement I = env.getElement('I');
|
| - TypeVariableType I_T = I.thisType.typeArguments.head;
|
| - TypeVariableType I_S = I.thisType.typeArguments.tail.head;
|
| - TypeVariableType I_U = I.thisType.typeArguments.tail.tail.head;
|
| - ClassElement J = env.getElement('J');
|
| - TypeVariableType J_T = J.thisType.typeArguments.head;
|
| - TypeVariableType J_S = J.thisType.typeArguments.tail.head;
|
| - TypeVariableType J_U = J.thisType.typeArguments.tail.tail.head;
|
| -
|
| - DartType Object_ = env['Object'];
|
| - DartType num_ = env['num'];
|
| - DartType int_ = env['int'];
|
| - DartType String_ = env['String'];
|
| - DartType dynamic_ = env['dynamic'];
|
| -
|
| - // class A<T> {}
|
| - expect(true, A_T, Object_);
|
| - expect(false, A_T, num_);
|
| - expect(false, A_T, int_);
|
| - expect(false, A_T, String_);
|
| - expect(true, A_T, dynamic_);
|
| - expect(true, A_T, A_T);
|
| - expect(false, A_T, B_T);
|
| -
|
| - // class B<T extends Object> {}
|
| - expect(true, B_T, Object_);
|
| - expect(false, B_T, num_);
|
| - expect(false, B_T, int_);
|
| - expect(false, B_T, String_);
|
| - expect(true, B_T, dynamic_);
|
| - expect(true, B_T, B_T);
|
| - expect(false, B_T, A_T);
|
| -
|
| - // class C<T extends num> {}
|
| - expect(true, C_T, Object_);
|
| - expect(true, C_T, num_);
|
| - expect(false, C_T, int_);
|
| - expect(false, C_T, String_);
|
| - expect(true, C_T, dynamic_);
|
| - expect(true, C_T, C_T);
|
| - expect(false, C_T, A_T);
|
| -
|
| - // class D<T extends int> {}
|
| - expect(true, D_T, Object_);
|
| - expect(true, D_T, num_);
|
| - expect(true, D_T, int_);
|
| - expect(false, D_T, String_);
|
| - expect(true, D_T, dynamic_);
|
| - expect(true, D_T, D_T);
|
| - expect(false, D_T, A_T);
|
| -
|
| - // class E<T extends S, S extends num> {}
|
| - expect(true, E_T, Object_);
|
| - expect(true, E_T, num_);
|
| - expect(false, E_T, int_);
|
| - expect(false, E_T, String_);
|
| - expect(true, E_T, dynamic_);
|
| - expect(true, E_T, E_T);
|
| - expect(true, E_T, E_S);
|
| - expect(false, E_T, A_T);
|
| -
|
| - expect(true, E_S, Object_);
|
| - expect(true, E_S, num_);
|
| - expect(false, E_S, int_);
|
| - expect(false, E_S, String_);
|
| - expect(true, E_S, dynamic_);
|
| - expect(false, E_S, E_T);
|
| - expect(true, E_S, E_S);
|
| - expect(false, E_S, A_T);
|
| -
|
| - // class F<T extends num, S extends T> {}
|
| - expect(true, F_T, Object_);
|
| - expect(true, F_T, num_);
|
| - expect(false, F_T, int_);
|
| - expect(false, F_T, String_);
|
| - expect(true, F_T, dynamic_);
|
| - expect(false, F_T, F_S);
|
| - expect(true, F_T, F_T);
|
| - expect(false, F_T, A_T);
|
| -
|
| - expect(true, F_S, Object_);
|
| - expect(true, F_S, num_);
|
| - expect(false, F_S, int_);
|
| - expect(false, F_S, String_);
|
| - expect(true, F_S, dynamic_);
|
| - expect(true, F_S, F_S);
|
| - expect(true, F_S, F_T);
|
| - expect(false, F_S, A_T);
|
| -
|
| - // class G<T extends T> {}
|
| - expect(true, G_T, Object_);
|
| - expect(false, G_T, num_);
|
| - expect(false, G_T, int_);
|
| - expect(false, G_T, String_);
|
| - expect(true, G_T, dynamic_);
|
| - expect(true, G_T, G_T);
|
| - expect(false, G_T, A_T);
|
| -
|
| - // class H<T extends S, S extends T> {}
|
| - expect(true, H_T, Object_);
|
| - expect(false, H_T, num_);
|
| - expect(false, H_T, int_);
|
| - expect(false, H_T, String_);
|
| - expect(true, H_T, dynamic_);
|
| - expect(true, H_T, H_T);
|
| - expect(true, H_T, H_S);
|
| - expect(false, H_T, A_T);
|
| -
|
| - expect(true, H_S, Object_);
|
| - expect(false, H_S, num_);
|
| - expect(false, H_S, int_);
|
| - expect(false, H_S, String_);
|
| - expect(true, H_S, dynamic_);
|
| - expect(true, H_S, H_T);
|
| - expect(true, H_S, H_S);
|
| - expect(false, H_S, A_T);
|
| -
|
| - // class I<T extends S, S extends U, U extends T> {}
|
| - expect(true, I_T, Object_);
|
| - expect(false, I_T, num_);
|
| - expect(false, I_T, int_);
|
| - expect(false, I_T, String_);
|
| - expect(true, I_T, dynamic_);
|
| - expect(true, I_T, I_T);
|
| - expect(true, I_T, I_S);
|
| - expect(true, I_T, I_U);
|
| - expect(false, I_T, A_T);
|
| -
|
| - expect(true, I_S, Object_);
|
| - expect(false, I_S, num_);
|
| - expect(false, I_S, int_);
|
| - expect(false, I_S, String_);
|
| - expect(true, I_S, dynamic_);
|
| - expect(true, I_S, I_T);
|
| - expect(true, I_S, I_S);
|
| - expect(true, I_S, I_U);
|
| - expect(false, I_S, A_T);
|
| -
|
| - expect(true, I_U, Object_);
|
| - expect(false, I_U, num_);
|
| - expect(false, I_U, int_);
|
| - expect(false, I_U, String_);
|
| - expect(true, I_U, dynamic_);
|
| - expect(true, I_U, I_T);
|
| - expect(true, I_U, I_S);
|
| - expect(true, I_U, I_U);
|
| - expect(false, I_U, A_T);
|
| -
|
| - // class J<T extends S, S extends U, U extends S> {}
|
| - expect(true, J_T, Object_);
|
| - expect(false, J_T, num_);
|
| - expect(false, J_T, int_);
|
| - expect(false, J_T, String_);
|
| - expect(true, J_T, dynamic_);
|
| - expect(true, J_T, J_T);
|
| - expect(true, J_T, J_S);
|
| - expect(true, J_T, J_U);
|
| - expect(false, J_T, A_T);
|
| -
|
| - expect(true, J_S, Object_);
|
| - expect(false, J_S, num_);
|
| - expect(false, J_S, int_);
|
| - expect(false, J_S, String_);
|
| - expect(true, J_S, dynamic_);
|
| - expect(false, J_S, J_T);
|
| - expect(true, J_S, J_S);
|
| - expect(true, J_S, J_U);
|
| - expect(false, J_S, A_T);
|
| -
|
| - expect(true, J_U, Object_);
|
| - expect(false, J_U, num_);
|
| - expect(false, J_U, int_);
|
| - expect(false, J_U, String_);
|
| - expect(true, J_U, dynamic_);
|
| - expect(false, J_U, J_T);
|
| - expect(true, J_U, J_S);
|
| - expect(true, J_U, J_U);
|
| - expect(false, J_U, A_T);
|
| + """).then((env) {
|
| + void expect(bool value, DartType T, DartType S) {
|
| + Expect.equals(value, env.isSubtype(T, S), '$T <: $S');
|
| + }
|
| +
|
| + ClassElement A = env.getElement('A');
|
| + TypeVariableType A_T = A.thisType.typeArguments.head;
|
| + ClassElement B = env.getElement('B');
|
| + TypeVariableType B_T = B.thisType.typeArguments.head;
|
| + ClassElement C = env.getElement('C');
|
| + TypeVariableType C_T = C.thisType.typeArguments.head;
|
| + ClassElement D = env.getElement('D');
|
| + TypeVariableType D_T = D.thisType.typeArguments.head;
|
| + ClassElement E = env.getElement('E');
|
| + TypeVariableType E_T = E.thisType.typeArguments.head;
|
| + TypeVariableType E_S = E.thisType.typeArguments.tail.head;
|
| + ClassElement F = env.getElement('F');
|
| + TypeVariableType F_T = F.thisType.typeArguments.head;
|
| + TypeVariableType F_S = F.thisType.typeArguments.tail.head;
|
| + ClassElement G = env.getElement('G');
|
| + TypeVariableType G_T = G.thisType.typeArguments.head;
|
| + ClassElement H = env.getElement('H');
|
| + TypeVariableType H_T = H.thisType.typeArguments.head;
|
| + TypeVariableType H_S = H.thisType.typeArguments.tail.head;
|
| + ClassElement I = env.getElement('I');
|
| + TypeVariableType I_T = I.thisType.typeArguments.head;
|
| + TypeVariableType I_S = I.thisType.typeArguments.tail.head;
|
| + TypeVariableType I_U = I.thisType.typeArguments.tail.tail.head;
|
| + ClassElement J = env.getElement('J');
|
| + TypeVariableType J_T = J.thisType.typeArguments.head;
|
| + TypeVariableType J_S = J.thisType.typeArguments.tail.head;
|
| + TypeVariableType J_U = J.thisType.typeArguments.tail.tail.head;
|
| +
|
| + DartType Object_ = env['Object'];
|
| + DartType num_ = env['num'];
|
| + DartType int_ = env['int'];
|
| + DartType String_ = env['String'];
|
| + DartType dynamic_ = env['dynamic'];
|
| +
|
| + // class A<T> {}
|
| + expect(true, A_T, Object_);
|
| + expect(false, A_T, num_);
|
| + expect(false, A_T, int_);
|
| + expect(false, A_T, String_);
|
| + expect(true, A_T, dynamic_);
|
| + expect(true, A_T, A_T);
|
| + expect(false, A_T, B_T);
|
| +
|
| + // class B<T extends Object> {}
|
| + expect(true, B_T, Object_);
|
| + expect(false, B_T, num_);
|
| + expect(false, B_T, int_);
|
| + expect(false, B_T, String_);
|
| + expect(true, B_T, dynamic_);
|
| + expect(true, B_T, B_T);
|
| + expect(false, B_T, A_T);
|
| +
|
| + // class C<T extends num> {}
|
| + expect(true, C_T, Object_);
|
| + expect(true, C_T, num_);
|
| + expect(false, C_T, int_);
|
| + expect(false, C_T, String_);
|
| + expect(true, C_T, dynamic_);
|
| + expect(true, C_T, C_T);
|
| + expect(false, C_T, A_T);
|
| +
|
| + // class D<T extends int> {}
|
| + expect(true, D_T, Object_);
|
| + expect(true, D_T, num_);
|
| + expect(true, D_T, int_);
|
| + expect(false, D_T, String_);
|
| + expect(true, D_T, dynamic_);
|
| + expect(true, D_T, D_T);
|
| + expect(false, D_T, A_T);
|
| +
|
| + // class E<T extends S, S extends num> {}
|
| + expect(true, E_T, Object_);
|
| + expect(true, E_T, num_);
|
| + expect(false, E_T, int_);
|
| + expect(false, E_T, String_);
|
| + expect(true, E_T, dynamic_);
|
| + expect(true, E_T, E_T);
|
| + expect(true, E_T, E_S);
|
| + expect(false, E_T, A_T);
|
| +
|
| + expect(true, E_S, Object_);
|
| + expect(true, E_S, num_);
|
| + expect(false, E_S, int_);
|
| + expect(false, E_S, String_);
|
| + expect(true, E_S, dynamic_);
|
| + expect(false, E_S, E_T);
|
| + expect(true, E_S, E_S);
|
| + expect(false, E_S, A_T);
|
| +
|
| + // class F<T extends num, S extends T> {}
|
| + expect(true, F_T, Object_);
|
| + expect(true, F_T, num_);
|
| + expect(false, F_T, int_);
|
| + expect(false, F_T, String_);
|
| + expect(true, F_T, dynamic_);
|
| + expect(false, F_T, F_S);
|
| + expect(true, F_T, F_T);
|
| + expect(false, F_T, A_T);
|
| +
|
| + expect(true, F_S, Object_);
|
| + expect(true, F_S, num_);
|
| + expect(false, F_S, int_);
|
| + expect(false, F_S, String_);
|
| + expect(true, F_S, dynamic_);
|
| + expect(true, F_S, F_S);
|
| + expect(true, F_S, F_T);
|
| + expect(false, F_S, A_T);
|
| +
|
| + // class G<T extends T> {}
|
| + expect(true, G_T, Object_);
|
| + expect(false, G_T, num_);
|
| + expect(false, G_T, int_);
|
| + expect(false, G_T, String_);
|
| + expect(true, G_T, dynamic_);
|
| + expect(true, G_T, G_T);
|
| + expect(false, G_T, A_T);
|
| +
|
| + // class H<T extends S, S extends T> {}
|
| + expect(true, H_T, Object_);
|
| + expect(false, H_T, num_);
|
| + expect(false, H_T, int_);
|
| + expect(false, H_T, String_);
|
| + expect(true, H_T, dynamic_);
|
| + expect(true, H_T, H_T);
|
| + expect(true, H_T, H_S);
|
| + expect(false, H_T, A_T);
|
| +
|
| + expect(true, H_S, Object_);
|
| + expect(false, H_S, num_);
|
| + expect(false, H_S, int_);
|
| + expect(false, H_S, String_);
|
| + expect(true, H_S, dynamic_);
|
| + expect(true, H_S, H_T);
|
| + expect(true, H_S, H_S);
|
| + expect(false, H_S, A_T);
|
| +
|
| + // class I<T extends S, S extends U, U extends T> {}
|
| + expect(true, I_T, Object_);
|
| + expect(false, I_T, num_);
|
| + expect(false, I_T, int_);
|
| + expect(false, I_T, String_);
|
| + expect(true, I_T, dynamic_);
|
| + expect(true, I_T, I_T);
|
| + expect(true, I_T, I_S);
|
| + expect(true, I_T, I_U);
|
| + expect(false, I_T, A_T);
|
| +
|
| + expect(true, I_S, Object_);
|
| + expect(false, I_S, num_);
|
| + expect(false, I_S, int_);
|
| + expect(false, I_S, String_);
|
| + expect(true, I_S, dynamic_);
|
| + expect(true, I_S, I_T);
|
| + expect(true, I_S, I_S);
|
| + expect(true, I_S, I_U);
|
| + expect(false, I_S, A_T);
|
| +
|
| + expect(true, I_U, Object_);
|
| + expect(false, I_U, num_);
|
| + expect(false, I_U, int_);
|
| + expect(false, I_U, String_);
|
| + expect(true, I_U, dynamic_);
|
| + expect(true, I_U, I_T);
|
| + expect(true, I_U, I_S);
|
| + expect(true, I_U, I_U);
|
| + expect(false, I_U, A_T);
|
| +
|
| + // class J<T extends S, S extends U, U extends S> {}
|
| + expect(true, J_T, Object_);
|
| + expect(false, J_T, num_);
|
| + expect(false, J_T, int_);
|
| + expect(false, J_T, String_);
|
| + expect(true, J_T, dynamic_);
|
| + expect(true, J_T, J_T);
|
| + expect(true, J_T, J_S);
|
| + expect(true, J_T, J_U);
|
| + expect(false, J_T, A_T);
|
| +
|
| + expect(true, J_S, Object_);
|
| + expect(false, J_S, num_);
|
| + expect(false, J_S, int_);
|
| + expect(false, J_S, String_);
|
| + expect(true, J_S, dynamic_);
|
| + expect(false, J_S, J_T);
|
| + expect(true, J_S, J_S);
|
| + expect(true, J_S, J_U);
|
| + expect(false, J_S, A_T);
|
| +
|
| + expect(true, J_U, Object_);
|
| + expect(false, J_U, num_);
|
| + expect(false, J_U, int_);
|
| + expect(false, J_U, String_);
|
| + expect(true, J_U, dynamic_);
|
| + expect(false, J_U, J_T);
|
| + expect(true, J_U, J_S);
|
| + expect(true, J_U, J_U);
|
| + expect(false, J_U, A_T);
|
| + }));
|
| }
|
|
|