Index: pkg/front_end/tool/_fasta/dump_partial.dart |
diff --git a/pkg/front_end/tool/_fasta/dump_partial.dart b/pkg/front_end/tool/_fasta/dump_partial.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c800523b01457af9ef9048522de46e91e4f881f8 |
--- /dev/null |
+++ b/pkg/front_end/tool/_fasta/dump_partial.dart |
@@ -0,0 +1,72 @@ |
+// 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. |
+ |
+/// Utility to dump a truncated .dill file generated by the incremental kernel |
+/// generator or by the VM's kernel service. |
+import 'dart:io'; |
+import 'package:kernel/kernel.dart'; |
+import 'package:front_end/src/fasta/kernel/utils.dart'; |
+ |
+main(List<String> args) { |
+ if (args.length == 0) { |
+ print('usage: pkg/front_end/tool/fasta dump_partial ' |
+ 'partial.dill [extra1.dill] ... [extraN.dill]'); |
+ exitCode = 1; |
+ } |
+ |
+ var program = _loadProgram(args); |
+ writeProgramToText(program); |
+} |
+ |
+/// Creates a program that contains all of the context code marked as external, |
+/// and all libraries defined in partial.dill as they are written in that file. |
+Program _loadProgram(List<String> args) { |
+ List<int> partialInput = new File(args[0]).readAsBytesSync(); |
+ |
+ var context = new Program(); |
+ for (var i = 1; i < args.length; i++) { |
+ loadProgramFromBinary(args[i], context); |
+ } |
+ |
+ Set<Uri> libraries = _definedLibraries(partialInput, context); |
+ |
+ // By default `package:kernel/binary/ast_from_binary.dart` merges the contents |
+ // of libraries that are mentioned in more than one .dill file. In order to |
+ // keep the contents of partial.dill intact, we build a new context that |
+ // excludes those libraries defined in partial.dill. |
+ List<int> contextBytes = serializeProgram(context, |
+ filter: (l) => !libraries.contains(l.importUri)); |
+ var program = new Program(); |
+ loadProgramFromBytes(contextBytes, program); |
+ _updateIsExternal(program, true); |
+ loadProgramFromBytes(partialInput, program); |
+ return program; |
+} |
+ |
+/// Compute the set of libraries defined in [partialDill]. |
+/// |
+/// The [context] program contains all other libraries that may be needed to |
+/// properly deserialize partialDill. |
+/// |
+/// Note: This function will mutate [context] in place. |
+// TODO(sigmund): simplify and get rid of [context]. We could do that with a |
+// custom deserialization, but it will be easier to do once .dill has |
+// random-access support. |
+Set<Uri> _definedLibraries(List<int> partialDill, Program context) { |
+ _updateIsExternal(context, true); |
+ |
+ // This implicitly sets `isExternal = false` on all libraries defined in the |
+ // partial.dill file. |
+ loadProgramFromBytes(partialDill, context); |
+ var result = context.libraries |
+ .where((l) => !l.isExternal) |
+ .map((l) => l.importUri) |
+ .toSet(); |
+ _updateIsExternal(context, false); |
+ return result; |
+} |
+ |
+void _updateIsExternal(Program program, bool toValue) { |
+ program.libraries.forEach((lib) => lib.isExternal = toValue); |
+} |