| Index: pkg/front_end/lib/kernel_generator.dart
|
| diff --git a/pkg/front_end/lib/kernel_generator.dart b/pkg/front_end/lib/kernel_generator.dart
|
| index 6292ae300b8289681e46b96c4dc95afcde3f2ffd..0f5a4d888365aa8dacd1b1ec7f60d4d6b4945491 100644
|
| --- a/pkg/front_end/lib/kernel_generator.dart
|
| +++ b/pkg/front_end/lib/kernel_generator.dart
|
| @@ -8,7 +8,7 @@ library front_end.kernel_generator;
|
| import 'compiler_options.dart';
|
| import 'dart:async' show Future;
|
| import 'dart:async';
|
| -import 'package:front_end/physical_file_system.dart';
|
| +import 'package:front_end/src/base/processed_options.dart';
|
| import 'src/fasta/dill/dill_target.dart' show DillTarget;
|
| import 'src/fasta/errors.dart' show InputError;
|
| import 'src/fasta/kernel/kernel_target.dart' show KernelTarget;
|
| @@ -29,15 +29,13 @@ import 'src/simple_error.dart';
|
| /// If `compileSdk` in [options] is true, the generated program will include
|
| /// code for the SDK.
|
| ///
|
| -/// If summaries are provided in [options], they may be used to speed up
|
| -/// analysis. If in addition `compileSdk` is false, this will speed up
|
| -/// compilation, as no source of the sdk will be generated. Note however, that
|
| -/// summaries for application code can also speed up analysis, but they will not
|
| -/// take the place of Dart source code (since the Dart source code is still
|
| -/// needed to access the contents of method bodies).
|
| +/// If summaries are provided in [options], they will be used to speed up
|
| +/// the process. If in addition `compileSdk` is false, then the resulting
|
| +/// program will not contain the sdk contents. This is useful when building apps
|
| +/// for platforms that already embed the sdk (e.g. the VM), so there is no need
|
| +/// to spend time and space rebuilding it.
|
| Future<Program> kernelForProgram(Uri source, CompilerOptions options) async {
|
| var fs = options.fileSystem;
|
| -
|
| report(String msg) {
|
| options.onError(new SimpleError(msg));
|
| return null;
|
| @@ -47,16 +45,19 @@ Future<Program> kernelForProgram(Uri source, CompilerOptions options) async {
|
| return report("Entry-point file not found: $source");
|
| }
|
|
|
| - if (!await validateOptions(options)) return null;
|
| + var pOptions = new ProcessedOptions(options);
|
| +
|
| + if (!await pOptions.validateOptions()) return null;
|
|
|
| try {
|
| - TranslateUri uriTranslator = await TranslateUri.parse(
|
| - PhysicalFileSystem.instance, null, options.packagesFileUri);
|
| + TranslateUri uriTranslator = await pOptions.getUriTranslator();
|
|
|
| var dillTarget =
|
| new DillTarget(new Ticker(isVerbose: false), uriTranslator);
|
| - var summary = options.sdkSummary;
|
| - if (summary != null) dillTarget.read(summary);
|
| + var summary = await pOptions.sdkSummaryProgram;
|
| + if (summary != null) {
|
| + dillTarget.loader.appendLibraries(summary);
|
| + }
|
|
|
| var kernelTarget = new KernelTarget(
|
| options.fileSystem, dillTarget, uriTranslator, options.strongMode);
|
| @@ -64,7 +65,7 @@ Future<Program> kernelForProgram(Uri source, CompilerOptions options) async {
|
|
|
| await dillTarget.buildOutlines();
|
| await kernelTarget.buildOutlines();
|
| - Program program = await kernelTarget.buildProgram();
|
| + Program program = await kernelTarget.buildProgram(trimDependencies: true);
|
|
|
| if (kernelTarget.errors.isNotEmpty) {
|
| kernelTarget.errors.forEach(report);
|
| @@ -121,5 +122,63 @@ Future<Program> kernelForProgram(Uri source, CompilerOptions options) async {
|
| /// obtained from?
|
| Future<Program> kernelForBuildUnit(
|
| List<Uri> sources, CompilerOptions options) async {
|
| - throw new UnimplementedError("kernel for build-unit is not implemented");
|
| + var fs = options.fileSystem;
|
| + report(String msg) {
|
| + options.onError(new SimpleError(msg));
|
| + return null;
|
| + }
|
| +
|
| + if (!options.chaseDependencies) {
|
| + // TODO(sigmund): add support, most likely we can do so by adding a wrapper
|
| + // on top of filesystem that restricts reads to a set of known files.
|
| + report("hermetic mode (chaseDependencies = false) is not implemented");
|
| + return null;
|
| + }
|
| +
|
| + for (var source in sources) {
|
| + if (!await fs.entityForUri(source).exists()) {
|
| + return report("Entry-point file not found: $source");
|
| + }
|
| + }
|
| +
|
| + var pOptions = new ProcessedOptions(options);
|
| +
|
| + if (!await pOptions.validateOptions()) return null;
|
| +
|
| + try {
|
| + TranslateUri uriTranslator = await pOptions.getUriTranslator();
|
| +
|
| + var dillTarget =
|
| + new DillTarget(new Ticker(isVerbose: false), uriTranslator);
|
| + var summary = await pOptions.sdkSummaryProgram;
|
| + if (summary != null) {
|
| + dillTarget.loader.appendLibraries(summary);
|
| + }
|
| +
|
| + // TODO(sigmund): this is likely not going to work if done naively: if
|
| + // summaries contain external references we need to ensure they are loaded
|
| + // in a specific order.
|
| + for (var inputSummary in await pOptions.inputSummariesPrograms) {
|
| + dillTarget.loader.appendLibraries(inputSummary);
|
| + }
|
| +
|
| + await dillTarget.buildOutlines();
|
| +
|
| + var kernelTarget = new KernelTarget(
|
| + options.fileSystem, dillTarget, uriTranslator, options.strongMode);
|
| + sources.forEach(kernelTarget.read);
|
| + await kernelTarget.buildOutlines();
|
| +
|
| + Program program = await kernelTarget.buildProgram(trimDependencies: true);
|
| +
|
| + if (kernelTarget.errors.isNotEmpty) {
|
| + kernelTarget.errors.forEach(report);
|
| + return null;
|
| + }
|
| +
|
| + return program;
|
| + } on InputError catch (e) {
|
| + options.onError(new SimpleError(e.format()));
|
| + return null;
|
| + }
|
| }
|
|
|