Index: pkg/kernel/test/erasure_test.dart |
diff --git a/pkg/kernel/test/erasure_test.dart b/pkg/kernel/test/erasure_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e9c6e7bba98f54445996a951cc7594820ffe162e |
--- /dev/null |
+++ b/pkg/kernel/test/erasure_test.dart |
@@ -0,0 +1,103 @@ |
+// Copyright (c) 2017, 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. |
+ |
+import "package:expect/expect.dart"; |
+import "package:kernel/ast.dart"; |
+import "package:kernel/core_types.dart"; |
+import "package:kernel/testing/mock_sdk_program.dart"; |
+import "package:kernel/text/ast_to_text.dart"; |
+import "package:kernel/transformations/erasure.dart"; |
+ |
+void main(List<String> arguments) { |
+ new Tester().testLocalFunction(); |
+} |
+ |
+class Tester { |
+ final Program program; |
+ |
+ final Library library; |
+ |
+ final Procedure mainMethod; |
+ |
+ final CoreTypes coreTypes; |
+ |
+ static final Uri base = |
+ new Uri(scheme: "org.dartlang.kernel", host: "", path: "/"); |
+ |
+ Tester.internal(this.program, this.library, this.mainMethod) |
+ : coreTypes = new CoreTypes(program); |
+ |
+ factory Tester() { |
+ Program program = createMockSdkProgram(); |
+ Library library = new Library(base.resolve("main.dart"))..parent = program; |
+ Procedure mainMethod = buildProcedure("main"); |
+ library.addMember(mainMethod); |
+ program.libraries.add(library); |
+ program.mainMethod = mainMethod; |
+ return new Tester.internal(program, library, mainMethod); |
+ } |
+ |
+ void addStatement(Statement statement) { |
+ Block body = mainMethod.function.body; |
+ body.statements.add(statement); |
+ statement.parent = body; |
+ } |
+ |
+ void testLocalFunction() { |
+ FunctionDeclaration fDeclaration = buildFunctionDeclaration( |
+ "f", buildFunctionNodeWithTypesAndParameters()); |
+ FunctionExpression functionExpression = |
+ new FunctionExpression(buildFunctionNodeWithTypesAndParameters()); |
+ |
+ addStatement(fDeclaration); |
+ addStatement(new ExpressionStatement(functionExpression)); |
+ Expect.stringEquals( |
+ "<T extends dynamic, S extends dart.core::List<T>>(S) → T", |
+ debugNodeToString(fDeclaration.variable.type).trim()); |
+ Expect.stringEquals( |
+ "<T extends dynamic, S extends dart.core::List<T>>(S) → T", |
+ debugNodeToString(functionExpression.getStaticType(null)).trim()); |
+ transformProgram(coreTypes, program); |
+ Expect.stringEquals("(dart.core::List<dynamic>) → dynamic", |
+ debugNodeToString(fDeclaration.variable.type).trim()); |
+ Expect.stringEquals("(dart.core::List<dynamic>) → dynamic", |
+ debugNodeToString(functionExpression.getStaticType(null)).trim()); |
+ } |
+ |
+ /// Builds this function: `f<T, S extends List<T>>(S argument) → T {}`. |
+ FunctionNode buildFunctionNodeWithTypesAndParameters() { |
+ TypeParameter tVariable = new TypeParameter("T", const DynamicType()); |
+ TypeParameter sVariable = new TypeParameter("S", const DynamicType()); |
+ TypeParameterType tType = new TypeParameterType(tVariable); |
+ TypeParameterType sType = new TypeParameterType(sVariable); |
+ sVariable.bound = new InterfaceType(coreTypes.listClass, <DartType>[tType]); |
+ return new FunctionNode(buildBlock(), |
+ positionalParameters: <VariableDeclaration>[ |
+ new VariableDeclaration("argument", type: sType), |
+ ], |
+ typeParameters: <TypeParameter>[tVariable, sVariable], |
+ returnType: tType); |
+ } |
+ |
+ static Block buildBlock([List<Statement> statements]) { |
+ return new Block(statements ?? <Statement>[]); |
+ } |
+ |
+ static FunctionNode buildFunction([Statement body]) { |
+ return new FunctionNode(body ?? buildBlock()); |
+ } |
+ |
+ static Procedure buildProcedure(String name, [FunctionNode function]) { |
+ return new Procedure( |
+ new Name(name), ProcedureKind.Method, function ?? buildFunction()); |
+ } |
+ |
+ static FunctionDeclaration buildFunctionDeclaration( |
+ String name, FunctionNode function) { |
+ return new FunctionDeclaration( |
+ new VariableDeclaration(name, |
+ type: function.functionType, isFinal: true), |
+ function); |
+ } |
+} |