| Index: pkg/fasta/lib/src/compile_platform.dart
|
| diff --git a/pkg/fasta/lib/src/compile_platform.dart b/pkg/fasta/lib/src/compile_platform.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4c4b6e3430628d2ff9e63c9ae336e311f1e108ef
|
| --- /dev/null
|
| +++ b/pkg/fasta/lib/src/compile_platform.dart
|
| @@ -0,0 +1,137 @@
|
| +// 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 fasta.compile_platform;
|
| +
|
| +import 'dart:async' show
|
| + Future;
|
| +
|
| +import 'dart:io' show
|
| + File,
|
| + IOSink;
|
| +
|
| +import 'package:analyzer/src/generated/source.dart' show
|
| + Source;
|
| +
|
| +import 'package:analyzer/dart/element/element.dart' show
|
| + ExportElement,
|
| + LibraryElement;
|
| +
|
| +import 'package:kernel/kernel.dart' show
|
| + Repository;
|
| +
|
| +import 'package:kernel/ast.dart' show
|
| + Field,
|
| + Library,
|
| + Name,
|
| + Program,
|
| + StringLiteral;
|
| +
|
| +import 'package:kernel/binary/ast_to_binary.dart' show
|
| + BinaryPrinter;
|
| +
|
| +import 'package:kernel/analyzer/loader.dart' show
|
| + DartLoader,
|
| + DartOptions,
|
| + createDartSdk;
|
| +
|
| +import 'package:kernel/target/targets.dart' show
|
| + Target,
|
| + TargetFlags,
|
| + getTarget;
|
| +
|
| +import 'package:kernel/repository.dart' show
|
| + Repository;
|
| +
|
| +import 'package:kernel/ast.dart' show
|
| + Program;
|
| +
|
| +import 'environment_variable.dart' show
|
| + EnvironmentVariableDirectory,
|
| + fileExists;
|
| +
|
| +import 'errors.dart' show
|
| + inputError;
|
| +
|
| +const EnvironmentVariableSdk dartAotSdk = const EnvironmentVariableSdk(
|
| + "DART_AOT_SDK",
|
| + "The environment variable 'DART_AOT_SDK' should point to a patched SDK.");
|
| +
|
| +class EnvironmentVariableSdk extends EnvironmentVariableDirectory {
|
| + const EnvironmentVariableSdk(String name, String what)
|
| + : super(name, what);
|
| +
|
| + Future<Null> validate(String value) async {
|
| + Uri sdk = Uri.base.resolveUri(new Uri.directory(value));
|
| + const String asyncDart = "lib/async/async.dart";
|
| + if (!await fileExists(sdk, asyncDart)) {
|
| + inputError(null, null,
|
| + "The environment variable '$name' has the value '$value', "
|
| + "that's a directory that doesn't contain '$asyncDart'. $what");
|
| + }
|
| + const String asyncSources = "lib/async/async_sources.gypi";
|
| + if (await fileExists(sdk, asyncSources)) {
|
| + inputError(null, null,
|
| + "The environment variable '$name' has the value '$value', "
|
| + "that's a directory that contains '$asyncSources', so it isn't a "
|
| + "patched SDK. $what");
|
| + }
|
| + return null;
|
| + }
|
| +}
|
| +
|
| +main(List<String> arguments) async {
|
| + Uri output = Uri.base.resolveUri(new Uri.file(arguments.single));
|
| + DartOptions options = new DartOptions(
|
| + strongMode: false, sdk: await dartAotSdk.value, packagePath: null);
|
| + Repository repository = new Repository();
|
| + DartLoader loader = new DartLoader(repository, options, null,
|
| + ignoreRedirectingFactories: false,
|
| + dartSdk: createDartSdk(options.sdk, strongMode: options.strongMode));
|
| + Target target = getTarget(
|
| + "vm", new TargetFlags(strongMode: options.strongMode));
|
| + Library dummyLibrary = repository.getLibraryReference(Uri.parse("dummy:"))
|
| + ..isExternal = false;
|
| + Program program =
|
| + loader.loadProgram(dummyLibrary.importUri, target: target);
|
| + program = new Program(
|
| + program.libraries.where(
|
| + (Library l) => l.importUri.scheme == "dart").toList(),
|
| + program.uriToLineStarts);
|
| + if (loader.errors.isNotEmpty) {
|
| + inputError(null, null, loader.errors.join("\n"));
|
| + }
|
| + target.transformProgram(program);
|
| + for (LibraryElement analyzerLibrary in loader.libraryElements) {
|
| + Library library = loader.getLibraryReference(analyzerLibrary);
|
| + StringBuffer sb = new StringBuffer();
|
| + if (analyzerLibrary.exports.isNotEmpty) {
|
| + Source source;
|
| + int offset;
|
| + for (ExportElement export in analyzerLibrary.exports) {
|
| + source ??= export.source;
|
| + offset ??= export.nameOffset;
|
| + Uri uri = export.exportedLibrary.source.uri;
|
| + sb.write("export '");
|
| + sb.write(uri);
|
| + sb.write("'");
|
| + if (export.combinators.isNotEmpty) {
|
| + sb.write(" ");
|
| + sb.writeAll(export.combinators, " ");
|
| + }
|
| + sb.write(";");
|
| + }
|
| + Name exports = new Name("_exports#", library);
|
| + StringLiteral literal = new StringLiteral("$sb")
|
| + ..fileOffset = offset;
|
| + library.addMember(new Field(exports, isStatic: true, isConst: true,
|
| + initializer: literal, fileUri: "${new Uri.file(source.fullName)}")
|
| + ..fileOffset = offset);
|
| + }
|
| + }
|
| +
|
| + IOSink sink = new File.fromUri(output).openWrite();
|
| + new BinaryPrinter(sink).writeProgramFile(program);
|
| + await sink.close();
|
| +}
|
|
|