Index: pkg/kernel/lib/transformations/reify/reify_transformer.dart |
diff --git a/pkg/kernel/lib/transformations/reify/reify_transformer.dart b/pkg/kernel/lib/transformations/reify/reify_transformer.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4561208b5bcfabf437e0346d503addbac03759f6 |
--- /dev/null |
+++ b/pkg/kernel/lib/transformations/reify/reify_transformer.dart |
@@ -0,0 +1,114 @@ |
+// Copyright (c) 2016, 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 kernel.transformations.reify.standalone_runner; |
+ |
+import 'analysis/program_analysis.dart'; |
+import 'dart:io' show File, IOSink; |
+ |
+import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter; |
+ |
+import 'package:kernel/ast.dart'; |
+ |
+import 'package:kernel/verifier.dart'; |
+import 'package:kernel/text/ast_to_text.dart' show Printer; |
+ |
+import 'package:kernel/repository.dart' show Repository; |
+ |
+import 'package:kernel/binary/loader.dart' show BinaryLoader; |
+ |
+import 'transformation/remove_generics.dart'; |
+import 'transformation/transformer.dart' |
+ show ReifyVisitor, RuntimeLibrary, RuntimeTypeSupportBuilder; |
+ |
+import 'package:kernel/core_types.dart' show CoreTypes; |
+ |
+RuntimeLibrary findRuntimeTypeLibrary(Program p) { |
+ Library findLibraryEndingWith(String postfix) { |
+ Iterable<Library> candidates = p.libraries.where((Library l) { |
+ return l.importUri.toString().endsWith(postfix); |
+ }); |
+ if (candidates.length != 1) { |
+ String howMany = candidates.isEmpty ? "No" : "Multiple"; |
+ throw new Exception( |
+ "$howMany candidates for runtime support library found."); |
+ } |
+ return candidates.single; |
+ } |
+ |
+ Library types = findLibraryEndingWith("reify/types.dart"); |
+ Library declarations = findLibraryEndingWith("reify/declarations.dart"); |
+ Library interceptors = findLibraryEndingWith("reify/interceptors.dart"); |
+ return new RuntimeLibrary(types, declarations, interceptors); |
+} |
+ |
+Program transformProgramUsingLibraries( |
+ Program program, RuntimeLibrary runtimeLibrary, |
+ [Library libraryToTransform]) { |
+ LibraryFilter filter = libraryToTransform != null |
+ ? (Library library) => library == libraryToTransform |
+ : (_) => true; |
+ ProgramKnowledge knowledge = analyze(program, analyzeLibrary: filter); |
+ Library mainLibrary = program.mainMethod.parent; |
+ RuntimeTypeSupportBuilder builder = new RuntimeTypeSupportBuilder( |
+ runtimeLibrary, new CoreTypes(program), mainLibrary); |
+ ReifyVisitor transformer = |
+ new ReifyVisitor(runtimeLibrary, builder, knowledge, libraryToTransform); |
+ // Transform the main program. |
+ program = program.accept(transformer); |
+ if (!filter(runtimeLibrary.interceptorsLibrary)) { |
+ // We need to transform the interceptor function in any case to make sure |
+ // that the type literals in the interceptor function are rewritten. |
+ runtimeLibrary.interceptorFunction.accept(transformer); |
+ } |
+ builder.createDeclarations(); |
+ program = program.accept(new Erasure(transformer)); |
+ // TODO(karlklose): skip checks in debug mode |
+ verifyProgram(program); |
+ return program; |
+} |
+ |
+Program transformProgram(Program program) { |
+ RuntimeLibrary runtimeLibrary = findRuntimeTypeLibrary(program); |
+ Library mainLibrary = program.mainMethod.enclosingLibrary; |
+ return transformProgramUsingLibraries(program, runtimeLibrary, mainLibrary); |
+} |
+ |
+main(List<String> arguments) async { |
+ String path = arguments.first; |
+ Uri output; |
+ if (arguments.length > 1) { |
+ output = Uri.base.resolve(arguments[1]); |
+ } |
+ Uri uri = Uri.base.resolve(path); |
+ Repository repository = new Repository(); |
+ Program program = new BinaryLoader(repository).loadProgram(uri.toFilePath()); |
+ |
+ RuntimeLibrary runtimeLibrary = findRuntimeTypeLibrary(program); |
+ Library mainLibrary = program.mainMethod.enclosingLibrary; |
+ program = |
+ transformProgramUsingLibraries(program, runtimeLibrary, mainLibrary); |
+ |
+ if (output == null) { |
+ // Print result |
+ StringBuffer sb = new StringBuffer(); |
+ Printer printer = new Printer(sb); |
+ printer.writeLibraryFile(mainLibrary); |
+ print("$sb"); |
+ } else { |
+ IOSink sink = new File.fromUri(output).openWrite(); |
+ try { |
+ new BinaryPrinter(sink).writeProgramFile(program); |
+ } finally { |
+ await sink.close(); |
+ } |
+ try { |
+ // Check that we can read the binary file. |
+ new BinaryLoader(new Repository()).loadProgram(output.toFilePath()); |
+ } catch (e) { |
+ print("Error when attempting to read $output."); |
+ rethrow; |
+ } |
+ } |
+} |