| Index: pkg/compiler/lib/compiler_new.dart
|
| diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3ec05ec39b2df18f6ccb419905ccd4f5c695624f
|
| --- /dev/null
|
| +++ b/pkg/compiler/lib/compiler_new.dart
|
| @@ -0,0 +1,179 @@
|
| +// Copyright (c) 2015, 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.
|
| +
|
| +/// New Compiler API. This API is under construction, use only internally or
|
| +/// in unittests.
|
| +
|
| +library compiler_new;
|
| +
|
| +import 'dart:async';
|
| +import 'src/apiimpl.dart';
|
| +import 'compiler.dart' show Diagnostic, PackagesDiscoveryProvider;
|
| +export 'compiler.dart' show Diagnostic, PackagesDiscoveryProvider;
|
| +
|
| +// Unless explicitly allowed, passing `null` for any argument to the
|
| +// methods of library will result in an Error being thrown.
|
| +
|
| +/// Interface for providing the compiler with input. That is, Dart source files,
|
| +/// package config files, etc.
|
| +abstract class CompilerInput {
|
| + /// Returns a future that completes to the source corresponding to [uri].
|
| + /// If an exception occurs, the future completes with this exception.
|
| + ///
|
| + /// The source can be represented either as a [:List<int>:] of UTF-8 bytes or
|
| + /// as a [String].
|
| + ///
|
| + /// The following text is non-normative:
|
| + ///
|
| + /// It is recommended to return a UTF-8 encoded list of bytes because the
|
| + /// scanner is more efficient in this case. In either case, the data structure
|
| + /// is expected to hold a zero element at the last position. If this is not
|
| + /// the case, the entire data structure is copied before scanning.
|
| + Future/*<String | List<int>>*/ readFromUri(Uri uri);
|
| +}
|
| +
|
| +/// Interface for producing output from the compiler. That is, JavaScript target
|
| +/// files, source map files, dump info files, etc.
|
| +abstract class CompilerOutput {
|
| + /// Returns an [EventSink] that will serve as compiler output for the given
|
| + /// component.
|
| + ///
|
| + /// Components are identified by [name] and [extension]. By convention,
|
| + /// the empty string [:"":] will represent the main script
|
| + /// (corresponding to the script parameter of [compile]) even if the
|
| + /// main script is a library. For libraries that are compiled
|
| + /// separately, the library name is used.
|
| + ///
|
| + /// At least the following extensions can be expected:
|
| + ///
|
| + /// * "js" for JavaScript output.
|
| + /// * "js.map" for source maps.
|
| + /// * "dart" for Dart output.
|
| + /// * "dart.map" for source maps.
|
| + ///
|
| + /// As more features are added to the compiler, new names and
|
| + /// extensions may be introduced.
|
| + EventSink<String> createEventSink(String name, String extension);
|
| +}
|
| +
|
| +/// Interface for receiving diagnostic message from the compiler. That is,
|
| +/// errors, warnings, hints, etc.
|
| +abstract class CompilerDiagnostics {
|
| + /// Invoked by the compiler to report diagnostics. If [uri] is `null`, so are
|
| + /// [begin] and [end]. No other arguments may be `null`. If [uri] is not
|
| + /// `null`, neither are [begin] and [end]. [uri] indicates the compilation
|
| + /// unit from where the diagnostic originates. [begin] and [end] are
|
| + /// zero-based character offsets from the beginning of the compilation unit.
|
| + /// [message] is the diagnostic message, and [kind] indicates indicates what
|
| + /// kind of diagnostic it is.
|
| + void report(Uri uri, int begin, int end, String message, Diagnostic kind);
|
| +}
|
| +
|
| +/// Information resulting from the compilation.
|
| +class CompilationResult {
|
| + /// `true` if the compilation succeeded, that is, compilation didn't fail due
|
| + /// to compile-time errors and/or internal errors.
|
| + final bool isSuccess;
|
| +
|
| + /// The compiler object used for the compilation.
|
| + ///
|
| + /// Note: The type of [compiler] is implementation dependent and may vary.
|
| + /// Use only for debugging and testing.
|
| + final compiler;
|
| +
|
| + CompilationResult(this.compiler, {this.isSuccess: true});
|
| +}
|
| +
|
| +/// Object for passing options to the compiler.
|
| +class CompilerOptions {
|
| + final Uri entryPoint;
|
| + final Uri libraryRoot;
|
| + final Uri packageRoot;
|
| + final Uri packageConfig;
|
| + final PackagesDiscoveryProvider packagesDiscoveryProvider;
|
| + final List<String> options;
|
| + final Map<String, dynamic> environment;
|
| +
|
| + /// Creates an option object for the compiler.
|
| + // TODO(johnniwinther): Expand comment when [options] are explicit as named
|
| + // arguments.
|
| + factory CompilerOptions(
|
| + {Uri entryPoint,
|
| + Uri libraryRoot,
|
| + Uri packageRoot,
|
| + Uri packageConfig,
|
| + PackagesDiscoveryProvider packagesDiscoveryProvider,
|
| + List<String> options: const <String>[],
|
| + Map<String, dynamic> environment: const <String, dynamic>{}}) {
|
| + if (entryPoint == null) {
|
| + throw new ArgumentError("entryPoint must be non-null");
|
| + }
|
| + if (!libraryRoot.path.endsWith("/")) {
|
| + throw new ArgumentError("libraryRoot must end with a /");
|
| + }
|
| + if (packageRoot != null && !packageRoot.path.endsWith("/")) {
|
| + throw new ArgumentError("packageRoot must end with a /");
|
| + }
|
| + return new CompilerOptions._(
|
| + entryPoint,
|
| + libraryRoot,
|
| + packageRoot,
|
| + packageConfig,
|
| + packagesDiscoveryProvider,
|
| + options,
|
| + environment);
|
| + }
|
| +
|
| + CompilerOptions._(
|
| + this.entryPoint,
|
| + this.libraryRoot,
|
| + this.packageRoot,
|
| + this.packageConfig,
|
| + this.packagesDiscoveryProvider,
|
| + this.options,
|
| + this.environment);
|
| +}
|
| +
|
| +/// Returns a future that completes to a [CompilationResult] when the Dart
|
| +/// sources in [options] have been compiled.
|
| +///
|
| +/// The generated compiler output is obtained by providing a [compilerOutput].
|
| +///
|
| +/// If the compilation fails, the future's `CompilationResult.isSuccess` is
|
| +/// `false` and [CompilerDiagnostics.report] on [compilerDiagnostics]
|
| +/// is invoked at least once with `kind == Diagnostic.ERROR` or
|
| +/// `kind == Diagnostic.CRASH`.
|
| +Future<CompilationResult> compile(
|
| + CompilerOptions compilerOptions,
|
| + CompilerInput compilerInput,
|
| + CompilerDiagnostics compilerDiagnostics,
|
| + CompilerOutput compilerOutput) {
|
| +
|
| + if (compilerOptions == null) {
|
| + throw new ArgumentError("compilerOptions must be non-null");
|
| + }
|
| + if (compilerInput == null) {
|
| + throw new ArgumentError("compilerInput must be non-null");
|
| + }
|
| + if (compilerDiagnostics == null) {
|
| + throw new ArgumentError("compilerDiagnostics must be non-null");
|
| + }
|
| + if (compilerOutput == null) {
|
| + throw new ArgumentError("compilerOutput must be non-null");
|
| + }
|
| +
|
| + Compiler compiler = new Compiler(
|
| + compilerInput,
|
| + compilerOutput,
|
| + compilerDiagnostics,
|
| + compilerOptions.libraryRoot,
|
| + compilerOptions.packageRoot,
|
| + compilerOptions.options,
|
| + compilerOptions.environment,
|
| + compilerOptions.packageConfig,
|
| + compilerOptions.packagesDiscoveryProvider);
|
| + return compiler.run(compilerOptions.entryPoint).then((bool success) {
|
| + return new CompilationResult(compiler, isSuccess: success);
|
| + });
|
| +}
|
|
|