Index: pkg/fletchc/lib/fletch_compiler.dart |
diff --git a/pkg/fletchc/lib/fletch_compiler.dart b/pkg/fletchc/lib/fletch_compiler.dart |
deleted file mode 100644 |
index 2d727e004e0f1312cfa65a5d3392e348fdf03d7f..0000000000000000000000000000000000000000 |
--- a/pkg/fletchc/lib/fletch_compiler.dart |
+++ /dev/null |
@@ -1,341 +0,0 @@ |
-// Copyright (c) 2015, the Dartino 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.md file. |
- |
-library fletchc.fletch_compiler; |
- |
-import 'dart:async' show |
- Future; |
- |
-import 'dart:convert' show |
- UTF8; |
- |
-import 'dart:io' show |
- File, |
- Link, |
- Platform; |
- |
-import 'package:compiler/compiler_new.dart' show |
- CompilerInput, |
- CompilerOutput, |
- CompilerDiagnostics; |
- |
-import 'package:compiler/src/source_file_provider.dart' show |
- CompilerSourceFileProvider, |
- FormattingDiagnosticHandler, |
- SourceFileProvider; |
- |
-import 'package:compiler/src/filenames.dart' show |
- appendSlash; |
- |
-import 'src/fletch_native_descriptor.dart' show |
- FletchNativeDescriptor; |
- |
-import 'src/fletch_backend.dart' show |
- FletchBackend; |
- |
-import 'package:compiler/src/apiimpl.dart' as apiimpl; |
- |
-import 'src/fletch_compiler_implementation.dart' show |
- FletchCompilerImplementation, |
- OutputProvider; |
- |
-import 'fletch_system.dart'; |
- |
-import 'incremental/fletchc_incremental.dart' show |
- IncrementalCompiler, |
- IncrementalMode; |
- |
-import 'src/guess_configuration.dart' show |
- executable, |
- guessFletchVm; |
- |
-const String _LIBRARY_ROOT = |
- const String.fromEnvironment("fletchc-library-root"); |
- |
-const String fletchDeviceType = |
- const String.fromEnvironment("fletch.device-type"); |
-const String _NATIVES_JSON = |
- const String.fromEnvironment("fletch-natives-json"); |
- |
-const String StringOrUri = "String or Uri"; |
- |
-class FletchCompiler { |
- final FletchCompilerImplementation _compiler; |
- |
- final Uri script; |
- |
- final bool verbose; |
- |
- final String platform; |
- |
- final Uri nativesJson; |
- |
- FletchCompiler._( |
- this._compiler, |
- this.script, |
- this.verbose, |
- this.platform, |
- this.nativesJson); |
- |
- Backdoor get backdoor => new Backdoor(this); |
- |
- factory FletchCompiler( |
- {CompilerInput provider, |
- CompilerOutput outputProvider, |
- CompilerDiagnostics handler, |
- @StringOrUri libraryRoot, |
- @StringOrUri packageConfig, |
- @StringOrUri script, |
- @StringOrUri fletchVm, |
- @StringOrUri currentDirectory, |
- @StringOrUri nativesJson, |
- List<String> options, |
- Map<String, dynamic> environment, |
- String platform, |
- IncrementalCompiler incrementalCompiler}) { |
- |
- Uri base = _computeValidatedUri( |
- currentDirectory, name: 'currentDirectory', ensureTrailingSlash: true); |
- if (base == null) { |
- base = Uri.base; |
- } |
- |
- if (options == null) { |
- options = <String>[]; |
- } else { |
- options = new List<String>.from(options); |
- } |
- |
- options.add("--platform-config=$platform"); |
- |
- final bool isVerbose = apiimpl.CompilerImpl.hasOption(options, '--verbose'); |
- |
- if (provider == null) { |
- provider = new CompilerSourceFileProvider() |
- ..cwd = base; |
- } |
- |
- if (handler == null) { |
- SourceFileProvider sourceFileProvider = null; |
- if (provider is SourceFileProvider) { |
- sourceFileProvider = provider; |
- } |
- handler = new FormattingDiagnosticHandler(sourceFileProvider) |
- ..throwOnError = false |
- ..verbose = isVerbose; |
- } |
- |
- if (outputProvider == null) { |
- outputProvider = new OutputProvider(); |
- } |
- |
- if (libraryRoot == null && _LIBRARY_ROOT != null) { |
- libraryRoot = executable.resolve(appendSlash(_LIBRARY_ROOT)); |
- } |
- libraryRoot = _computeValidatedUri( |
- libraryRoot, name: 'libraryRoot', ensureTrailingSlash: true, |
- base: base); |
- if (libraryRoot == null) { |
- libraryRoot = _guessLibraryRoot(platform); |
- if (libraryRoot == null) { |
- throw new StateError(""" |
-Unable to guess the location of the Dart SDK (libraryRoot). |
-Try adding command-line option '-Ddart-sdk=<location of the Dart sdk>'."""); |
- } |
- } else if (!_looksLikeLibraryRoot(libraryRoot, platform)) { |
- throw new ArgumentError( |
- "[libraryRoot]: Dart SDK library not found in '$libraryRoot'."); |
- } |
- |
- script = _computeValidatedUri(script, name: 'script', base: base); |
- |
- packageConfig = _computeValidatedUri( |
- packageConfig, name: 'packageConfig', base: base); |
- if (packageConfig == null) { |
- if (script != null) { |
- packageConfig = script.resolve('.packages'); |
- } else { |
- packageConfig = base.resolve('.packages'); |
- } |
- } |
- |
- fletchVm = guessFletchVm( |
- _computeValidatedUri(fletchVm, name: 'fletchVm', base: base)); |
- |
- if (environment == null) { |
- environment = <String, dynamic>{}; |
- } |
- |
- if (nativesJson == null && _NATIVES_JSON != null) { |
- nativesJson = base.resolve(_NATIVES_JSON); |
- } |
- nativesJson = _computeValidatedUri( |
- nativesJson, name: 'nativesJson', base: base); |
- |
- if (nativesJson == null) { |
- nativesJson = _guessNativesJson(); |
- if (nativesJson == null) { |
- throw new StateError( |
-""" |
-Unable to guess the location of the 'natives.json' file (nativesJson). |
-Try adding command-line option '-Dfletch-natives-json=<path to natives.json>.""" |
-); |
- } |
- } else if (!_looksLikeNativesJson(nativesJson)) { |
- throw new ArgumentError( |
- "[nativesJson]: natives.json not found in '$nativesJson'."); |
- } |
- |
- FletchCompilerImplementation compiler = new FletchCompilerImplementation( |
- provider, |
- outputProvider, |
- handler, |
- libraryRoot, |
- packageConfig, |
- nativesJson, |
- options, |
- environment, |
- fletchVm, |
- incrementalCompiler); |
- |
- compiler.log("Using library root: $libraryRoot"); |
- compiler.log("Using package config: $packageConfig"); |
- |
- var helper = new FletchCompiler._( |
- compiler, script, isVerbose, platform, nativesJson); |
- compiler.helper = helper; |
- return helper; |
- } |
- |
- Future<FletchDelta> run([@StringOrUri script]) async { |
- // TODO(ahe): Need a base argument. |
- script = _computeValidatedUri(script, name: 'script'); |
- if (script == null) { |
- script = this.script; |
- } |
- if (script == null) { |
- throw new StateError("No [script] provided."); |
- } |
- await _inititalizeContext(); |
- FletchBackend backend = _compiler.backend; |
- return _compiler.run(script).then((_) => backend.computeDelta()); |
- } |
- |
- Future _inititalizeContext() async { |
- var data = await _compiler.callUserProvider(nativesJson); |
- if (data is! String) { |
- if (data.last == 0) { |
- data = data.sublist(0, data.length - 1); |
- } |
- data = UTF8.decode(data); |
- } |
- Map<String, FletchNativeDescriptor> natives = |
- <String, FletchNativeDescriptor>{}; |
- Map<String, String> names = <String, String>{}; |
- FletchNativeDescriptor.decode(data, natives, names); |
- _compiler.context.nativeDescriptors = natives; |
- _compiler.context.setNames(names); |
- } |
- |
- Uri get fletchVm => _compiler.fletchVm; |
- |
- /// Create a new instance of [IncrementalCompiler]. |
- IncrementalCompiler newIncrementalCompiler( |
- IncrementalMode support, |
- {List<String> options: const <String>[]}) { |
- return new IncrementalCompiler( |
- libraryRoot: _compiler.libraryRoot, |
- packageConfig: _compiler.packageConfig, |
- fletchVm: _compiler.fletchVm, |
- nativesJson: _compiler.nativesJson, |
- inputProvider: _compiler.provider, |
- diagnosticHandler: _compiler.handler, |
- options: options, |
- outputProvider: _compiler.userOutputProvider, |
- environment: _compiler.environment, |
- support: support, |
- platform: platform); |
- } |
-} |
- |
-// Backdoor around Dart privacy. For now, certain components (in particular |
-// incremental compilation) need access to implementation details that shouldn't |
-// be part of the API of this file. |
-// TODO(ahe): Delete this class. |
-class Backdoor { |
- final FletchCompiler _compiler; |
- |
- Backdoor(this._compiler); |
- |
- Future<FletchCompilerImplementation> get compilerImplementation async { |
- await _compiler._inititalizeContext(); |
- return _compiler._compiler; |
- } |
-} |
- |
-/// Resolves any symbolic links in [uri] if its scheme is "file". Otherwise |
-/// return the given [uri]. |
-Uri _resolveSymbolicLinks(Uri uri) { |
- if (uri.scheme != 'file') return uri; |
- File apparentLocation = new File.fromUri(uri); |
- String realLocation = apparentLocation.resolveSymbolicLinksSync(); |
- if (uri.path.endsWith("/")) { |
- realLocation = appendSlash(realLocation); |
- } |
- return new Uri.file(realLocation); |
-} |
- |
-bool _containsFile(Uri uri, String expectedFile) { |
- if (uri.scheme != 'file') return true; |
- return new File.fromUri(uri.resolve(expectedFile)).existsSync(); |
-} |
- |
-bool _looksLikeLibraryRoot(Uri uri, String platform) { |
- return _containsFile(uri, platform); |
-} |
- |
-Uri _computeValidatedUri( |
- @StringOrUri stringOrUri, |
- {String name, |
- bool ensureTrailingSlash: false, |
- Uri base}) { |
- if (base == null) { |
- base = Uri.base; |
- } |
- assert(name != null); |
- if (stringOrUri == null) { |
- return null; |
- } else if (stringOrUri is String) { |
- if (ensureTrailingSlash) { |
- stringOrUri = appendSlash(stringOrUri); |
- } |
- return base.resolve(stringOrUri); |
- } else if (stringOrUri is Uri) { |
- return base.resolveUri(stringOrUri); |
- } else { |
- throw new ArgumentError("[$name] should be a String or a Uri."); |
- } |
-} |
- |
-Uri _guessLibraryRoot(String platform) { |
- // When running from fletch, [executable] is |
- // ".../fletch-repo/fletch/out/$CONFIGURATION/dart", which means that the |
- // fletch root is the lib directory in the 2th parent directory (due to |
- // how URI resolution works, the filename ("dart") is removed before |
- // resolving, for example, |
- // ".../fletch-repo/fletch/out/$CONFIGURATION/../../" becomes |
- // ".../fletch-repo/fletch/"). |
- Uri guess = executable.resolve('../../lib/'); |
- if (_looksLikeLibraryRoot(guess, platform)) return guess; |
- return null; |
-} |
- |
-bool _looksLikeNativesJson(Uri uri) { |
- return new File.fromUri(uri).existsSync(); |
-} |
- |
-Uri _guessNativesJson() { |
- Uri uri = executable.resolve('natives.json'); |
- return _looksLikeNativesJson(uri) ? uri : null; |
-} |