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

Unified Diff: sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart

Issue 1165473002: Start pulling pub from its own repo. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Code review changes Created 5 years, 7 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
Index: sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
deleted file mode 100644
index 8bb15277e22c44e87dd5441e644059a2f39ce15a..0000000000000000000000000000000000000000
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ /dev/null
@@ -1,419 +0,0 @@
-// Copyright (c) 2013, 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 pub.dart2js_transformer;
-
-import 'dart:async';
-import 'dart:convert';
-
-import 'package:analyzer/analyzer.dart';
-import 'package:barback/barback.dart';
-import 'package:path/path.dart' as path;
-import 'package:pool/pool.dart';
-
-import 'package:compiler/compiler.dart' as compiler;
-import 'package:compiler/src/dart2js.dart'
- show AbortLeg;
-import 'package:compiler/src/io/source_file.dart';
-import '../barback.dart';
-import '../dart.dart' as dart;
-import '../utils.dart';
-import 'asset_environment.dart';
-
-/// The set of all valid configuration options for this transformer.
-final _validOptions = new Set<String>.from([
- 'commandLineOptions', 'checked', 'csp', 'minify', 'verbose', 'environment',
- 'preserveUris', 'suppressWarnings', 'suppressHints',
- 'suppressPackageWarnings', 'terse', 'sourceMaps'
-]);
-
-/// A [Transformer] that uses dart2js's library API to transform Dart
-/// entrypoints in "web" to JavaScript.
-class Dart2JSTransformer extends Transformer implements LazyTransformer {
- /// We use this to ensure that only one compilation is in progress at a time.
- ///
- /// Dart2js uses lots of memory, so if we try to actually run compiles in
- /// parallel, it takes down the VM. The tracking bug to do something better
- /// is here: https://code.google.com/p/dart/issues/detail?id=14730.
- static final _pool = new Pool(1);
-
- final AssetEnvironment _environment;
- final BarbackSettings _settings;
-
- /// Whether source maps should be generated for the compiled JS.
- bool get _generateSourceMaps => _configBool('sourceMaps',
- defaultsTo: _settings.mode != BarbackMode.RELEASE);
-
- Dart2JSTransformer.withSettings(this._environment, this._settings) {
- var invalidOptions = _settings.configuration.keys.toSet()
- .difference(_validOptions);
- if (invalidOptions.isEmpty) return;
-
- throw new FormatException("Unrecognized dart2js "
- "${pluralize('option', invalidOptions.length)} "
- "${toSentence(invalidOptions.map((option) => '"$option"'))}.");
- }
-
- Dart2JSTransformer(AssetEnvironment environment, BarbackMode mode)
- : this.withSettings(environment, new BarbackSettings({}, mode));
-
- /// Only ".dart" entrypoint files within a buildable directory are processed.
- bool isPrimary(AssetId id) {
- if (id.extension != ".dart") return false;
-
- // "lib" should only contain libraries. For efficiency's sake, we don't
- // look for entrypoints in there.
- return !id.path.startsWith("lib/");
- }
-
- Future apply(Transform transform) {
- // TODO(nweiz): If/when barback starts reporting what assets were modified,
- // don't re-run the entrypoint detection logic unless the primary input was
- // actually modified. See issue 16817.
- return _isEntrypoint(transform.primaryInput).then((isEntrypoint) {
- if (!isEntrypoint) return null;
-
- // Wait for any ongoing apply to finish first.
- return _pool.withResource(() {
- transform.logger.info("Compiling ${transform.primaryInput.id}...");
- var stopwatch = new Stopwatch()..start();
- return _doCompilation(transform).then((_) {
- stopwatch.stop();
- transform.logger.info("Took ${stopwatch.elapsed} to compile "
- "${transform.primaryInput.id}.");
- });
- });
- });
- }
-
- void declareOutputs(DeclaringTransform transform) {
- var primaryId = transform.primaryId;
- transform.declareOutput(primaryId.addExtension(".js"));
- if (_generateSourceMaps) {
- transform.declareOutput(primaryId.addExtension(".js.map"));
- }
- }
-
- /// Returns whether or not [asset] might be an entrypoint.
- Future<bool> _isEntrypoint(Asset asset) {
- return asset.readAsString().then((code) {
- try {
- var name = asset.id.path;
- if (asset.id.package != _environment.rootPackage.name) {
- name += " in ${asset.id.package}";
- }
-
- var parsed = parseCompilationUnit(code, name: name);
- return dart.isEntrypoint(parsed);
- } on AnalyzerErrorGroup {
- // If we get a parse error, consider the asset primary so we report
- // dart2js's more detailed error message instead.
- return true;
- }
- });
- }
-
- /// Run the dart2js compiler.
- Future _doCompilation(Transform transform) {
- var provider = new _BarbackCompilerProvider(_environment, transform,
- generateSourceMaps: _generateSourceMaps);
-
- // Create a "path" to the entrypoint script. The entrypoint may not actually
- // be on disk, but this gives dart2js a root to resolve relative paths
- // against.
- var id = transform.primaryInput.id;
-
- var entrypoint = _environment.graph.packages[id.package].path(id.path);
-
- // TODO(rnystrom): Should have more sophisticated error-handling here. Need
- // to report compile errors to the user in an easily visible way. Need to
- // make sure paths in errors are mapped to the original source path so they
- // can understand them.
- return dart.compile(
- entrypoint, provider,
- commandLineOptions: _configCommandLineOptions,
- csp: _configBool('csp'),
- checked: _configBool('checked'),
- minify: _configBool(
- 'minify', defaultsTo: _settings.mode == BarbackMode.RELEASE),
- verbose: _configBool('verbose'),
- environment: _configEnvironment,
- packageRoot: _environment.rootPackage.path("packages"),
- analyzeAll: _configBool('analyzeAll'),
- preserveUris: _configBool('preserveUris'),
- suppressWarnings: _configBool('suppressWarnings'),
- suppressHints: _configBool('suppressHints'),
- suppressPackageWarnings: _configBool(
- 'suppressPackageWarnings', defaultsTo: true),
- terse: _configBool('terse'),
- includeSourceMapUrls: _generateSourceMaps);
- }
-
- /// Parses and returns the "commandLineOptions" configuration option.
- List<String> get _configCommandLineOptions {
- if (!_settings.configuration.containsKey('commandLineOptions')) return null;
-
- var options = _settings.configuration['commandLineOptions'];
- if (options is List && options.every((option) => option is String)) {
- return options;
- }
-
- throw new FormatException('Invalid value for '
- '\$dart2js.commandLineOptions: ${JSON.encode(options)} (expected list '
- 'of strings).');
- }
-
- /// Parses and returns the "environment" configuration option.
- Map<String, String> get _configEnvironment {
- if (!_settings.configuration.containsKey('environment')) {
- return _environment.environmentConstants;
- }
-
- var environment = _settings.configuration['environment'];
- if (environment is Map &&
- environment.keys.every((key) => key is String) &&
- environment.values.every((key) => key is String)) {
- return mergeMaps(environment, _environment.environmentConstants);
- }
-
- throw new FormatException('Invalid value for \$dart2js.environment: '
- '${JSON.encode(environment)} (expected map from strings to strings).');
- }
-
- /// Parses and returns a boolean configuration option.
- ///
- /// [defaultsTo] is the default value of the option.
- bool _configBool(String name, {bool defaultsTo: false}) {
- if (!_settings.configuration.containsKey(name)) return defaultsTo;
- var value = _settings.configuration[name];
- if (value is bool) return value;
- throw new FormatException('Invalid value for \$dart2js.$name: '
- '${JSON.encode(value)} (expected true or false).');
- }
-}
-
-/// Defines an interface for dart2js to communicate with barback and pub.
-///
-/// Note that most of the implementation of diagnostic handling here was
-/// copied from [FormattingDiagnosticHandler] in dart2js. The primary
-/// difference is that it uses barback's logging code and, more importantly, it
-/// handles missing source files more gracefully.
-class _BarbackCompilerProvider implements dart.CompilerProvider {
- Uri get libraryRoot => Uri.parse("${path.toUri(_libraryRootPath)}/");
-
- final AssetEnvironment _environment;
- final Transform _transform;
- String _libraryRootPath;
-
- /// The map of previously loaded files.
- ///
- /// Used to show where an error occurred in a source file.
- final _sourceFiles = new Map<String, SourceFile>();
-
- // TODO(rnystrom): Make these configurable.
- /// Whether or not warnings should be logged.
- var _showWarnings = true;
-
- /// Whether or not hints should be logged.
- var _showHints = true;
-
- /// Whether or not verbose info messages should be logged.
- var _verbose = false;
-
- /// Whether an exception should be thrown on an error to stop compilation.
- var _throwOnError = false;
-
- /// This gets set after a fatal error is reported to quash any subsequent
- /// errors.
- var _isAborting = false;
-
- final bool generateSourceMaps;
-
- compiler.Diagnostic _lastKind = null;
-
- static final int _FATAL =
- compiler.Diagnostic.CRASH.ordinal |
- compiler.Diagnostic.ERROR.ordinal;
- static final int _INFO =
- compiler.Diagnostic.INFO.ordinal |
- compiler.Diagnostic.VERBOSE_INFO.ordinal;
-
- _BarbackCompilerProvider(this._environment, this._transform,
- {this.generateSourceMaps: true}) {
- // Dart2js outputs source maps that reference the Dart SDK sources. For
- // that to work, those sources need to be inside the build environment. We
- // do that by placing them in a special "$sdk" pseudo-package. In order for
- // dart2js to generate the right URLs to point to that package, we give it
- // a library root that corresponds to where that package can be found
- // relative to the public source directory containing that entrypoint.
- //
- // For example, say the package being compiled is "/dev/myapp", the
- // entrypoint is "web/sub/foo/bar.dart", and the source directory is
- // "web/sub". This means the SDK sources will be (conceptually) at:
- //
- // /dev/myapp/web/sub/packages/$sdk/lib/
- //
- // This implies that the asset path for a file in the SDK is:
- //
- // $sdk|lib/lib/...
- //
- // TODO(rnystrom): Fix this if #17751 is fixed.
- var buildDir = _environment.getSourceDirectoryContaining(
- _transform.primaryInput.id.path);
- _libraryRootPath = _environment.rootPackage.path(
- buildDir, "packages", r"$sdk");
- }
-
- /// A [CompilerInputProvider] for dart2js.
- Future<String> provideInput(Uri resourceUri) {
- // We only expect to get absolute "file:" URLs from dart2js.
- assert(resourceUri.isAbsolute);
- assert(resourceUri.scheme == "file");
-
- var sourcePath = path.fromUri(resourceUri);
- return _readResource(resourceUri).then((source) {
- _sourceFiles[resourceUri.toString()] =
- new StringSourceFile(resourceUri, path.relative(sourcePath), source);
- return source;
- });
- }
-
- /// A [CompilerOutputProvider] for dart2js.
- EventSink<String> provideOutput(String name, String extension) {
- // TODO(rnystrom): Do this more cleanly. See: #17403.
- if (!generateSourceMaps && extension.endsWith(".map")) {
- return new NullSink<String>();
- }
-
- // TODO(nweiz): remove this special case when dart2js stops generating these
- // files.
- if (extension.endsWith(".precompiled.js")) return new NullSink<String>();
-
- var primaryId = _transform.primaryInput.id;
-
- // Dart2js uses an empty string for the name of the entrypoint library.
- // Otherwise, it's the name of a deferred library.
- var outPath;
- if (name == "") {
- outPath = _transform.primaryInput.id.path;
- } else {
- var dirname = path.url.dirname(_transform.primaryInput.id.path);
- outPath = path.url.join(dirname, name);
- }
-
- var id = new AssetId(primaryId.package, "$outPath.$extension");
-
- // Make a sink that dart2js can write to.
- var sink = new StreamController<String>();
-
- // dart2js gives us strings, but stream assets expect byte lists.
- var stream = UTF8.encoder.bind(sink.stream);
-
- // And give it to barback as a stream it can read from.
- _transform.addOutput(new Asset.fromStream(id, stream));
-
- return sink;
- }
-
- /// A [DiagnosticHandler] for dart2js, loosely based on
- /// [FormattingDiagnosticHandler].
- void handleDiagnostic(Uri uri, int begin, int end,
- String message, compiler.Diagnostic kind) {
- // TODO(ahe): Remove this when source map is handled differently.
- if (kind.name == "source map") return;
-
- if (_isAborting) return;
- _isAborting = (kind == compiler.Diagnostic.CRASH);
-
- var isInfo = (kind.ordinal & _INFO) != 0;
- if (isInfo && uri == null && kind != compiler.Diagnostic.INFO) {
- if (!_verbose && kind == compiler.Diagnostic.VERBOSE_INFO) return;
- _transform.logger.info(message);
- return;
- }
-
- // [_lastKind] records the previous non-INFO kind we saw.
- // This is used to suppress info about a warning when warnings are
- // suppressed, and similar for hints.
- if (kind != compiler.Diagnostic.INFO) _lastKind = kind;
-
- var logFn;
- if (kind == compiler.Diagnostic.ERROR) {
- logFn = _transform.logger.error;
- } else if (kind == compiler.Diagnostic.WARNING) {
- if (!_showWarnings) return;
- logFn = _transform.logger.warning;
- } else if (kind == compiler.Diagnostic.HINT) {
- if (!_showHints) return;
- logFn = _transform.logger.warning;
- } else if (kind == compiler.Diagnostic.CRASH) {
- logFn = _transform.logger.error;
- } else if (kind == compiler.Diagnostic.INFO) {
- if (_lastKind == compiler.Diagnostic.WARNING && !_showWarnings) return;
- if (_lastKind == compiler.Diagnostic.HINT && !_showHints) return;
- logFn = _transform.logger.info;
- } else {
- throw new Exception('Unknown kind: $kind (${kind.ordinal})');
- }
-
- var fatal = (kind.ordinal & _FATAL) != 0;
- if (uri == null) {
- logFn(message);
- } else {
- SourceFile file = _sourceFiles[uri.toString()];
- if (file == null) {
- // We got a message before loading the file, so just report the message
- // itself.
- logFn('$uri: $message');
- } else {
- logFn(file.getLocationMessage(message, begin, end));
- }
- }
-
- if (fatal && _throwOnError) {
- _isAborting = true;
- throw new AbortLeg(message);
- }
- }
-
- Future<String> _readResource(Uri url) {
- return new Future.sync(() {
- // Find the corresponding asset in barback.
- var id = _sourceUrlToId(url);
- if (id != null) return _transform.readInputAsString(id);
-
- // Don't allow arbitrary file paths that point to things not in packages.
- // Doing so won't work in Dartium.
- throw new Exception(
- "Cannot read $url because it is outside of the build environment.");
- });
- }
-
- AssetId _sourceUrlToId(Uri url) {
- // See if it's a package path.
- var id = packagesUrlToId(url);
- if (id != null) return id;
-
- // See if it's a path to a "public" asset within the root package. All
- // other files in the root package are not visible to transformers, so
- // should be loaded directly from disk.
- var sourcePath = path.fromUri(url);
- if (_environment.containsPath(sourcePath)) {
- var relative = path.toUri(_environment.rootPackage.relative(sourcePath))
- .toString();
-
- return new AssetId(_environment.rootPackage.name, relative);
- }
-
- return null;
- }
-}
-
-/// An [EventSink] that discards all data. Provided to dart2js when we don't
-/// want an actual output.
-class NullSink<T> implements EventSink<T> {
- void add(T event) {}
- void addError(errorEvent, [StackTrace stackTrace]) {}
- void close() {}
-}

Powered by Google App Engine
This is Rietveld 408576698