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

Unified Diff: pkg/fasta/lib/src/compile_platform.dart

Issue 2634453004: Fasta infrastructure. (Closed)
Patch Set: Address review comments. Created 3 years, 11 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
« no previous file with comments | « pkg/fasta/lib/src/command_line.dart ('k') | pkg/fasta/lib/src/compiler_command_line.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
+}
« no previous file with comments | « pkg/fasta/lib/src/command_line.dart ('k') | pkg/fasta/lib/src/compiler_command_line.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698