Index: pkg/analyzer/test/generated/type_system_test.dart |
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart |
index e4501be0e6e27cb4dc6dddddce0792b8749b6af3..f578812340673f90f4f3f1b6bb6dcfd2d76e3f83 100644 |
--- a/pkg/analyzer/test/generated/type_system_test.dart |
+++ b/pkg/analyzer/test/generated/type_system_test.dart |
@@ -66,7 +66,8 @@ class StrongAssignabilityTest { |
ElementFactory.methodElement("call", objectType, <DartType>[intType]); |
classBottom.methods = <MethodElement>[methodBottom]; |
- DartType top = TypeBuilder.functionType(<DartType>[intType], objectType); |
+ DartType top = |
+ TypeBuilder.function(required: <DartType>[intType], result: objectType); |
InterfaceType bottom = classBottom.type; |
_checkIsStrictAssignableTo(bottom, top); |
@@ -117,14 +118,14 @@ class StrongAssignabilityTest { |
} |
void test_isAssignableTo_fuzzy_arrows() { |
- FunctionType top = |
- TypeBuilder.functionType(<DartType>[dynamicType], objectType); |
- FunctionType left = |
- TypeBuilder.functionType(<DartType>[objectType], objectType); |
- FunctionType right = |
- TypeBuilder.functionType(<DartType>[dynamicType], bottomType); |
- FunctionType bottom = |
- TypeBuilder.functionType(<DartType>[objectType], bottomType); |
+ FunctionType top = TypeBuilder.function( |
+ required: <DartType>[dynamicType], result: objectType); |
+ FunctionType left = TypeBuilder.function( |
+ required: <DartType>[objectType], result: objectType); |
+ FunctionType right = TypeBuilder.function( |
+ required: <DartType>[dynamicType], result: bottomType); |
+ FunctionType bottom = TypeBuilder.function( |
+ required: <DartType>[objectType], result: bottomType); |
_checkCrossLattice(top, left, right, bottom); |
} |
@@ -166,23 +167,36 @@ class StrongAssignabilityTest { |
} |
void test_isAssignableTo_named_optional() { |
- DartType r = TypeBuilder.functionType(<DartType>[intType], intType); |
- DartType o = TypeBuilder.functionType(<DartType>[], intType, |
- optional: <DartType>[intType]); |
- DartType n = TypeBuilder.functionType(<DartType>[], intType, |
- named: <String, DartType>{'x': intType}); |
- DartType rr = |
- TypeBuilder.functionType(<DartType>[intType, intType], intType); |
- DartType ro = TypeBuilder.functionType(<DartType>[intType], intType, |
- optional: <DartType>[intType]); |
- DartType rn = TypeBuilder.functionType(<DartType>[intType], intType, |
- named: <String, DartType>{'x': intType}); |
- DartType oo = TypeBuilder.functionType(<DartType>[], intType, |
- optional: <DartType>[intType, intType]); |
- DartType nn = TypeBuilder.functionType(<DartType>[], intType, |
- named: <String, DartType>{'x': intType, 'y': intType}); |
- DartType nnn = TypeBuilder.functionType(<DartType>[], intType, |
- named: <String, DartType>{'x': intType, 'y': intType, 'z': intType}); |
+ DartType r = |
+ TypeBuilder.function(required: <DartType>[intType], result: intType); |
+ DartType o = TypeBuilder.function( |
+ required: <DartType>[], optional: <DartType>[intType], result: intType); |
+ DartType n = TypeBuilder.function( |
+ required: <DartType>[], |
+ named: <String, DartType>{'x': intType}, |
+ result: intType); |
+ DartType rr = TypeBuilder.function( |
+ required: <DartType>[intType, intType], result: intType); |
+ DartType ro = TypeBuilder.function( |
+ required: <DartType>[intType], |
+ optional: <DartType>[intType], |
+ result: intType); |
+ DartType rn = TypeBuilder.function( |
+ required: <DartType>[intType], |
+ named: <String, DartType>{'x': intType}, |
+ result: intType); |
+ DartType oo = TypeBuilder.function( |
+ required: <DartType>[], |
+ optional: <DartType>[intType, intType], |
+ result: intType); |
+ DartType nn = TypeBuilder.function( |
+ required: <DartType>[], |
+ named: <String, DartType>{'x': intType, 'y': intType}, |
+ result: intType); |
+ DartType nnn = TypeBuilder.function( |
+ required: <DartType>[], |
+ named: <String, DartType>{'x': intType, 'y': intType, 'z': intType}, |
+ result: intType); |
_checkGroups(r, |
interassignable: [r, o, ro, rn, oo], unrelated: [n, rr, nn, nnn]); |
@@ -220,20 +234,22 @@ class StrongAssignabilityTest { |
void test_isAssignableTo_simple_function() { |
FunctionType top = |
- TypeBuilder.functionType(<DartType>[intType], objectType); |
- FunctionType left = TypeBuilder.functionType(<DartType>[intType], intType); |
- FunctionType right = |
- TypeBuilder.functionType(<DartType>[objectType], objectType); |
+ TypeBuilder.function(required: <DartType>[intType], result: objectType); |
+ FunctionType left = |
+ TypeBuilder.function(required: <DartType>[intType], result: intType); |
+ FunctionType right = TypeBuilder.function( |
+ required: <DartType>[objectType], result: objectType); |
FunctionType bottom = |
- TypeBuilder.functionType(<DartType>[objectType], intType); |
+ TypeBuilder.function(required: <DartType>[objectType], result: intType); |
_checkCrossLattice(top, left, right, bottom); |
} |
void test_isAssignableTo_void_functions() { |
- FunctionType top = TypeBuilder.functionType(<DartType>[intType], voidType); |
+ FunctionType top = |
+ TypeBuilder.function(required: <DartType>[intType], result: voidType); |
FunctionType bottom = |
- TypeBuilder.functionType(<DartType>[objectType], intType); |
+ TypeBuilder.function(required: <DartType>[objectType], result: intType); |
_checkEquivalent(bottom, top); |
} |
@@ -320,9 +336,11 @@ class StrongGenericFunctionInferenceTest { |
void test_boundedByAnotherTypeParameter() { |
// <TFrom, TTo extends Iterable<TFrom>>(TFrom) -> TTo |
- var tFrom = _typeParameter('TFrom'); |
- var tTo = _typeParameter('TTo', iterableType.substitute4([tFrom])); |
- var cast = _functionType([tFrom, tTo], [tFrom], tTo); |
+ var tFrom = TypeBuilder.variable('TFrom'); |
+ var tTo = |
+ TypeBuilder.variable('TTo', bound: iterableType.substitute4([tFrom])); |
+ var cast = TypeBuilder.function( |
+ types: [tFrom, tTo], required: [tFrom], result: tTo); |
expect(_inferCall(cast, [stringType]), [ |
stringType, |
iterableType.substitute4([stringType]) |
@@ -340,11 +358,11 @@ class StrongGenericFunctionInferenceTest { |
foo.supertype = clonable.type.substitute4([foo.type]); |
// <S extends Clonable<S>> |
- var s = _typeParameter('S'); |
+ var s = TypeBuilder.variable('S'); |
(s.element as TypeParameterElementImpl).bound = |
clonable.type.substitute4([s]); |
// (S, S) -> S |
- var clone = _functionType([s], [s, s], s); |
+ var clone = TypeBuilder.function(types: [s], required: [s, s], result: s); |
expect(_inferCall(clone, [foo.type, foo.type]), [foo.type]); |
// Something invalid... |
@@ -355,141 +373,133 @@ class StrongGenericFunctionInferenceTest { |
void test_genericCastFunction() { |
// <TFrom, TTo>(TFrom) -> TTo |
- var tFrom = _typeParameter('TFrom'); |
- var tTo = _typeParameter('TTo'); |
- var cast = _functionType([tFrom, tTo], [tFrom], tTo); |
+ var tFrom = TypeBuilder.variable('TFrom'); |
+ var tTo = TypeBuilder.variable('TTo'); |
+ var cast = TypeBuilder.function( |
+ types: [tFrom, tTo], required: [tFrom], result: tTo); |
expect(_inferCall(cast, [intType]), [intType, dynamicType]); |
} |
void test_genericCastFunctionWithUpperBound() { |
// <TFrom, TTo extends TFrom>(TFrom) -> TTo |
- var tFrom = _typeParameter('TFrom'); |
- var tTo = _typeParameter('TTo', tFrom); |
- var cast = _functionType([tFrom, tTo], [tFrom], tTo); |
+ var tFrom = TypeBuilder.variable('TFrom'); |
+ var tTo = TypeBuilder.variable('TTo', bound: tFrom); |
+ var cast = TypeBuilder.function( |
+ types: [tFrom, tTo], required: [tFrom], result: tTo); |
expect(_inferCall(cast, [intType]), [intType, intType]); |
} |
void test_parametersToFunctionParam() { |
// <T>(f(T t)) -> T |
- var t = _typeParameter('T'); |
- var cast = _functionType([ |
+ var t = TypeBuilder.variable('T'); |
+ var cast = TypeBuilder.function(types: [ |
t |
- ], [ |
- _functionType([], [t], dynamicType) |
- ], t); |
+ ], required: [ |
+ TypeBuilder.function(required: [t], result: dynamicType) |
+ ], result: t); |
expect( |
_inferCall(cast, [ |
- _functionType([], [numType], dynamicType) |
+ TypeBuilder.function(required: [numType], result: dynamicType) |
]), |
[numType]); |
} |
void test_parametersUseLeastUpperBound() { |
// <T>(T x, T y) -> T |
- var t = _typeParameter('T'); |
- var cast = _functionType([t], [t, t], t); |
+ var t = TypeBuilder.variable('T'); |
+ var cast = TypeBuilder.function(types: [t], required: [t, t], result: t); |
expect(_inferCall(cast, [intType, doubleType]), [numType]); |
} |
void test_parameterTypeUsesUpperBound() { |
// <T extends num>(T) -> dynamic |
- var t = _typeParameter('T', numType); |
- var f = _functionType([t], [t], dynamicType); |
+ var t = TypeBuilder.variable('T', bound: numType); |
+ var f = |
+ TypeBuilder.function(types: [t], required: [t], result: dynamicType); |
expect(_inferCall(f, [intType]), [intType]); |
} |
void test_returnFunctionWithGenericParameter() { |
// <T>(T -> T) -> (T -> void) |
- var t = _typeParameter('T'); |
- var f = _functionType([ |
+ var t = TypeBuilder.variable('T'); |
+ var f = TypeBuilder.function(types: [ |
t |
- ], [ |
- _functionType([], [t], t) |
- ], _functionType([], [t], voidType)); |
+ ], required: [ |
+ TypeBuilder.function(required: [t], result: t) |
+ ], result: TypeBuilder.function(required: [t], result: voidType)); |
expect( |
_inferCall(f, [ |
- _functionType([], [numType], intType) |
+ TypeBuilder.function(required: [numType], result: intType) |
]), |
[numType]); |
} |
void test_returnFunctionWithGenericParameterAndReturn() { |
// <T>(T -> T) -> (T -> T) |
- var t = _typeParameter('T'); |
- var f = _functionType([ |
+ var t = TypeBuilder.variable('T'); |
+ var f = TypeBuilder.function(types: [ |
t |
- ], [ |
- _functionType([], [t], t) |
- ], _functionType([], [t], t)); |
+ ], required: [ |
+ TypeBuilder.function(required: [t], result: t) |
+ ], result: TypeBuilder.function(required: [t], result: t)); |
expect( |
_inferCall(f, [ |
- _functionType([], [numType], intType) |
+ TypeBuilder.function(required: [numType], result: intType) |
]), |
[numType]); |
} |
void test_returnFunctionWithGenericReturn() { |
// <T>(T -> T) -> (() -> T) |
- var t = _typeParameter('T'); |
- var f = _functionType([ |
+ var t = TypeBuilder.variable('T'); |
+ var f = TypeBuilder.function(types: [ |
t |
- ], [ |
- _functionType([], [t], t) |
- ], _functionType([], [], t)); |
+ ], required: [ |
+ TypeBuilder.function(required: [t], result: t) |
+ ], result: TypeBuilder.function(required: [], result: t)); |
expect( |
_inferCall(f, [ |
- _functionType([], [numType], intType) |
+ TypeBuilder.function(required: [numType], result: intType) |
]), |
[intType]); |
} |
void test_unifyParametersToFunctionParam() { |
// <T>(f(T t), g(T t)) -> T |
- var t = _typeParameter('T'); |
- var cast = _functionType([ |
+ var t = TypeBuilder.variable('T'); |
+ var cast = TypeBuilder.function(types: [ |
t |
- ], [ |
- _functionType([], [t], dynamicType), |
- _functionType([], [t], dynamicType) |
- ], t); |
+ ], required: [ |
+ TypeBuilder.function(required: [t], result: dynamicType), |
+ TypeBuilder.function(required: [t], result: dynamicType) |
+ ], result: t); |
expect( |
_inferCall(cast, [ |
- _functionType([], [intType], dynamicType), |
- _functionType([], [doubleType], dynamicType) |
+ TypeBuilder.function(required: [intType], result: dynamicType), |
+ TypeBuilder.function(required: [doubleType], result: dynamicType) |
]), |
[dynamicType]); |
} |
void test_unusedReturnTypeIsDynamic() { |
// <T>() -> T |
- var t = _typeParameter('T'); |
- var f = _functionType([t], [], t); |
+ var t = TypeBuilder.variable('T'); |
+ var f = TypeBuilder.function(types: [t], required: [], result: t); |
expect(_inferCall(f, []), [dynamicType]); |
} |
void test_unusedReturnTypeWithUpperBound() { |
// <T extends num>() -> T |
- var t = _typeParameter('T', numType); |
- var f = _functionType([t], [], t); |
+ var t = TypeBuilder.variable('T', bound: numType); |
+ var f = TypeBuilder.function(types: [t], required: [], result: t); |
expect(_inferCall(f, []), [numType]); |
} |
- FunctionTypeImpl _functionType( |
- List<DartType> typeParams, List<DartType> params, DartType result) { |
- FunctionElementImpl f = ElementFactory.functionElement8(params, result); |
- f.typeParameters = |
- new List<TypeParameterElement>.from(typeParams.map((t) => t.element)); |
- return f.type = new FunctionTypeImpl(f); |
- } |
- |
List<DartType> _inferCall(FunctionTypeImpl ft, List<DartType> arguments) { |
FunctionType inferred = typeSystem.inferCallFromArguments( |
typeProvider, ft, ft.parameters.map((p) => p.type).toList(), arguments); |
return inferred.typeArguments; |
} |
- |
- TypeParameterType _typeParameter(String name, [DartType bound]) => |
- ElementFactory.typeParameterWithType(name, bound).type; |
} |
@reflectiveTest |
@@ -513,7 +523,7 @@ class StrongSubtypingTest { |
typeSystem = new StrongTypeSystemImpl(); |
} |
- void test_isSubtypeOf_bottom_isBottom() { |
+ void test_bottom_isBottom() { |
DartType interfaceType = ElementFactory.classElement2('A', []).type; |
List<DartType> equivalents = <DartType>[bottomType]; |
List<DartType> supertypes = <DartType>[ |
@@ -529,19 +539,20 @@ class StrongSubtypingTest { |
_checkGroups(bottomType, equivalents: equivalents, supertypes: supertypes); |
} |
- void test_isSubtypeOf_call_method() { |
+ void test_call_method() { |
ClassElementImpl classBottom = ElementFactory.classElement2("Bottom"); |
MethodElement methodBottom = |
ElementFactory.methodElement("call", objectType, <DartType>[intType]); |
classBottom.methods = <MethodElement>[methodBottom]; |
- DartType top = TypeBuilder.functionType(<DartType>[intType], objectType); |
+ DartType top = |
+ TypeBuilder.function(required: <DartType>[intType], result: objectType); |
InterfaceType bottom = classBottom.type; |
_checkIsStrictSubtypeOf(bottom, top); |
} |
- void test_isSubtypeOf_classes() { |
+ void test_classes() { |
ClassElement classTop = ElementFactory.classElement2("A"); |
ClassElement classLeft = ElementFactory.classElement("B", classTop.type); |
ClassElement classRight = ElementFactory.classElement("C", classTop.type); |
@@ -555,7 +566,7 @@ class StrongSubtypingTest { |
_checkLattice(top, left, right, bottom); |
} |
- void test_isSubtypeOf_double() { |
+ void test_double() { |
List<DartType> equivalents = <DartType>[doubleType]; |
List<DartType> supertypes = <DartType>[numType]; |
List<DartType> unrelated = <DartType>[intType]; |
@@ -563,7 +574,7 @@ class StrongSubtypingTest { |
equivalents: equivalents, supertypes: supertypes, unrelated: unrelated); |
} |
- void test_isSubtypeOf_dynamic_isTop() { |
+ void test_dynamic_isTop() { |
DartType interfaceType = ElementFactory.classElement2('A', []).type; |
List<DartType> equivalents = <DartType>[dynamicType, objectType]; |
List<DartType> subtypes = <DartType>[ |
@@ -578,20 +589,98 @@ class StrongSubtypingTest { |
_checkGroups(dynamicType, equivalents: equivalents, subtypes: subtypes); |
} |
- void test_isSubtypeOf_fuzzy_arrows() { |
- FunctionType top = |
- TypeBuilder.functionType(<DartType>[dynamicType], objectType); |
- FunctionType left = |
- TypeBuilder.functionType(<DartType>[objectType], objectType); |
- FunctionType right = |
- TypeBuilder.functionType(<DartType>[dynamicType], bottomType); |
- FunctionType bottom = |
- TypeBuilder.functionType(<DartType>[objectType], bottomType); |
+ void test_fuzzy_arrows() { |
+ FunctionType top = TypeBuilder.function( |
+ required: <DartType>[dynamicType], result: objectType); |
+ FunctionType left = TypeBuilder.function( |
+ required: <DartType>[objectType], result: objectType); |
+ FunctionType right = TypeBuilder.function( |
+ required: <DartType>[dynamicType], result: bottomType); |
+ FunctionType bottom = TypeBuilder.function( |
+ required: <DartType>[objectType], result: bottomType); |
_checkLattice(top, left, right, bottom); |
} |
- void test_isSubtypeOf_generics() { |
+ void test_genericFunction_generic_monomorphic() { |
+ DartType s = TypeBuilder.variable("S"); |
+ DartType t = TypeBuilder.variable("T", bound: s); |
+ DartType u = TypeBuilder.variable("U", bound: intType); |
+ DartType v = TypeBuilder.variable("V", bound: u); |
+ |
+ _checkIsStrictSubtypeOf( |
+ TypeBuilder.function(types: [s, t], required: [s], result: t), |
+ TypeBuilder.function(required: [dynamicType], result: dynamicType)); |
+ |
+ _checkIsNotSubtypeOf( |
+ TypeBuilder.function(types: [u, v], required: [u], result: v), |
+ TypeBuilder.function(required: [objectType], result: objectType)); |
+ |
+ _checkIsStrictSubtypeOf( |
+ TypeBuilder.function(types: [u, v], required: [u], result: v), |
+ TypeBuilder.function(required: [intType], result: intType)); |
+ } |
+ |
+ void test_genericFunction_simple() { |
+ DartType s = TypeBuilder.variable("S"); |
+ DartType t = TypeBuilder.variable("T"); |
+ |
+ _checkEquivalent( |
+ TypeBuilder.function(types: [t]), TypeBuilder.function(types: [s])); |
+ |
+ _checkEquivalent(TypeBuilder.function(types: [t], required: [t], result: t), |
+ TypeBuilder.function(types: [s], required: [s], result: s)); |
+ } |
+ |
+ void test_genericFunction_simple_bounded() { |
+ DartType s = TypeBuilder.variable("S"); |
+ DartType t = TypeBuilder.variable("T", bound: s); |
+ DartType u = TypeBuilder.variable("U"); |
+ DartType v = TypeBuilder.variable("V", bound: u); |
+ |
+ _checkEquivalent(TypeBuilder.function(types: [s, t]), |
+ TypeBuilder.function(types: [u, v])); |
+ |
+ _checkEquivalent( |
+ TypeBuilder.function(types: [s, t], required: [s], result: t), |
+ TypeBuilder.function(types: [u, v], required: [u], result: v)); |
+ |
+ { |
+ DartType top = |
+ TypeBuilder.function(types: [s, t], required: [t], result: s); |
+ DartType left = |
+ TypeBuilder.function(types: [u, v], required: [u], result: u); |
+ DartType right = |
+ TypeBuilder.function(types: [u, v], required: [v], result: v); |
+ DartType bottom = |
+ TypeBuilder.function(types: [s, t], required: [s], result: t); |
+ _checkLattice(top, left, right, bottom); |
+ } |
+ } |
+ |
+ void test_genericFunction_simple_fBounded() { |
+ ClassElementImpl AClass = ElementFactory.classElement2('A', ["Q"]); |
+ InterfaceType AType = AClass.type; |
+ ClassElementImpl BClass = ElementFactory.classElement2('B', ["R"]); |
+ BClass.supertype = AType.substitute4([BClass.typeParameters[0].type]); |
+ InterfaceType BType = BClass.type; |
+ |
+ DartType s = TypeBuilder.variable("S"); |
+ (s.element as TypeParameterElementImpl).bound = AType.substitute4([s]); |
+ DartType t = TypeBuilder.variable("T", bound: s); |
+ DartType u = TypeBuilder.variable("U"); |
+ (u.element as TypeParameterElementImpl).bound = BType.substitute4([u]); |
+ DartType v = TypeBuilder.variable("V", bound: u); |
+ |
+ _checkIsStrictSubtypeOf( |
+ TypeBuilder.function(types: [s]), TypeBuilder.function(types: [u])); |
+ |
+ _checkIsStrictSubtypeOf( |
+ TypeBuilder.function(types: [s, t], required: [s], result: t), |
+ TypeBuilder.function(types: [u, v], required: [u], result: v)); |
+ } |
+ |
+ void test_generics() { |
ClassElementImpl LClass = ElementFactory.classElement2('L', ["T"]); |
InterfaceType LType = LClass.type; |
ClassElementImpl MClass = ElementFactory.classElement2('M', ["T"]); |
@@ -608,7 +697,7 @@ class StrongSubtypingTest { |
_checkLattice(top, left, right, bottom); |
} |
- void test_isSubtypeOf_int() { |
+ void test_int() { |
List<DartType> equivalents = <DartType>[intType]; |
List<DartType> supertypes = <DartType>[numType]; |
List<DartType> unrelated = <DartType>[doubleType]; |
@@ -616,24 +705,37 @@ class StrongSubtypingTest { |
equivalents: equivalents, supertypes: supertypes, unrelated: unrelated); |
} |
- void test_isSubtypeOf_named_optional() { |
- DartType r = TypeBuilder.functionType(<DartType>[intType], intType); |
- DartType o = TypeBuilder.functionType(<DartType>[], intType, |
- optional: <DartType>[intType]); |
- DartType n = TypeBuilder.functionType(<DartType>[], intType, |
- named: <String, DartType>{'x': intType}); |
- DartType rr = |
- TypeBuilder.functionType(<DartType>[intType, intType], intType); |
- DartType ro = TypeBuilder.functionType(<DartType>[intType], intType, |
- optional: <DartType>[intType]); |
- DartType rn = TypeBuilder.functionType(<DartType>[intType], intType, |
- named: <String, DartType>{'x': intType}); |
- DartType oo = TypeBuilder.functionType(<DartType>[], intType, |
- optional: <DartType>[intType, intType]); |
- DartType nn = TypeBuilder.functionType(<DartType>[], intType, |
- named: <String, DartType>{'x': intType, 'y': intType}); |
- DartType nnn = TypeBuilder.functionType(<DartType>[], intType, |
- named: <String, DartType>{'x': intType, 'y': intType, 'z': intType}); |
+ void test_named_optional() { |
+ DartType r = |
+ TypeBuilder.function(required: <DartType>[intType], result: intType); |
+ DartType o = TypeBuilder.function( |
+ required: <DartType>[], optional: <DartType>[intType], result: intType); |
+ DartType n = TypeBuilder.function( |
+ required: <DartType>[], |
+ named: <String, DartType>{'x': intType}, |
+ result: intType); |
+ DartType rr = TypeBuilder.function( |
+ required: <DartType>[intType, intType], result: intType); |
+ DartType ro = TypeBuilder.function( |
+ required: <DartType>[intType], |
+ optional: <DartType>[intType], |
+ result: intType); |
+ DartType rn = TypeBuilder.function( |
+ required: <DartType>[intType], |
+ named: <String, DartType>{'x': intType}, |
+ result: intType); |
+ DartType oo = TypeBuilder.function( |
+ required: <DartType>[], |
+ optional: <DartType>[intType, intType], |
+ result: intType); |
+ DartType nn = TypeBuilder.function( |
+ required: <DartType>[], |
+ named: <String, DartType>{'x': intType, 'y': intType}, |
+ result: intType); |
+ DartType nnn = TypeBuilder.function( |
+ required: <DartType>[], |
+ named: <String, DartType>{'x': intType, 'y': intType, 'z': intType}, |
+ result: intType); |
_checkGroups(r, |
equivalents: [r], |
@@ -663,7 +765,7 @@ class StrongSubtypingTest { |
equivalents: [nnn], subtypes: [], unrelated: [r, o, rr, ro, rn, oo]); |
} |
- void test_isSubtypeOf_num() { |
+ void test_num() { |
List<DartType> equivalents = <DartType>[numType]; |
List<DartType> supertypes = <DartType>[]; |
List<DartType> unrelated = <DartType>[stringType]; |
@@ -675,29 +777,31 @@ class StrongSubtypingTest { |
subtypes: subtypes); |
} |
- // Regression test for https://github.com/dart-lang/sdk/issues/25069 |
- void test_isSubtypeOf_simple_function_void() { |
- FunctionType functionType = |
- TypeBuilder.functionType(<DartType>[intType], objectType); |
- _checkIsNotSubtypeOf(voidType, functionType); |
- } |
- |
- void test_isSubtypeOf_simple_function() { |
+ void test_simple_function() { |
FunctionType top = |
- TypeBuilder.functionType(<DartType>[intType], objectType); |
- FunctionType left = TypeBuilder.functionType(<DartType>[intType], intType); |
- FunctionType right = |
- TypeBuilder.functionType(<DartType>[objectType], objectType); |
+ TypeBuilder.function(required: <DartType>[intType], result: objectType); |
+ FunctionType left = |
+ TypeBuilder.function(required: <DartType>[intType], result: intType); |
+ FunctionType right = TypeBuilder.function( |
+ required: <DartType>[objectType], result: objectType); |
FunctionType bottom = |
- TypeBuilder.functionType(<DartType>[objectType], intType); |
+ TypeBuilder.function(required: <DartType>[objectType], result: intType); |
_checkLattice(top, left, right, bottom); |
} |
- void test_isSubtypeOf_void_functions() { |
- FunctionType top = TypeBuilder.functionType(<DartType>[intType], voidType); |
+ /// Regression test for https://github.com/dart-lang/sdk/issues/25069 |
+ void test_simple_function_void() { |
+ FunctionType functionType = |
+ TypeBuilder.function(required: <DartType>[intType], result: objectType); |
+ _checkIsNotSubtypeOf(voidType, functionType); |
+ } |
+ |
+ void test_void_functions() { |
+ FunctionType top = |
+ TypeBuilder.function(required: <DartType>[intType], result: voidType); |
FunctionType bottom = |
- TypeBuilder.functionType(<DartType>[objectType], intType); |
+ TypeBuilder.function(required: <DartType>[objectType], result: intType); |
_checkIsStrictSubtypeOf(bottom, top); |
} |
@@ -774,14 +878,25 @@ class StrongSubtypingTest { |
} |
class TypeBuilder { |
- static FunctionType functionType( |
- List<DartType> parameters, DartType returnType, |
- {List<DartType> optional, Map<String, DartType> named}) { |
- return ElementFactory |
- .functionElement8(parameters, returnType, |
- optional: optional, named: named) |
- .type; |
+ static FunctionTypeImpl function( |
+ {List<DartType> types, |
+ List<DartType> required, |
+ List<DartType> optional, |
+ Map<String, DartType> named, |
+ DartType result}) { |
+ result = result ?? VoidTypeImpl.instance; |
+ required = required ?? []; |
+ FunctionElementImpl f = ElementFactory.functionElement8(required, result, |
+ optional: optional, named: named); |
+ if (types != null) { |
+ f.typeParameters = |
+ new List<TypeParameterElement>.from(types.map((t) => t.element)); |
+ } |
+ return f.type = new FunctionTypeImpl(f); |
} |
+ |
+ static TypeParameterType variable(String name, {DartType bound}) => |
+ ElementFactory.typeParameterWithType(name, bound).type; |
} |
@reflectiveTest |