| Index: lib/src/options.dart
|
| diff --git a/lib/src/options.dart b/lib/src/options.dart
|
| index 7916e58753eb51bbe63eed62aa7d94e8ba2044ed..994f74a90db7b17be7775b8eb91593199c67cd88 100644
|
| --- a/lib/src/options.dart
|
| +++ b/lib/src/options.dart
|
| @@ -9,17 +9,20 @@ import 'dart:io';
|
|
|
| import 'package:args/args.dart';
|
| import 'package:cli_util/cli_util.dart' show getSdkDir;
|
| -import 'package:dev_compiler/config.dart';
|
| import 'package:logging/logging.dart' show Level;
|
| import 'package:path/path.dart' as path;
|
| import 'package:yaml/yaml.dart';
|
|
|
| -/// Options used by our checker.
|
| -// TODO(jmesserly): move useMultiPackage/packageRoot to CompilerOptions.
|
| -class ResolverOptions {
|
| +import 'package:dev_compiler/strong_mode.dart' show StrongModeOptions;
|
| +
|
| +/// Options used to set up Source URI resolution in the analysis context.
|
| +class SourceResolverOptions {
|
| /// Whether to resolve 'package:' uris using the multi-package resolver.
|
| final bool useMultiPackage;
|
|
|
| + /// Custom URI mappings, such as "dart:foo" -> "path/to/foo.dart"
|
| + final Map<String, String> customUrlMappings;
|
| +
|
| /// Package root when resolving 'package:' urls the standard way.
|
| final String packageRoot;
|
|
|
| @@ -29,70 +32,51 @@ class ResolverOptions {
|
| /// List of additional non-Dart resources to resolve and serve.
|
| final List<String> resources;
|
|
|
| - /// Whether to infer return types and field types from overriden members.
|
| - final bool inferFromOverrides;
|
| - static const inferFromOverridesDefault = true;
|
| -
|
| - /// Whether to infer types for consts and fields by looking at initializers on
|
| - /// the RHS. For example, in a constant declaration like:
|
| - ///
|
| - /// const A = B;
|
| - ///
|
| - /// We can infer the type of `A` based on the type of `B`.
|
| - ///
|
| - /// The inference algorithm determines what variables depend on others, and
|
| - /// computes types by visiting the variable dependency graph in topological
|
| - /// order. This ensures that the inferred type is deterministic when applying
|
| - /// inference on library cycles.
|
| - ///
|
| - /// When this feature is turned off, we don't use the type of `B` to infer the
|
| - /// type of `A`, even if `B` has a declared type.
|
| - final bool inferTransitively;
|
| - static const inferTransitivelyDefault = true;
|
| -
|
| - /// Restrict inference of fields and top-levels to those that are final and
|
| - /// const.
|
| - final bool onlyInferConstsAndFinalFields;
|
| - static const onlyInferConstAndFinalFieldsDefault = false;
|
| -
|
| /// File where to start compilation from.
|
| + // TODO(jmesserly): this is used to configure SourceFactory resolvers only
|
| + // when [useImplicitHtml] is set. Probably useImplicitHtml should be factored
|
| + // out into ServerOptions or something along those lines.
|
| final String entryPointFile;
|
|
|
| // True if the resolver should implicitly provide an html entry point.
|
| final bool useImplicitHtml;
|
| static const String implicitHtmlFile = 'index.html';
|
|
|
| - ResolverOptions({this.useMultiPackage: false, this.packageRoot: 'packages/',
|
| - this.packagePaths: const <String>[], this.resources: const <String>[],
|
| - this.inferFromOverrides: inferFromOverridesDefault,
|
| - this.inferTransitively: inferTransitivelyDefault,
|
| - this.onlyInferConstsAndFinalFields: onlyInferConstAndFinalFieldsDefault,
|
| - this.entryPointFile: null, this.useImplicitHtml: false});
|
| -}
|
| -
|
| -// TODO(vsm): Merge RulesOptions and TypeOptions
|
| -/// Options used by our RestrictedRules.
|
| -class RulesOptions extends TypeOptions {
|
| - /// Whether to infer types downwards from local context
|
| - final bool inferDownwards;
|
| - static const inferDownwardsDefault = true;
|
| + /// Whether to use a mock-sdk during compilation.
|
| + final bool useMockSdk;
|
|
|
| - /// Whether to inject casts between Dart assignable types.
|
| - final bool relaxedCasts;
|
| + /// Path to the dart-sdk. Null if `useMockSdk` is true or if the path couldn't
|
| + /// be determined
|
| + final String dartSdkPath;
|
|
|
| - RulesOptions(
|
| - {this.inferDownwards: inferDownwardsDefault, this.relaxedCasts: true});
|
| + const SourceResolverOptions({this.useMockSdk: false, this.dartSdkPath,
|
| + this.useMultiPackage: false, this.customUrlMappings: const {},
|
| + this.packageRoot: 'packages/', this.packagePaths: const <String>[],
|
| + this.resources: const <String>[], this.entryPointFile: null,
|
| + this.useImplicitHtml: false});
|
| }
|
|
|
| -class JSCodeOptions {
|
| +// TODO(jmesserly): refactor all codegen options here.
|
| +class CodegenOptions {
|
| /// Whether to emit the source map files.
|
| final bool emitSourceMaps;
|
|
|
| - JSCodeOptions({this.emitSourceMaps: true});
|
| + /// Whether to force compilation of code with static errors.
|
| + final bool forceCompile;
|
| +
|
| + /// Output directory for generated code.
|
| + final String outputDir;
|
| +
|
| + const CodegenOptions(
|
| + {this.emitSourceMaps: true, this.forceCompile: false, this.outputDir});
|
| }
|
|
|
| -/// General options used by the dev compiler.
|
| -class CompilerOptions implements RulesOptions, ResolverOptions, JSCodeOptions {
|
| +/// General options used by the dev compiler and server.
|
| +class CompilerOptions {
|
| + final StrongModeOptions strongOptions;
|
| + final SourceResolverOptions sourceOptions;
|
| + final CodegenOptions codegenOptions;
|
| +
|
| /// Whether to check the sdk libraries.
|
| final bool checkSdk;
|
|
|
| @@ -103,37 +87,18 @@ class CompilerOptions implements RulesOptions, ResolverOptions, JSCodeOptions {
|
| /// summary information (only used if [dumpInfo] is true).
|
| final String dumpInfoFile;
|
|
|
| - /// Whether to force compilation of code with static errors.
|
| - final bool forceCompile;
|
| -
|
| - /// Output directory for generated code.
|
| - final String outputDir;
|
| -
|
| /// Whether to use colors when interacting on the console.
|
| final bool useColors;
|
|
|
| /// Whether the user asked for help.
|
| final bool help;
|
|
|
| - /// Whether to use a mock-sdk during compilation.
|
| - final bool useMockSdk;
|
| -
|
| - /// Path to the dart-sdk. Null if `useMockSdk` is true or if the path couldn't
|
| - /// be determined
|
| - final String dartSdkPath;
|
| -
|
| /// Minimum log-level reported on the command-line.
|
| final Level logLevel;
|
|
|
| - /// File where to start compilation from.
|
| - final String entryPointFile;
|
| -
|
| /// Whether to run as a development server.
|
| final bool serverMode;
|
|
|
| - /// Whether to create an implicit HTML entry file in server mode.
|
| - final bool useImplicitHtml;
|
| -
|
| /// Whether to enable hash-based caching of files.
|
| final bool enableHashing;
|
|
|
| @@ -143,75 +108,18 @@ class CompilerOptions implements RulesOptions, ResolverOptions, JSCodeOptions {
|
| /// Host name or address for HTTP server when [serverMode] is on.
|
| final String host;
|
|
|
| - /// Whether to inject casts between Dart assignable types.
|
| - @override
|
| - final bool relaxedCasts;
|
| -
|
| - /// Whether to resolve 'package:' uris using the multi-package resolver.
|
| - @override
|
| - final bool useMultiPackage;
|
| -
|
| - /// Package root when resolving 'package:' urls the standard way.
|
| - @override
|
| - final String packageRoot;
|
| -
|
| - /// List of paths used for the multi-package resolver.
|
| - @override
|
| - final List<String> packagePaths;
|
| -
|
| - /// List of additional non-Dart resources to resolve and serve.
|
| - @override
|
| - final List<String> resources;
|
| -
|
| - /// Whether to infer types downwards from local context
|
| - @override
|
| - final bool inferDownwards;
|
| -
|
| - /// Whether to infer return types and field types from overriden members.
|
| - @override
|
| - final bool inferFromOverrides;
|
| -
|
| - /// Whether to infer types for consts and static fields by looking at
|
| - /// identifiers on the RHS.
|
| - @override
|
| - final bool inferTransitively;
|
| -
|
| - /// Restrict inference of fields and top-levels to those that are final and
|
| - /// const.
|
| - @override
|
| - final bool onlyInferConstsAndFinalFields;
|
| -
|
| - /// List of non-nullable types.
|
| - @override
|
| - final List<String> nonnullableTypes;
|
| -
|
| - /// Whether to emit the source map files.
|
| - @override
|
| - final bool emitSourceMaps;
|
| -
|
| /// Location for runtime files, such as `dart_runtime.js`. By default this is
|
| /// inferred to be under `lib/runtime/` in the location of the `dev_compiler`
|
| /// package (if we can infer where that is located).
|
| final String runtimeDir;
|
|
|
| - /// Custom URI mappings, such as "dart:foo" -> "path/to/foo.dart"
|
| - final Map<String, String> customUrlMappings;
|
| -
|
| - CompilerOptions({this.checkSdk: false, this.dumpInfo: false,
|
| - this.dumpInfoFile, this.forceCompile: false, this.outputDir,
|
| - this.useColors: true, this.relaxedCasts: true,
|
| - this.useMultiPackage: false, this.packageRoot: 'packages/',
|
| - this.packagePaths: const <String>[], this.resources: const <String>[],
|
| - this.inferDownwards: RulesOptions.inferDownwardsDefault,
|
| - this.inferFromOverrides: ResolverOptions.inferFromOverridesDefault,
|
| - this.inferTransitively: ResolverOptions.inferTransitivelyDefault,
|
| - this.onlyInferConstsAndFinalFields: ResolverOptions.onlyInferConstAndFinalFieldsDefault,
|
| - this.nonnullableTypes: TypeOptions.NONNULLABLE_TYPES, this.help: false,
|
| - this.useMockSdk: false, this.dartSdkPath, this.logLevel: Level.SEVERE,
|
| - this.emitSourceMaps: true, this.entryPointFile: null,
|
| - this.serverMode: false, this.useImplicitHtml: false,
|
| + CompilerOptions({this.strongOptions: const StrongModeOptions(),
|
| + this.sourceOptions: const SourceResolverOptions(),
|
| + this.codegenOptions: const CodegenOptions(), this.checkSdk: false,
|
| + this.dumpInfo: false, this.dumpInfoFile, this.useColors: true,
|
| + this.help: false, this.logLevel: Level.SEVERE, this.serverMode: false,
|
| this.enableHashing: false, this.host: 'localhost', this.port: 8080,
|
| - this.runtimeDir, this.customUrlMappings: const {}});
|
| + this.runtimeDir});
|
| }
|
|
|
| /// Parses options from the command-line
|
| @@ -261,66 +169,42 @@ CompilerOptions parseOptions(List<String> argv) {
|
| var entryPointFile = args.rest.length == 0 ? null : args.rest.first;
|
|
|
| return new CompilerOptions(
|
| + codegenOptions: new CodegenOptions(
|
| + emitSourceMaps: args['source-maps'],
|
| + forceCompile: args['force-compile'] || serverMode,
|
| + outputDir: outputDir),
|
| + sourceOptions: new SourceResolverOptions(
|
| + useMockSdk: args['mock-sdk'],
|
| + dartSdkPath: sdkPath,
|
| + entryPointFile: entryPointFile,
|
| + useImplicitHtml: serverMode && entryPointFile.endsWith('.dart'),
|
| + customUrlMappings: customUrlMappings,
|
| + useMultiPackage: args['use-multi-package'],
|
| + packageRoot: args['package-root'],
|
| + packagePaths: args['package-paths'].split(','),
|
| + resources: args['resources']
|
| + .split(',')
|
| + .where((s) => s.isNotEmpty)
|
| + .toList()),
|
| + strongOptions: new StrongModeOptions.fromArguments(args),
|
| checkSdk: args['sdk-check'],
|
| dumpInfo: dumpInfo,
|
| dumpInfoFile: args['dump-info-file'],
|
| - forceCompile: args['force-compile'] || serverMode,
|
| - outputDir: outputDir,
|
| - relaxedCasts: args['relaxed-casts'],
|
| useColors: useColors,
|
| - customUrlMappings: customUrlMappings,
|
| - useMultiPackage: args['use-multi-package'],
|
| - packageRoot: args['package-root'],
|
| - packagePaths: args['package-paths'].split(','),
|
| - resources: args['resources']
|
| - .split(',')
|
| - .where((s) => s.isNotEmpty)
|
| - .toList(),
|
| - inferDownwards: args['infer-downwards'],
|
| - inferFromOverrides: args['infer-from-overrides'],
|
| - inferTransitively: args['infer-transitively'],
|
| - onlyInferConstsAndFinalFields: args['infer-only-finals'],
|
| - nonnullableTypes: optionsToList(args['nonnullable'],
|
| - defaultValue: TypeOptions.NONNULLABLE_TYPES),
|
| help: showUsage,
|
| - useMockSdk: args['mock-sdk'],
|
| - dartSdkPath: sdkPath,
|
| logLevel: logLevel,
|
| - emitSourceMaps: args['source-maps'],
|
| - entryPointFile: entryPointFile,
|
| serverMode: serverMode,
|
| - useImplicitHtml: serverMode && entryPointFile.endsWith('.dart'),
|
| enableHashing: enableHashing,
|
| host: args['host'],
|
| port: int.parse(args['port']),
|
| runtimeDir: runtimeDir);
|
| }
|
|
|
| -final ArgParser argParser = new ArgParser()
|
| - // resolver/checker options
|
| +final ArgParser argParser = StrongModeOptions.addArguments(new ArgParser()
|
| ..addFlag('sdk-check',
|
| abbr: 's', help: 'Typecheck sdk libs', defaultsTo: false)
|
| ..addFlag('mock-sdk',
|
| abbr: 'm', help: 'Use a mock Dart SDK', defaultsTo: false)
|
| - ..addFlag('relaxed-casts',
|
| - help: 'Cast between Dart assignable types', defaultsTo: true)
|
| - ..addOption('nonnullable',
|
| - abbr: 'n',
|
| - help: 'Comma separated string of non-nullable types',
|
| - defaultsTo: null)
|
| - ..addFlag('infer-downwards',
|
| - help: 'Infer types downwards from local context',
|
| - defaultsTo: RulesOptions.inferDownwardsDefault)
|
| - ..addFlag('infer-from-overrides',
|
| - help: 'Infer unspecified types of fields and return types from\n'
|
| - 'definitions in supertypes',
|
| - defaultsTo: ResolverOptions.inferFromOverridesDefault)
|
| - ..addFlag('infer-transitively',
|
| - help: 'Infer consts/fields from definitions in other libraries',
|
| - defaultsTo: ResolverOptions.inferTransitivelyDefault)
|
| - ..addFlag('infer-only-finals',
|
| - help: 'Do not infer non-const or non-final fields',
|
| - defaultsTo: ResolverOptions.onlyInferConstAndFinalFieldsDefault)
|
|
|
| // input/output options
|
| ..addOption('out', abbr: 'o', help: 'Output directory', defaultsTo: null)
|
| @@ -368,7 +252,7 @@ final ArgParser argParser = new ArgParser()
|
| ..addOption('dump-info-file',
|
| abbr: 'f',
|
| help: 'Dump info json file (requires dump-info)',
|
| - defaultsTo: null);
|
| + defaultsTo: null));
|
|
|
| /// Tries to find the `lib/runtime/` directory of the dev_compiler package. This
|
| /// works when running devc from it's sources or from a snapshot that is
|
|
|