Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2629)

Unified Diff: pkg/kernel/lib/transformations/reify/reify_transformer.dart

Issue 2697873007: Merge the work on Generic Types Reification from 'dart-lang/reify' repo (Closed)
Patch Set: Get back parameter erroneously removed by previous commit Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
+ }
+ }
+}
« no previous file with comments | « pkg/kernel/lib/transformations/reify/asts.dart ('k') | pkg/kernel/lib/transformations/reify/transformation/binding.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698