| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library pub.dart2js_transformer; | 5 library pub.dart2js_transformer; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 | 9 |
| 10 import 'package:analyzer/analyzer.dart'; | 10 import 'package:analyzer/analyzer.dart'; |
| 11 import 'package:barback/barback.dart'; | 11 import 'package:barback/barback.dart'; |
| 12 import 'package:path/path.dart' as path; | 12 import 'package:path/path.dart' as p; |
| 13 import 'package:pool/pool.dart'; | 13 import 'package:pool/pool.dart'; |
| 14 | 14 |
| 15 import 'package:compiler_unsupported/compiler.dart' as compiler; | 15 import 'package:compiler_unsupported/compiler.dart' as compiler; |
| 16 import 'package:compiler_unsupported/src/dart2js.dart' | 16 import 'package:compiler_unsupported/src/dart2js.dart' |
| 17 show AbortLeg; | 17 show AbortLeg; |
| 18 import 'package:compiler_unsupported/src/io/source_file.dart'; | 18 import 'package:compiler_unsupported/src/io/source_file.dart'; |
| 19 import '../barback.dart'; | 19 import '../barback.dart'; |
| 20 import '../dart.dart' as dart; | 20 import '../dart.dart' as dart; |
| 21 import '../utils.dart'; | 21 import '../utils.dart'; |
| 22 import 'asset_environment.dart'; | 22 import 'asset_environment.dart'; |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 } | 194 } |
| 195 | 195 |
| 196 /// Defines an interface for dart2js to communicate with barback and pub. | 196 /// Defines an interface for dart2js to communicate with barback and pub. |
| 197 /// | 197 /// |
| 198 /// Note that most of the implementation of diagnostic handling here was | 198 /// Note that most of the implementation of diagnostic handling here was |
| 199 /// copied from [FormattingDiagnosticHandler] in dart2js. The primary | 199 /// copied from [FormattingDiagnosticHandler] in dart2js. The primary |
| 200 /// difference is that it uses barback's logging code and, more importantly, it | 200 /// difference is that it uses barback's logging code and, more importantly, it |
| 201 /// handles missing source files more gracefully. | 201 /// handles missing source files more gracefully. |
| 202 class _BarbackCompilerProvider implements dart.CompilerProvider { | 202 class _BarbackCompilerProvider implements dart.CompilerProvider { |
| 203 Uri get libraryRoot => | 203 Uri get libraryRoot => |
| 204 Uri.parse("${path.toUri(path.absolute(_libraryRootPath))}/"); | 204 Uri.parse("${p.toUri(p.normalize(p.absolute(_libraryRootPath)))}/"); |
| 205 | 205 |
| 206 final AssetEnvironment _environment; | 206 final AssetEnvironment _environment; |
| 207 final Transform _transform; | 207 final Transform _transform; |
| 208 String _libraryRootPath; | 208 String _libraryRootPath; |
| 209 | 209 |
| 210 /// The map of previously loaded files. | 210 /// The map of previously loaded files. |
| 211 /// | 211 /// |
| 212 /// Used to show where an error occurred in a source file. | 212 /// Used to show where an error occurred in a source file. |
| 213 final _sourceFiles = new Map<String, SourceFile>(); | 213 final _sourceFiles = new Map<String, SourceFile>(); |
| 214 | 214 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 _libraryRootPath = _environment.rootPackage.path( | 265 _libraryRootPath = _environment.rootPackage.path( |
| 266 buildDir, "packages", r"$sdk"); | 266 buildDir, "packages", r"$sdk"); |
| 267 } | 267 } |
| 268 | 268 |
| 269 /// A [CompilerInputProvider] for dart2js. | 269 /// A [CompilerInputProvider] for dart2js. |
| 270 Future<String> provideInput(Uri resourceUri) { | 270 Future<String> provideInput(Uri resourceUri) { |
| 271 // We only expect to get absolute "file:" URLs from dart2js. | 271 // We only expect to get absolute "file:" URLs from dart2js. |
| 272 assert(resourceUri.isAbsolute); | 272 assert(resourceUri.isAbsolute); |
| 273 assert(resourceUri.scheme == "file"); | 273 assert(resourceUri.scheme == "file"); |
| 274 | 274 |
| 275 var sourcePath = path.fromUri(resourceUri); | 275 var sourcePath = p.fromUri(resourceUri); |
| 276 return _readResource(resourceUri).then((source) { | 276 return _readResource(resourceUri).then((source) { |
| 277 _sourceFiles[resourceUri.toString()] = | 277 _sourceFiles[resourceUri.toString()] = |
| 278 new StringSourceFile(resourceUri, path.relative(sourcePath), source); | 278 new StringSourceFile(resourceUri, p.relative(sourcePath), source); |
| 279 return source; | 279 return source; |
| 280 }); | 280 }); |
| 281 } | 281 } |
| 282 | 282 |
| 283 /// A [CompilerOutputProvider] for dart2js. | 283 /// A [CompilerOutputProvider] for dart2js. |
| 284 EventSink<String> provideOutput(String name, String extension) { | 284 EventSink<String> provideOutput(String name, String extension) { |
| 285 // TODO(rnystrom): Do this more cleanly. See: #17403. | 285 // TODO(rnystrom): Do this more cleanly. See: #17403. |
| 286 if (!generateSourceMaps && extension.endsWith(".map")) { | 286 if (!generateSourceMaps && extension.endsWith(".map")) { |
| 287 return new NullSink<String>(); | 287 return new NullSink<String>(); |
| 288 } | 288 } |
| 289 | 289 |
| 290 // TODO(nweiz): remove this special case when dart2js stops generating these | 290 // TODO(nweiz): remove this special case when dart2js stops generating these |
| 291 // files. | 291 // files. |
| 292 if (extension.endsWith(".precompiled.js")) return new NullSink<String>(); | 292 if (extension.endsWith(".precompiled.js")) return new NullSink<String>(); |
| 293 | 293 |
| 294 var primaryId = _transform.primaryInput.id; | 294 var primaryId = _transform.primaryInput.id; |
| 295 | 295 |
| 296 // Dart2js uses an empty string for the name of the entrypoint library. | 296 // Dart2js uses an empty string for the name of the entrypoint library. |
| 297 // Otherwise, it's the name of a deferred library. | 297 // Otherwise, it's the name of a deferred library. |
| 298 var outPath; | 298 var outPath; |
| 299 if (name == "") { | 299 if (name == "") { |
| 300 outPath = _transform.primaryInput.id.path; | 300 outPath = _transform.primaryInput.id.path; |
| 301 } else { | 301 } else { |
| 302 var dirname = path.url.dirname(_transform.primaryInput.id.path); | 302 var dirname = p.url.dirname(_transform.primaryInput.id.path); |
| 303 outPath = path.url.join(dirname, name); | 303 outPath = p.url.join(dirname, name); |
| 304 } | 304 } |
| 305 | 305 |
| 306 var id = new AssetId(primaryId.package, "$outPath.$extension"); | 306 var id = new AssetId(primaryId.package, "$outPath.$extension"); |
| 307 | 307 |
| 308 // Make a sink that dart2js can write to. | 308 // Make a sink that dart2js can write to. |
| 309 var sink = new StreamController<String>(); | 309 var sink = new StreamController<String>(); |
| 310 | 310 |
| 311 // dart2js gives us strings, but stream assets expect byte lists. | 311 // dart2js gives us strings, but stream assets expect byte lists. |
| 312 var stream = UTF8.encoder.bind(sink.stream); | 312 var stream = UTF8.encoder.bind(sink.stream); |
| 313 | 313 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 } | 392 } |
| 393 | 393 |
| 394 AssetId _sourceUrlToId(Uri url) { | 394 AssetId _sourceUrlToId(Uri url) { |
| 395 // See if it's a package path. | 395 // See if it's a package path. |
| 396 var id = packagesUrlToId(url); | 396 var id = packagesUrlToId(url); |
| 397 if (id != null) return id; | 397 if (id != null) return id; |
| 398 | 398 |
| 399 // See if it's a path to a "public" asset within the root package. All | 399 // See if it's a path to a "public" asset within the root package. All |
| 400 // other files in the root package are not visible to transformers, so | 400 // other files in the root package are not visible to transformers, so |
| 401 // should be loaded directly from disk. | 401 // should be loaded directly from disk. |
| 402 var sourcePath = path.fromUri(url); | 402 var sourcePath = p.fromUri(url); |
| 403 if (_environment.containsPath(sourcePath)) { | 403 if (_environment.containsPath(sourcePath)) { |
| 404 var relative = path.toUri(_environment.rootPackage.relative(sourcePath)) | 404 var relative = p.toUri(_environment.rootPackage.relative(sourcePath)) |
| 405 .toString(); | 405 .toString(); |
| 406 | 406 |
| 407 return new AssetId(_environment.rootPackage.name, relative); | 407 return new AssetId(_environment.rootPackage.name, relative); |
| 408 } | 408 } |
| 409 | 409 |
| 410 return null; | 410 return null; |
| 411 } | 411 } |
| 412 } | 412 } |
| 413 | 413 |
| 414 /// An [EventSink] that discards all data. Provided to dart2js when we don't | 414 /// An [EventSink] that discards all data. Provided to dart2js when we don't |
| 415 /// want an actual output. | 415 /// want an actual output. |
| 416 class NullSink<T> implements EventSink<T> { | 416 class NullSink<T> implements EventSink<T> { |
| 417 void add(T event) {} | 417 void add(T event) {} |
| 418 void addError(errorEvent, [StackTrace stackTrace]) {} | 418 void addError(errorEvent, [StackTrace stackTrace]) {} |
| 419 void close() {} | 419 void close() {} |
| 420 } | 420 } |
| OLD | NEW |