Index: sdk/lib/_internal/pub/lib/src/dart.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart |
index 7c5e0fa913142f9c33fa6bd320010b9f8fd539bd..f9e5b18c64710f0fa33ce744f26035470189c45c 100644 |
--- a/sdk/lib/_internal/pub/lib/src/dart.dart |
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart |
@@ -21,21 +21,38 @@ import 'io.dart'; |
import 'sdk.dart' as sdk; |
import 'utils.dart'; |
-/// Returns [entrypoint] compiled to JavaScript (or to Dart if [toDart] is |
-/// true). |
+/// Interface to communicate with dart2js. |
+/// |
+/// This is basically an amalgamation of dart2js's |
+/// [compiler.CompilerInputProvider], [compiler.CompilerOutputProvider], and |
+/// [compiler.DiagnosticHandler] function types so that we can provide them |
+/// as a single unit. |
+abstract class CompilerProvider { |
+ /// Given [uri], responds with a future that completes to the contents of |
+ /// the input file at that URI. |
+ /// |
+ /// The future can complete to a string or a list of bytes. |
+ Future/*<String | List<int>>*/ provideInput(Uri uri); |
+ |
+ /// Reports a diagnostic message from dart2js to the user. |
+ void handleDiagnostic(Uri uri, int begin, int end, String message, |
+ compiler.Diagnostic kind); |
+ |
+ /// Given a [name] (which will be "" for the entrypoint) and a file extension, |
+ /// returns an [EventSink] that dart2js can write to to emit an output file. |
+ EventSink<String> provideOutput(String name, String extension); |
+} |
+ |
+/// Compiles [entrypoint] to JavaScript (or to Dart if [toDart] is true) as |
+/// well as any ancillary outputs dart2js creates. |
+/// |
+/// Uses [provider] to communcate between dart2js and the caller. Returns a |
+/// future that completes when compilation is done. |
/// |
/// By default, the package root is assumed to be adjacent to [entrypoint], but |
/// if [packageRoot] is passed that will be used instead. |
-/// |
-/// If [inputProvider] and [diagnosticHandler] are omitted, uses a default |
-/// [compiler.CompilerInputProvider] that loads directly from the filesystem. |
-/// If either is provided, both must be. |
-Future<String> compile(String entrypoint, { |
- String packageRoot, |
- bool toDart: false, |
- bool minify: true, |
- compiler.CompilerInputProvider inputProvider, |
- compiler.DiagnosticHandler diagnosticHandler}) { |
+Future compile(String entrypoint, CompilerProvider provider, { |
+ String packageRoot, bool toDart: false, bool minify: true}) { |
return new Future.sync(() { |
var options = <String>['--categories=Client,Server']; |
if (toDart) options.add('--output-type=dart'); |
@@ -45,27 +62,14 @@ Future<String> compile(String entrypoint, { |
packageRoot = path.join(path.dirname(entrypoint), 'packages'); |
} |
- // Must either pass both of these or neither. |
- if ((inputProvider == null) != (diagnosticHandler == null)) { |
- throw new ArgumentError("If either inputProvider or diagnosticHandler " |
- "is passed, then both must be."); |
- } |
- |
- if (inputProvider == null) { |
- var provider = new CompilerSourceFileProvider(); |
- inputProvider = provider.readStringFromUri; |
- diagnosticHandler = new FormattingDiagnosticHandler(provider) |
- .diagnosticHandler; |
- } |
- |
return compiler.compile( |
path.toUri(entrypoint), |
path.toUri(appendSlash(_libPath)), |
path.toUri(appendSlash(packageRoot)), |
- inputProvider, diagnosticHandler, options).then((js) { |
- if (js == null) throw new CompilerException(entrypoint); |
- return js; |
- }); |
+ provider.provideInput, |
+ provider.handleDiagnostic, |
+ options, |
+ provider.provideOutput); |
}); |
} |
@@ -182,9 +186,3 @@ class CrossIsolateException implements Exception { |
String toString() => "$message\n$stackTrace"; |
} |
- |
-/// An exception thrown when dart2js generates compiler errors. |
-class CompilerException extends ApplicationException { |
- CompilerException(String entrypoint) |
- : super('Failed to compile "$entrypoint".'); |
-} |