Chromium Code Reviews| Index: pkg/compiler/lib/compiler_new.dart |
| diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart |
| index b6c1e4f521ad52cbd358efeae979669f36a9d35f..da4eac9ed9e6f10c438b62fa28ffde077ac5497d 100644 |
| --- a/pkg/compiler/lib/compiler_new.dart |
| +++ b/pkg/compiler/lib/compiler_new.dart |
| @@ -9,6 +9,9 @@ library compiler_new; |
| import 'dart:async'; |
| import 'src/apiimpl.dart'; |
| +import 'src/commandline_options.dart'; |
| +import 'src/diagnostics/diagnostic_listener.dart' show DiagnosticOptions; |
| + |
| import 'compiler.dart' show Diagnostic, PackagesDiscoveryProvider; |
| export 'compiler.dart' show Diagnostic, PackagesDiscoveryProvider; |
| @@ -71,8 +74,8 @@ abstract class CompilerDiagnostics { |
| /// Experimental: [code] gives access to an id for the messages. Currently it |
| /// is the [Message] used to create the diagnostic, if available, from which |
| /// the [MessageKind] is accessible. |
| - void report(var code, |
| - Uri uri, int begin, int end, String text, Diagnostic kind); |
| + void report( |
| + var code, Uri uri, int begin, int end, String text, Diagnostic kind); |
| } |
| /// Information resulting from the compilation. |
| @@ -92,52 +95,423 @@ class CompilationResult { |
| /// Object for passing options to the compiler. |
| class CompilerOptions { |
| + /// The entry point of the application that is being compiled. |
| final Uri entryPoint; |
| + |
| + /// Root location where SDK libraries are found. |
| final Uri libraryRoot; |
| + |
| + /// Package root location. |
| + /// |
| + /// if not null then [packageConfig] should be null. |
|
Johnni Winther
2016/03/16 09:37:27
'if' -> 'If'
Siggi Cherem (dart-lang)
2016/03/17 22:57:13
Done.
|
| final Uri packageRoot; |
| + |
| + /// Location of the package configuration file. |
| + /// |
| + /// if not null then [packageRoot] should be null. |
|
Johnni Winther
2016/03/16 09:37:27
Ditto.
Siggi Cherem (dart-lang)
2016/03/17 22:57:14
Done.
|
| final Uri packageConfig; |
| + |
| + // TODO(sigmund): Move out of here, maybe to CompilerInput. Options should not |
| + // hold code, just configuration options. |
| final PackagesDiscoveryProvider packagesDiscoveryProvider; |
| - final List<String> options; |
| + |
| + /// Resolved constant "environment" values passed to the compiler via the `-D` |
| + /// flags. |
| final Map<String, dynamic> environment; |
| + /// Whether we allow mocking compilation of libraries such as dart:io and |
| + /// dart:html for unit testing purposes. |
| + final bool allowMockCompilation; |
| + |
| + /// Whether the native extension syntax is supported by the frontend. |
| + final bool allowNativeExtensions; |
| + |
| + /// Whether to resolve all functions in the program, not just those reachable |
| + /// from main. This implies [analyzeOnly] is true as well. |
| + final bool analyzeAll; |
| + |
| + /// Whether to disable tree-shaking for the main script. This marks all |
| + /// functions in the main script as reachable (not just a function named |
| + /// `main`). |
| + // TODO(sigmund): rename. The current name seems to indicate that only the |
| + // main function is retained, which is the opposite of what this does. |
|
Johnni Winther
2016/03/16 09:37:27
When used together with analyzeOnly it doesn't eve
Siggi Cherem (dart-lang)
2016/03/17 22:57:13
Acknowledged.
|
| + final bool analyzeMain; |
| + |
| + /// Whether to run the compiler just for the purpose of analysis. That is, to |
| + /// run resolution and type-checking alone, but otherwise do not generate any |
| + /// code. |
| + final bool analyzeOnly; |
| + |
| + /// Whether to skip analysis of method bodies and field initializers. Implies |
| + /// [analyzeOnly]. |
| + final bool analyzeSignaturesOnly; |
| + |
| + /// ID associated with this sdk build. |
| + final String buildId; |
| + |
| + /// Whether there is a build-id available so we can use it on error messages |
| + /// and in the emitted output of the compiler. |
| + bool get hasBuildId => buildId != _UNDETERMINED_BUILD_ID; |
| + |
| + /// Location where to generate a map containing details of how deferred |
| + /// libraries are subdivided. |
| + final Uri deferredMapUri; |
| + |
| + /// Whether to disable inlining during the backend optimizations. |
| + // TODO(sigmund): negate, so all flags are positive |
| + final bool disableInlining; |
| + |
| + /// Several options to configure diagnostic messages. |
| + // TODO(sigmund): should we simply embed those options here? |
| + final DiagnosticOptions diagnosticOptions; |
| + |
| + /// Whether to disable global type inference. |
| + final bool disableTypeInference; |
| + |
| + /// Whether to emit a .json file with a summary of the information used by the |
| + /// compiler during optimization. This includes resolution details, |
| + /// dependencies between elements, results of type inference, and the output |
| + /// code for each function. |
| + final bool dumpInfo; |
| + |
| + /// Whether we allow passing an extra argument to `assert`, containing a |
| + /// reason for why an assertion fails. (experimental) |
| + final bool enableAssertMessage; |
| + |
| + /// Whether to enable the experimental conditional directives feature. |
| + final bool enableConditionalDirectives; |
| + |
| + /// Whether the user specified a flag to allow the use of dart:mirrors. This |
| + /// silences a warning produced by the compiler. |
| + final bool enableExperimentalMirrors; |
| + |
| + /// Whether to enable minification |
| + // TODO(sigmund): rename to minify |
| + final bool enableMinification; |
| + |
| + /// Whether to model which native classes are live based on annotations on the |
| + /// core libraries. If false, all native classes will be included by default. |
| + final bool enableNativeLiveTypeAnalysis; |
| + |
| + /// Whether to generate code containing checked-mode assignability checks. |
| + final bool enableTypeAssertions; |
| + |
| + /// Whether to generate code containing user's `assert` statements. |
| + final bool enableUserAssertions; |
| + |
| + /// Generate output even when there are compile-time errors. |
|
Johnni Winther
2016/03/16 09:37:27
'Generate' -> 'Whether to generate'
Siggi Cherem (dart-lang)
2016/03/17 22:57:14
Done.
|
| + final bool generateCodeWithCompileTimeErrors; |
| + |
| + /// Whether to generate a source-map file together with the output program. |
| + final bool generateSourceMap; |
| + |
| + /// Whether some values are cached for reuse in incremental compilation. |
| + /// Incremental compilation is allows calling `Compiler.run` more than once. |
|
Johnni Winther
2016/03/16 09:37:27
Remove 'is '. Add '(experimental)'.
Siggi Cherem (dart-lang)
2016/03/17 22:57:13
Done.
|
| + final bool hasIncrementalSupport; |
| + |
| + /// URI of the main output if the compiler is generating source maps. |
| + final Uri outputUri; |
| + |
| + /// Location of the plaform configuration file. |
|
Johnni Winther
2016/03/16 09:37:27
'plaform' -> 'platform'
Siggi Cherem (dart-lang)
2016/03/17 22:57:14
Done.
|
| + final Uri platformConfigUri; |
| + |
| + /// Whether to emit URIs in the reflection metadata. |
| + final bool preserveUris; |
| + |
| + /// URI where the compiler should generate the output source map file. |
| + final Uri sourceMapUri; |
| + |
| + /// The compiler is run from the build bot. |
| + final bool testMode; |
| + |
| + /// Whether to trust JS-interop annotations. (experimental) |
| + final bool trustJSInteropTypeAnnotations; |
| + |
| + /// Whether to trust primitive types during inference and optimizations. |
| + final bool trustPrimitives; |
| + |
| + /// Whether to trust type annotations during inference and optimizations. |
| + final bool trustTypeAnnotations; |
| + |
| + /// Whether to generate code compliant with content security policy (CSP). |
| + final bool useContentSecurityPolicy; |
| + |
| + /// Use the new CPS based backend end. This flag works for both the Dart and |
|
Johnni Winther
2016/03/16 09:37:27
Remove mentioning of backends.
Siggi Cherem (dart-lang)
2016/03/17 22:57:13
Done.
|
| + /// JavaScript backend. |
| + final bool useCpsIr; |
| + |
| + /// When obfuscating for minification, whether to use the frequency of a name |
| + /// as an heuristic to pick shorter names. |
| + final bool useFrequencyNamer; |
| + |
| + /// Whether to use the new source-information implementation for source-maps. |
| + /// (experimental) |
| + final bool useNewSourceInfo; |
| + |
| + /// Whether the user requested to use the fast startup emitter. The full |
| + /// emitter might still be used if the program uses dart:mirrors. |
| + final bool useStartupEmitter; |
| + |
| + /// Enable verbose printing during compilation. Includes progress messages |
| + /// during each phase and a time-breakdown between phases at the end. |
| + final bool verbose; |
| + |
| + |
| + // ------------------------------------------------- |
| + // Options for deprecated features |
| + // ------------------------------------------------- |
| + // TODO(sigmund): delete these as we delete the underlying features |
| + |
| + /// Whether to preserve comments while scanning (only use for dart:mirrors). |
| + final bool preserveComments; |
| + |
| + /// Whether to emit JavaScript (false enables dart2dart). |
| + final bool emitJavaScript; |
| + |
| + /// When using dart2dart, whether to use the multi file format. |
| + final bool dart2dartMultiFile; |
| + |
| + /// Strip option used by dart2dart. |
| + final List<String> strips; |
| + |
| + /// Create an options object by parsing flags from [options]. |
| + factory CompilerOptions.parse( |
| + {Uri entryPoint, |
| + Uri libraryRoot, |
| + Uri packageRoot, |
| + Uri packageConfig, |
| + PackagesDiscoveryProvider packagesDiscoveryProvider, |
| + Map<String, dynamic> environment: const <String, dynamic>{}, |
| + List<String> options, |
| + bool disableInlining: false}) { |
|
Johnni Winther
2016/03/16 09:37:27
Add '--disable-inlining' to [Flags] and parse it h
Siggi Cherem (dart-lang)
2016/03/17 22:57:13
Done.
|
| + return new CompilerOptions( |
| + entryPoint: entryPoint, |
| + libraryRoot: libraryRoot, |
| + packageRoot: packageRoot, |
| + packageConfig: packageConfig, |
| + packagesDiscoveryProvider: packagesDiscoveryProvider, |
| + environment: environment, |
| + allowMockCompilation: _hasOption(options, Flags.allowMockCompilation), |
| + allowNativeExtensions: _hasOption(options, Flags.allowNativeExtensions), |
| + analyzeAll: _hasOption(options, Flags.analyzeAll), |
| + analyzeMain: _hasOption(options, Flags.analyzeMain), |
| + analyzeOnly: _hasOption(options, Flags.analyzeOnly), |
| + analyzeSignaturesOnly: _hasOption(options, Flags.analyzeSignaturesOnly), |
| + buildId: _extractStringOption( |
| + options, '--build-id=', _UNDETERMINED_BUILD_ID), |
| + dart2dartMultiFile: _hasOption(options, '--output-type=dart-multi'), |
| + deferredMapUri: _extractUriOption(options, '--deferred-map='), |
| + diagnosticOptions: new DiagnosticOptions( |
| + suppressWarnings: _hasOption(options, Flags.suppressWarnings), |
| + fatalWarnings: _hasOption(options, Flags.fatalWarnings), |
| + suppressHints: _hasOption(options, Flags.suppressHints), |
| + terseDiagnostics: _hasOption(options, Flags.terse), |
| + shownPackageWarnings: |
| + _extractOptionalCsvOption(options, Flags.showPackageWarnings)), |
| + disableInlining: disableInlining, |
| + disableTypeInference: _hasOption(options, Flags.disableTypeInference), |
| + dumpInfo: _hasOption(options, Flags.dumpInfo), |
| + emitJavaScript: !(_hasOption(options, '--output-type=dart') || |
| + _hasOption(options, '--output-type=dart-multi')), |
| + enableAssertMessage: _hasOption(options, Flags.enableAssertMessage), |
| + enableConditionalDirectives: |
| + _hasOption(options, Flags.conditionalDirectives), |
| + enableExperimentalMirrors: |
| + _hasOption(options, Flags.enableExperimentalMirrors), |
| + enableMinification: _hasOption(options, Flags.minify), |
| + enableNativeLiveTypeAnalysis: |
| + !_hasOption(options, Flags.disableNativeLiveTypeAnalysis), |
| + enableTypeAssertions: _hasOption(options, Flags.enableCheckedMode), |
| + enableUserAssertions: _hasOption(options, Flags.enableCheckedMode), |
| + generateCodeWithCompileTimeErrors: |
| + _hasOption(options, Flags.generateCodeWithCompileTimeErrors), |
| + generateSourceMap: !_hasOption(options, Flags.noSourceMaps), |
| + hasIncrementalSupport: _forceIncrementalSupport || |
| + _hasOption(options, Flags.incrementalSupport), |
| + outputUri: _extractUriOption(options, '--out='), |
| + platformConfigUri: _resolvePlatformConfigFromOptions( |
| + libraryRoot, options), |
| + preserveComments: _hasOption(options, Flags.preserveComments), |
| + preserveUris: _hasOption(options, Flags.preserveUris), |
| + sourceMapUri: _extractUriOption(options, '--source-map='), |
| + strips: _extractCsvOption(options, '--force-strip='), |
| + testMode: _hasOption(options, Flags.testMode), |
| + trustJSInteropTypeAnnotations: |
| + _hasOption(options, Flags.trustJSInteropTypeAnnotations), |
| + trustPrimitives: _hasOption(options, Flags.trustPrimitives), |
| + trustTypeAnnotations: _hasOption(options, Flags.trustTypeAnnotations), |
| + useContentSecurityPolicy: |
| + _hasOption(options, Flags.useContentSecurityPolicy), |
| + useCpsIr: _hasOption(options, Flags.useCpsIr), |
| + useFrequencyNamer: |
| + !_hasOption(options, Flags.noFrequencyBasedMinification), |
| + useNewSourceInfo: _hasOption(options, Flags.useNewSourceInfo), |
| + useStartupEmitter: _hasOption(options, Flags.fastStartup), |
| + verbose: _hasOption(options, Flags.verbose)); |
| + } |
| + |
| /// Creates an option object for the compiler. |
| - // TODO(johnniwinther): Expand comment when [options] are explicit as named |
| - // arguments. |
| + /// |
| + /// This validates and normalizes dependent options to be consistent. For |
| + /// example, if [analyzeAll] is true, the resulting options object will also |
| + /// have [analyzeOnly] as true. |
| 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"); |
| + Uri libraryRoot, |
| + Uri packageRoot, |
| + Uri packageConfig, |
| + PackagesDiscoveryProvider packagesDiscoveryProvider, |
| + Map<String, dynamic> environment: const <String, dynamic>{}, |
| + bool allowMockCompilation: false, |
| + bool allowNativeExtensions: false, |
| + bool analyzeAll: false, |
| + bool analyzeMain: false, |
| + bool analyzeOnly: false, |
| + bool analyzeSignaturesOnly: false, |
| + String buildId: _UNDETERMINED_BUILD_ID, |
| + bool dart2dartMultiFile: false, |
| + Uri deferredMapUri: null, |
| + DiagnosticOptions diagnosticOptions: const DiagnosticOptions(), |
| + bool disableInlining: false, |
| + bool disableTypeInference: false, |
| + bool dumpInfo: false, |
| + bool emitJavaScript: true, |
| + bool enableAssertMessage: false, |
| + bool enableConditionalDirectives: false, |
| + bool enableExperimentalMirrors: false, |
| + bool enableMinification: false, |
| + bool enableNativeLiveTypeAnalysis: true, |
| + bool enableTypeAssertions: false, |
| + bool enableUserAssertions: false, |
| + bool generateCodeWithCompileTimeErrors: false, |
| + bool generateSourceMap: true, |
| + bool hasIncrementalSupport: false, |
| + Uri outputUri: null, |
| + Uri platformConfigUri: null, |
| + bool preserveComments: false, |
| + bool preserveUris: false, |
| + Uri sourceMapUri: null, |
| + List<String> strips: const [], |
| + bool testMode: false, |
| + bool trustJSInteropTypeAnnotations: false, |
| + bool trustPrimitives: false, |
| + bool trustTypeAnnotations: false, |
| + bool useContentSecurityPolicy: false, |
| + bool useCpsIr: false, |
| + bool useFrequencyNamer: true, |
| + bool useNewSourceInfo: false, |
| + bool useStartupEmitter: false, |
| + bool verbose: false}) { |
| + // TODO(sigmund): should entrypoint be here? should we validate it is not |
| + // null? In unittests we use the same compiler to analyze or build multiple |
| + // entrypoints. |
| + if (libraryRoot == null) { |
| + throw new ArgumentError("[libraryRoot] is null."); |
| } |
| if (!libraryRoot.path.endsWith("/")) { |
| - throw new ArgumentError("libraryRoot must end with a /"); |
| + throw new ArgumentError("[libraryRoot] must end with a /"); |
| + } |
| + if (packageRoot != null && packageConfig != null) { |
| + throw new ArgumentError("Only one of [packageRoot] or [packageConfig] " |
| + "may be given."); |
| } |
| if (packageRoot != null && !packageRoot.path.endsWith("/")) { |
| - throw new ArgumentError("packageRoot must end with a /"); |
| + throw new ArgumentError("[packageRoot] must end with a /"); |
| } |
| - return new CompilerOptions._( |
| - entryPoint, |
| - libraryRoot, |
| - packageRoot, |
| - packageConfig, |
| - packagesDiscoveryProvider, |
| - options, |
| - environment); |
| + if (!analyzeOnly) { |
| + if (allowNativeExtensions) { |
| + throw new ArgumentError( |
| + "${Flags.allowNativeExtensions} is only supported in combination " |
| + "with ${Flags.analyzeOnly}"); |
| + } |
| + } |
| + return new CompilerOptions._(entryPoint, libraryRoot, packageRoot, |
| + packageConfig, packagesDiscoveryProvider, environment, |
| + allowMockCompilation: allowMockCompilation, |
| + allowNativeExtensions: allowNativeExtensions, |
| + analyzeAll: analyzeAll, |
| + analyzeMain: analyzeMain, |
| + analyzeOnly: analyzeOnly || analyzeSignaturesOnly || analyzeAll, |
| + analyzeSignaturesOnly: analyzeSignaturesOnly, |
| + buildId: buildId, |
| + dart2dartMultiFile: dart2dartMultiFile, |
| + deferredMapUri: deferredMapUri, |
| + diagnosticOptions: diagnosticOptions, |
| + disableInlining: disableInlining || hasIncrementalSupport, |
| + disableTypeInference: disableTypeInference || !emitJavaScript, |
| + dumpInfo: dumpInfo, |
| + emitJavaScript: emitJavaScript, |
| + enableAssertMessage: enableAssertMessage, |
| + enableConditionalDirectives: enableConditionalDirectives, |
| + enableExperimentalMirrors: enableExperimentalMirrors, |
| + enableMinification: enableMinification, |
| + enableNativeLiveTypeAnalysis: enableNativeLiveTypeAnalysis, |
| + enableTypeAssertions: enableTypeAssertions, |
| + enableUserAssertions: enableUserAssertions, |
| + generateCodeWithCompileTimeErrors: generateCodeWithCompileTimeErrors, |
| + generateSourceMap: generateSourceMap, |
| + hasIncrementalSupport: hasIncrementalSupport, |
| + outputUri: outputUri, |
| + platformConfigUri: platformConfigUri ?? _resolvePlatformConfig( |
| + libraryRoot, null, !emitJavaScript, const []), |
| + preserveComments: preserveComments, |
| + preserveUris: preserveUris, |
| + sourceMapUri: sourceMapUri, |
| + strips: strips, |
| + testMode: testMode, |
| + trustJSInteropTypeAnnotations: trustJSInteropTypeAnnotations, |
| + trustPrimitives: trustPrimitives, |
| + trustTypeAnnotations: trustTypeAnnotations, |
| + useContentSecurityPolicy: useContentSecurityPolicy, |
| + useCpsIr: useCpsIr, |
| + useFrequencyNamer: useFrequencyNamer, |
| + useNewSourceInfo: useNewSourceInfo, |
| + useStartupEmitter: useStartupEmitter, |
| + verbose: verbose); |
| } |
| - CompilerOptions._( |
| - this.entryPoint, |
| - this.libraryRoot, |
| - this.packageRoot, |
| - this.packageConfig, |
| - this.packagesDiscoveryProvider, |
| - this.options, |
| - this.environment); |
| + CompilerOptions._(this.entryPoint, this.libraryRoot, this.packageRoot, |
| + this.packageConfig, this.packagesDiscoveryProvider, this.environment, |
| + {this.allowMockCompilation: false, |
| + this.allowNativeExtensions: false, |
| + this.analyzeAll: false, |
| + this.analyzeMain: false, |
| + this.analyzeOnly: false, |
| + this.analyzeSignaturesOnly: false, |
| + this.buildId: _UNDETERMINED_BUILD_ID, |
| + this.dart2dartMultiFile: false, |
| + this.deferredMapUri: null, |
| + this.diagnosticOptions: null, |
| + this.disableInlining: false, |
| + this.disableTypeInference: false, |
| + this.dumpInfo: false, |
| + this.emitJavaScript: true, |
| + this.enableAssertMessage: false, |
| + this.enableConditionalDirectives: false, |
| + this.enableExperimentalMirrors: false, |
| + this.enableMinification: false, |
| + this.enableNativeLiveTypeAnalysis: false, |
| + this.enableTypeAssertions: false, |
| + this.enableUserAssertions: false, |
| + this.generateCodeWithCompileTimeErrors: false, |
| + this.generateSourceMap: true, |
| + this.hasIncrementalSupport: false, |
| + this.outputUri: null, |
| + this.platformConfigUri: null, |
| + this.preserveComments: false, |
| + this.preserveUris: false, |
| + this.sourceMapUri: null, |
| + this.strips: const [], |
| + this.testMode: false, |
| + this.trustJSInteropTypeAnnotations: false, |
| + this.trustPrimitives: false, |
| + this.trustTypeAnnotations: false, |
| + this.useContentSecurityPolicy: false, |
| + this.useCpsIr: false, |
| + this.useFrequencyNamer: false, |
| + this.useNewSourceInfo: false, |
| + this.useStartupEmitter: false, |
| + this.verbose: false}); |
| } |
| /// Returns a future that completes to a [CompilationResult] when the Dart |
| @@ -154,7 +528,6 @@ Future<CompilationResult> compile( |
| CompilerInput compilerInput, |
| CompilerDiagnostics compilerDiagnostics, |
| CompilerOutput compilerOutput) { |
| - |
| if (compilerOptions == null) { |
| throw new ArgumentError("compilerOptions must be non-null"); |
| } |
| @@ -169,16 +542,92 @@ Future<CompilationResult> compile( |
| } |
| CompilerImpl compiler = new CompilerImpl( |
| - compilerInput, |
| - compilerOutput, |
| - compilerDiagnostics, |
| - compilerOptions.libraryRoot, |
| - compilerOptions.packageRoot, |
| - compilerOptions.options, |
| - compilerOptions.environment, |
| - compilerOptions.packageConfig, |
| - compilerOptions.packagesDiscoveryProvider); |
| + compilerInput, compilerOutput, compilerDiagnostics, compilerOptions); |
| return compiler.run(compilerOptions.entryPoint).then((bool success) { |
| return new CompilationResult(compiler, isSuccess: success); |
| }); |
| } |
| + |
| +String _extractStringOption( |
| + List<String> options, String prefix, String defaultValue) { |
| + for (String option in options) { |
| + if (option.startsWith(prefix)) { |
| + return option.substring(prefix.length); |
| + } |
| + } |
| + return defaultValue; |
| +} |
| + |
| +Uri _extractUriOption(List<String> options, String prefix) { |
| + var option = _extractStringOption(options, prefix, null); |
| + return (option == null) ? null : Uri.parse(option); |
| +} |
| + |
| +// CSV: Comma separated values. |
| +List<String> _extractCsvOption(List<String> options, String prefix) { |
| + for (String option in options) { |
| + if (option.startsWith(prefix)) { |
| + return option.substring(prefix.length).split(','); |
| + } |
| + } |
| + return const <String>[]; |
| +} |
| + |
| +/// Extract list of comma separated values provided for [flag]. Returns an |
| +/// empty list if [option] contain [flag] without arguments. Returns `null` if |
| +/// [option] doesn't contain [flag] with or without arguments. |
| +List<String> _extractOptionalCsvOption(List<String> options, String flag) { |
| + String prefix = '$flag='; |
| + for (String option in options) { |
| + if (option == flag) { |
| + return const <String>[]; |
| + } |
| + if (option.startsWith(flag)) { |
| + return option.substring(prefix.length).split(','); |
| + } |
| + } |
| + return null; |
| +} |
| + |
| +Uri _resolvePlatformConfigFromOptions(Uri libraryRoot, List<String> options) { |
| + return _resolvePlatformConfig(libraryRoot, |
| + _extractStringOption(options, "--platform-config=", null), |
| + _hasOption(options, '--output-type=dart'), |
| + _extractCsvOption(options, '--categories=')); |
| +} |
| + |
| +Uri _resolvePlatformConfig(Uri libraryRoot, |
| + String platformConfigPath, bool isDart2Dart, Iterable<String> categories) { |
| + if (platformConfigPath != null) { |
| + return libraryRoot.resolve(platformConfigPath); |
| + } else if (isDart2Dart) { |
| + return libraryRoot.resolve(_dart2dartPlatform); |
| + } else { |
| + if (categories.length == 0) { |
| + return libraryRoot.resolve(_clientPlatform); |
| + } |
| + assert(categories.length <= 2); |
| + if (categories.contains("Client")) { |
| + if (categories.contains("Server")) { |
| + return libraryRoot.resolve(_sharedPlatform); |
| + } |
| + return libraryRoot.resolve(_clientPlatform); |
| + } |
| + assert(categories.contains("Server")); |
| + return libraryRoot.resolve(_serverPlatform); |
| + } |
| +} |
| + |
| +bool _hasOption(List<String> options, String option) { |
| + return options.indexOf(option) >= 0; |
| +} |
| + |
| +/// Locations of the platform descriptor files relative to the library root. |
| +const String _clientPlatform = "lib/dart_client.platform"; |
| +const String _serverPlatform = "lib/dart_server.platform"; |
| +const String _sharedPlatform = "lib/dart_shared.platform"; |
| +const String _dart2dartPlatform = "lib/dart2dart.platform"; |
| + |
| +const String _UNDETERMINED_BUILD_ID = "build number could not be determined"; |
| +const bool _forceIncrementalSupport = |
| + const bool.fromEnvironment('DART2JS_EXPERIMENTAL_INCREMENTAL_SUPPORT'); |