| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| // 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. |
| |
| library test.generic_function_typedef; |
| |
| import 'dart:mirrors'; |
| |
| import 'package:expect/expect.dart'; |
| |
| import 'generics_test.dart'; |
| |
| typedef bool NonGenericPredicate(num); |
| typedef bool GenericPredicate<T>(T); |
| typedef S GenericTransform<S>(S); |
| |
| class C<R> { |
| GenericPredicate<num> predicateOfNum; |
| GenericTransform<String> transformOfString; |
| GenericTransform<R> transformOfR; |
| } |
| |
| reflectClass(t) => reflectType(t).originalDeclaration; |
| |
| main() { |
| TypeMirror dynamicMirror = currentMirrorSystem().dynamicType; |
| |
| TypedefMirror predicateOfNum = reflectClass(C).variables[#predicateOfNum].type; |
| TypedefMirror transformOfString = reflectClass(C).variables[#transformOfString].type; |
| TypedefMirror transformOfR = reflectClass(C).variables[#transformOfR].type; |
| TypedefMirror transformOfDouble = reflect(new C<double>()).type.variables[#transformOfR].type; |
| |
| TypeVariableMirror rFromC = reflectClass(C).typeVariables[0]; |
| |
| // Typedefs. |
| typeParameters(reflectClass(NonGenericPredicate), []); |
| typeParameters(reflectClass(GenericPredicate), [#T]); |
| typeParameters(reflectClass(GenericTransform), [#S]); |
| typeParameters(predicateOfNum, [#T]); |
| typeParameters(transformOfString, [#S]); |
| typeParameters(transformOfR, [#R]); |
| typeParameters(transformOfDouble, [#R]); |
| |
| typeArguments(reflectClass(NonGenericPredicate), []); |
| typeArguments(reflectClass(GenericPredicate), []); |
| typeArguments(reflectClass(GenericTransform), []); |
| typeArguments(predicateOfNum, [reflectClass(num)]); |
| typeArguments(transformOfString, [reflectClass(String)]); |
| typeArguments(transformOfR, [rFromC]); |
| typeArguments(transformOfDouble, [reflect(double)]); |
| |
| Expect.isTrue(reflectClass(NonGenericPredicate).isOriginalDeclaration); |
| Expect.isTrue(reflectClass(GenericPredicate).isOriginalDeclaration); |
| Expect.isTrue(reflectClass(GenericTransform).isOriginalDeclaration); |
| Expect.isFalse(predicateOfNum.isOriginalDeclaration); |
| Expect.isFalse(transformOfString.isOriginalDeclaration); |
| Expect.isFalse(transformOfR.isOriginalDeclaration); |
| Expect.isFalse(transformOfDouble.isOriginalDeclaration); |
| |
| // Function types. |
| typeParameters(reflectClass(NonGenericPredicate).referent, []); |
| typeParameters(reflectClass(GenericPredicate).referent, []); |
| typeParameters(reflectClass(GenericTransform).referent, []); |
| typeParameters(predicateOfNum.referent, []); |
| typeParameters(transformOfString.referent, []); |
| typeParameters(transformOfR.referent, []); |
| typeParameters(transformOfDouble.referent, []); |
| |
| typeArguments(reflectClass(NonGenericPredicate).referent, []); |
| typeArguments(reflectClass(GenericPredicate).referent, []); |
| typeArguments(reflectClass(GenericTransform).referent, []); |
| typeArguments(predicateOfNum.referent, []); |
| typeArguments(transformOfString.referent, []); |
| typeArguments(transformOfR.referent, []); |
| typeArguments(transformOfDouble.referent, []); |
| |
| // Function types are always non-generic. Only the typedef is generic. |
| Expect.isTrue(reflectClass(NonGenericPredicate).referent.isOriginalDeclaration); |
| Expect.isTrue(reflectClass(GenericPredicate).referent.isOriginalDeclaration); |
| Expect.isTrue(reflectClass(GenericTransform).referent.isOriginalDeclaration); |
| Expect.isTrue(predicateOfNum.referent.isOriginalDeclaration); |
| Expect.isTrue(transformOfString.referent.isOriginalDeclaration); |
| Expect.isTrue(transformOfR.referent.isOriginalDeclaration); // Er, but here we don't have concrete types... |
| Expect.isTrue(transformOfDouble.referent.isOriginalDeclaration); |
| |
| Expect.equals(reflectClass(num), |
| reflectClass(NonGenericPredicate).referent.parameters[0].type); |
| Expect.equals(dynamicMirror, |
| reflectClass(GenericPredicate).referent.parameters[0].type); |
| Expect.equals(dynamicMirror, |
| reflectClass(GenericTransform).referent.parameters[0].type); |
| Expect.equals(reflectClass(num), |
| predicateOfNum.referent.parameters[0].type); |
| Expect.equals(reflectClass(String), |
| transformOfString.referent.parameters[0].type); |
| Expect.equals(rFromC, |
| transformOfR.referent.parameters[0].type); |
| Expect.equals(reflectClass(double), |
| transformOfDouble.referent.parameters[0].type); |
| |
| Expect.equals(reflectClass(bool), |
| reflectClass(NonGenericPredicate).referent.returnType); |
| Expect.equals(reflectClass(bool), |
| reflectClass(GenericPredicate).referent.returnType); |
| Expect.equals(dynamicMirror, |
| reflectClass(GenericTransform).referent.returnType); |
| Expect.equals(reflectClass(bool), |
| predicateOfNum.referent.returnType); |
| Expect.equals(reflectClass(String), |
| transformOfString.referent.returnType); |
| Expect.equals(rFromC, |
| transformOfR.referent.returnType); |
| Expect.equals(reflectClass(double), |
| transformOfDouble.referent.returnType); |
| } |