Index: pkg/analyzer_cli/lib/src/options.dart |
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart |
deleted file mode 100644 |
index 95122553b66725fdfbd8fbd5102827fd90271b8c..0000000000000000000000000000000000000000 |
--- a/pkg/analyzer_cli/lib/src/options.dart |
+++ /dev/null |
@@ -1,568 +0,0 @@ |
-// 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. |
- |
-library analyzer_cli.src.options; |
- |
-import 'dart:io'; |
- |
-import 'package:analyzer/file_system/physical_file_system.dart'; |
-import 'package:analyzer/src/command_line/arguments.dart'; |
-import 'package:analyzer/src/context/builder.dart'; |
-import 'package:analyzer_cli/src/ansi.dart' as ansi; |
-import 'package:analyzer_cli/src/driver.dart'; |
-import 'package:args/args.dart'; |
-import 'package:cli_util/cli_util.dart' show getSdkDir; |
- |
-const _binaryName = 'dartanalyzer'; |
- |
-/// Shared exit handler. |
-/// |
-/// *Visible for testing.* |
-ExitHandler exitHandler = exit; |
- |
-/// Print the given [message] to stderr and exit with the given [exitCode]. |
-void printAndFail(String message, {int exitCode: 15}) { |
- errorSink.writeln(message); |
- exitHandler(exitCode); |
-} |
- |
-/// Exit handler. |
-/// |
-/// *Visible for testing.* |
-typedef void ExitHandler(int code); |
- |
-/// Analyzer commandline configuration options. |
-class CommandLineOptions { |
- final bool enableNewAnalysisDriver = true; |
- |
- /// Return `true` if the parser is to parse asserts in the initializer list of |
- /// a constructor. |
- final bool enableAssertInitializer; |
- |
- /// The path to output analysis results when in build mode. |
- final String buildAnalysisOutput; |
- |
- /// Whether to use build mode. |
- final bool buildMode; |
- |
- /// Whether to use build mode as a Bazel persistent worker. |
- final bool buildModePersistentWorker; |
- |
- /// List of summary file paths to use in build mode. |
- final List<String> buildSummaryInputs; |
- |
- /// Whether to skip analysis when creating summaries in build mode. |
- final bool buildSummaryOnly; |
- |
- /// Whether to use diet parsing, i.e. skip function bodies. We don't need to |
- /// analyze function bodies to use summaries during future compilation steps. |
- final bool buildSummaryOnlyDiet; |
- |
- /// Whether to only produce unlinked summaries instead of linked summaries. |
- /// Must be used in combination with `buildSummaryOnly`. |
- final bool buildSummaryOnlyUnlinked; |
- |
- /// The path to output the summary when creating summaries in build mode. |
- final String buildSummaryOutput; |
- |
- /// The path to output the semantic-only summary when creating summaries in |
- /// build mode. |
- final String buildSummaryOutputSemantic; |
- |
- /// Whether to suppress a nonzero exit code in build mode. |
- final bool buildSuppressExitCode; |
- |
- /// The options defining the context in which analysis is performed. |
- final ContextBuilderOptions contextBuilderOptions; |
- |
- /// The path to the dart SDK. |
- String dartSdkPath; |
- |
- /// The path to the dart SDK summary file. |
- String dartSdkSummaryPath; |
- |
- /// Whether to disable cache flushing. This option can improve analysis |
- /// speed at the expense of memory usage. It may also be useful for working |
- /// around bugs. |
- final bool disableCacheFlushing; |
- |
- /// Whether to report hints |
- final bool disableHints; |
- |
- /// Whether to display version information |
- final bool displayVersion; |
- |
- /// Whether to treat type mismatches found during constant evaluation as |
- /// errors. |
- final bool enableTypeChecks; |
- |
- /// Whether to treat hints as fatal |
- final bool hintsAreFatal; |
- |
- /// Whether to ignore unrecognized flags |
- final bool ignoreUnrecognizedFlags; |
- |
- /// Whether to report lints |
- final bool lints; |
- |
- /// Whether to log additional analysis messages and exceptions |
- final bool log; |
- |
- /// Whether to use machine format for error display |
- final bool machineFormat; |
- |
- /// The path to a file to write a performance log. |
- /// (Or null if not enabled.) |
- final String perfReport; |
- |
- /// Batch mode (for unit testing) |
- final bool shouldBatch; |
- |
- /// Whether to show package: warnings |
- final bool showPackageWarnings; |
- |
- /// If not null, show package: warnings only for matching packages. |
- final String showPackageWarningsPrefix; |
- |
- /// Whether to show SDK warnings |
- final bool showSdkWarnings; |
- |
- /// The source files to analyze |
- List<String> _sourceFiles; |
- |
- /// Whether to treat warnings as fatal |
- final bool warningsAreFatal; |
- |
- /// Whether to use strong static checking. |
- final bool strongMode; |
- |
- /// Whether implicit casts are enabled (in strong mode) |
- final bool implicitCasts; |
- |
- /// Whether implicit dynamic is enabled (mainly for strong mode users) |
- final bool implicitDynamic; |
- |
- /// Whether to treat lints as fatal |
- final bool lintsAreFatal; |
- |
- /// Whether to use memory byte store for analysis driver. |
- final bool useAnalysisDriverMemoryByteStore; |
- |
- /// Emit output in a verbose mode. |
- final bool verbose; |
- |
- /// Use ANSI color codes for output. |
- final bool color; |
- |
- /// Initialize options from the given parsed [args]. |
- CommandLineOptions._fromArgs(ArgResults args) |
- : buildAnalysisOutput = args['build-analysis-output'], |
- buildMode = args['build-mode'], |
- buildModePersistentWorker = args['persistent_worker'], |
- buildSummaryInputs = args['build-summary-input'] as List<String>, |
- buildSummaryOnly = args['build-summary-only'], |
- buildSummaryOnlyDiet = args['build-summary-only-diet'], |
- buildSummaryOnlyUnlinked = args['build-summary-only-unlinked'], |
- buildSummaryOutput = args['build-summary-output'], |
- buildSummaryOutputSemantic = args['build-summary-output-semantic'], |
- buildSuppressExitCode = args['build-suppress-exit-code'], |
- contextBuilderOptions = createContextBuilderOptions(args), |
- dartSdkPath = args['dart-sdk'], |
- dartSdkSummaryPath = args['dart-sdk-summary'], |
- disableCacheFlushing = args['disable-cache-flushing'], |
- disableHints = args['no-hints'], |
- displayVersion = args['version'], |
- enableTypeChecks = args['enable_type_checks'], |
- enableAssertInitializer = args['enable-assert-initializers'], |
- hintsAreFatal = args['fatal-hints'], |
- ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'], |
- lints = args[lintsFlag], |
- log = args['log'], |
- machineFormat = args['format'] == 'machine', |
- perfReport = args['x-perf-report'], |
- shouldBatch = args['batch'], |
- showPackageWarnings = args['show-package-warnings'] || |
- args['package-warnings'] || |
- args['x-package-warnings-prefix'] != null, |
- showPackageWarningsPrefix = args['x-package-warnings-prefix'], |
- showSdkWarnings = args['sdk-warnings'], |
- _sourceFiles = args.rest, |
- warningsAreFatal = args['fatal-warnings'], |
- strongMode = args['strong'], |
- implicitCasts = !args['no-implicit-casts'], |
- implicitDynamic = !args['no-implicit-dynamic'], |
- lintsAreFatal = args['fatal-lints'], |
- useAnalysisDriverMemoryByteStore = |
- args['use-analysis-driver-memory-byte-store'], |
- verbose = args['verbose'], |
- color = args['color']; |
- |
- /// The path to an analysis options file |
- String get analysisOptionsFile => |
- contextBuilderOptions.defaultAnalysisOptionsFilePath; |
- |
- /// A table mapping the names of defined variables to their values. |
- Map<String, String> get definedVariables => |
- contextBuilderOptions.declaredVariables; |
- |
- /// Whether to strictly follow the specification when generating warnings on |
- /// "call" methods (fixes dartbug.com/21938). |
- bool get enableStrictCallChecks => |
- contextBuilderOptions.defaultOptions.enableStrictCallChecks; |
- |
- /// Whether to relax restrictions on mixins (DEP 34). |
- bool get enableSuperMixins => |
- contextBuilderOptions.defaultOptions.enableSuperMixins; |
- |
- /// The path to a `.packages` configuration file |
- String get packageConfigPath => contextBuilderOptions.defaultPackageFilePath; |
- |
- /// The path to the package root |
- String get packageRootPath => |
- contextBuilderOptions.defaultPackagesDirectoryPath; |
- |
- /// Parse [args] into [CommandLineOptions] describing the specified |
- /// analyzer options. In case of a format error, calls [printAndFail], which |
- /// by default prints an error message to stderr and exits. |
- static CommandLineOptions parse(List<String> args, |
- [printAndFail(String msg) = printAndFail]) { |
- CommandLineOptions options = _parse(args); |
- // Check SDK. |
- if (!options.buildModePersistentWorker) { |
- // Infer if unspecified. |
- if (options.dartSdkPath == null) { |
- Directory sdkDir = getSdkDir(args); |
- if (sdkDir != null) { |
- options.dartSdkPath = sdkDir.path; |
- } |
- } |
- |
- String sdkPath = options.dartSdkPath; |
- |
- // Check that SDK is specified. |
- if (sdkPath == null) { |
- printAndFail('No Dart SDK found.'); |
- return null; // Only reachable in testing. |
- } |
- // Check that SDK is existing directory. |
- if (!(new Directory(sdkPath)).existsSync()) { |
- printAndFail('Invalid Dart SDK path: $sdkPath'); |
- return null; // Only reachable in testing. |
- } |
- } |
- |
- // Check package config. |
- { |
- if (options.packageRootPath != null && |
- options.packageConfigPath != null) { |
- printAndFail("Cannot specify both '--package-root' and '--packages."); |
- return null; // Only reachable in testing. |
- } |
- } |
- |
- // Build mode. |
- if (options.buildModePersistentWorker && !options.buildMode) { |
- printAndFail('The option --persisten_worker can be used only ' |
- 'together with --build-mode.'); |
- return null; // Only reachable in testing. |
- } |
- if (options.buildSummaryOnlyDiet && !options.buildSummaryOnly) { |
- printAndFail('The option --build-summary-only-diet can be used only ' |
- 'together with --build-summary-only.'); |
- return null; // Only reachable in testing. |
- } |
- |
- if (options.buildSummaryOnlyUnlinked) { |
- if (!options.buildSummaryOnly) { |
- printAndFail( |
- 'The option --build-summary-only-unlinked can be used only ' |
- 'together with --build-summary-only.'); |
- return null; // Only reachable in testing. |
- } |
- if (options.buildSummaryInputs.isNotEmpty) { |
- printAndFail('No summaries should be provided in combination with ' |
- '--build-summary-only-unlinked, they aren\'t needed.'); |
- return null; // Only reachable in testing. |
- } |
- } |
- |
- return options; |
- } |
- |
- /// The source files to analyze |
- List<String> get sourceFiles => _sourceFiles; |
- |
- /// Replace the sourceFiles parsed from the command line. |
- void rewriteSourceFiles(List<String> newSourceFiles) { |
- _sourceFiles = newSourceFiles; |
- } |
- |
- static String _getVersion() { |
- try { |
- // This is relative to bin/snapshot, so ../.. |
- String versionPath = |
- Platform.script.resolve('../../version').toFilePath(); |
- File versionFile = new File(versionPath); |
- return versionFile.readAsStringSync().trim(); |
- } catch (_) { |
- // This happens when the script is not running in the context of an SDK. |
- return "<unknown>"; |
- } |
- } |
- |
- static CommandLineOptions _parse(List<String> args) { |
- args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args); |
- |
- bool verbose = args.contains('-v') || args.contains('--verbose'); |
- bool hide = !verbose; |
- |
- ArgParser parser = new ArgParser(allowTrailingOptions: true); |
- |
- if (!hide) { |
- parser.addSeparator('General options:'); |
- } |
- |
- // TODO(devoncarew): This defines some hidden flags, which would be better |
- // defined with the rest of the hidden flags below (to group well with the |
- // other flags). |
- defineAnalysisArguments(parser, hide: hide); |
- |
- parser |
- ..addOption('format', |
- help: 'Specifies the format in which errors are displayed; the only ' |
- 'currently allowed value is \'machine\'.') |
- ..addFlag('version', |
- help: 'Print the analyzer version.', |
- defaultsTo: false, |
- negatable: false) |
- ..addFlag('no-hints', |
- help: 'Do not show hint results.', |
- defaultsTo: false, |
- negatable: false) |
- ..addFlag('fatal-hints', |
- help: 'Treat hints as fatal.', defaultsTo: false, negatable: false) |
- ..addFlag('fatal-warnings', |
- help: 'Treat non-type warnings as fatal.', |
- defaultsTo: false, |
- negatable: false) |
- ..addFlag('fatal-lints', |
- help: 'Treat lints as fatal.', defaultsTo: false, negatable: false) |
- ..addFlag('package-warnings', |
- help: 'Show warnings from package: imports.', |
- defaultsTo: false, |
- negatable: false) |
- ..addFlag('help', |
- abbr: 'h', |
- help: |
- 'Display this help message. Add --verbose to show hidden options.', |
- defaultsTo: false, |
- negatable: false) |
- ..addFlag('verbose', |
- abbr: 'v', |
- defaultsTo: false, |
- help: 'Verbose output.', |
- negatable: false); |
- |
- // Build mode options. |
- if (!hide) { |
- parser.addSeparator('Build mode flags:'); |
- } |
- |
- parser |
- ..addFlag('persistent_worker', |
- help: 'Enable Bazel persistent worker mode.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addOption('build-analysis-output', |
- help: |
- 'Specifies the path to the file where analysis results should be written.', |
- hide: hide) |
- ..addFlag('build-mode', |
- // TODO(paulberry): add more documentation. |
- help: 'Enable build mode.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addOption('build-summary-input', |
- help: 'Path to a summary file that contains information from a ' |
- 'previous analysis run; may be specified multiple times.', |
- allowMultiple: true, |
- hide: hide) |
- ..addOption('build-summary-output', |
- help: 'Specifies the path to the file where the full summary ' |
- 'information should be written.', |
- hide: hide) |
- ..addOption('build-summary-output-semantic', |
- help: 'Specifies the path to the file where the semantic summary ' |
- 'information should be written.', |
- hide: hide) |
- ..addFlag('build-summary-only', |
- help: 'Disable analysis (only generate summaries).', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('build-summary-only-diet', |
- help: 'Diet parse function bodies.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('build-summary-only-unlinked', |
- help: 'Only output the unlinked summary.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('build-suppress-exit-code', |
- help: 'Exit with code 0 even if errors are found.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('color', |
- help: 'Use ansi colors when printing messages.', |
- defaultsTo: ansi.terminalSupportsAnsi(), |
- hide: hide); |
- |
- // Hidden flags. |
- if (!hide) { |
- parser.addSeparator('Less frequently used flags:'); |
- } |
- |
- parser |
- ..addFlag('batch', |
- help: 'Read commands from standard input (for testing).', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag(ignoreUnrecognizedFlagsFlag, |
- help: 'Ignore unrecognized command line flags.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('disable-cache-flushing', defaultsTo: false, hide: hide) |
- ..addOption('x-perf-report', |
- help: 'Writes a performance report to the given file (experimental).', |
- hide: hide) |
- ..addOption('x-package-warnings-prefix', |
- help: |
- 'Show warnings from package: imports that match the given prefix.', |
- hide: hide) |
- ..addFlag('enable-conditional-directives', |
- help: |
- 'deprecated -- Enable support for conditional directives (DEP 40).', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('show-package-warnings', |
- help: 'Show warnings from package: imports (deprecated).', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('sdk-warnings', |
- help: 'Show warnings from SDK imports.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('log', |
- help: 'Log additional messages and exceptions.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('enable_type_checks', |
- help: 'Check types in constant evaluation.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('enable-assert-initializers', |
- help: 'Enable parsing of asserts in constructor initializers.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addFlag('use-analysis-driver-memory-byte-store', |
- help: 'Use memory byte store, not the file system cache.', |
- defaultsTo: false, |
- negatable: false, |
- hide: hide) |
- ..addOption('url-mapping', |
- help: '--url-mapping=libraryUri,/path/to/library.dart directs the ' |
- 'analyzer to use "library.dart" as the source for an import ' |
- 'of "libraryUri".', |
- allowMultiple: true, |
- splitCommas: false, |
- hide: hide); |
- |
- try { |
- if (args.contains('--$ignoreUnrecognizedFlagsFlag')) { |
- args = filterUnknownArguments(args, parser); |
- } |
- ArgResults results = parser.parse(args); |
- |
- // Persistent worker. |
- if (args.contains('--persistent_worker')) { |
- bool hasBuildMode = args.contains('--build-mode'); |
- bool onlyDartSdkArg = args.length == 2 || |
- (args.length == 3 && args.any((a) => a.startsWith('--dart-sdk'))) || |
- (args.length == 4 && args.contains('--dart-sdk')); |
- if (!(hasBuildMode && onlyDartSdkArg)) { |
- printAndFail('The --persistent_worker flag should be used with and ' |
- 'only with the --build-mode flag, and possibly the --dart-sdk ' |
- 'option. Got: $args'); |
- return null; // Only reachable in testing. |
- } |
- return new CommandLineOptions._fromArgs(results); |
- } |
- |
- // Help requests. |
- if (results['help']) { |
- _showUsage(parser); |
- exitHandler(0); |
- return null; // Only reachable in testing. |
- } |
- // Batch mode and input files. |
- if (results['batch']) { |
- if (results.rest.isNotEmpty) { |
- errorSink.writeln('No source files expected in the batch mode.'); |
- _showUsage(parser); |
- exitHandler(15); |
- return null; // Only reachable in testing. |
- } |
- } else if (results['persistent_worker']) { |
- if (results.rest.isNotEmpty) { |
- errorSink.writeln( |
- 'No source files expected in the persistent worker mode.'); |
- _showUsage(parser); |
- exitHandler(15); |
- return null; // Only reachable in testing. |
- } |
- } else if (results['version']) { |
- outSink.writeln('$_binaryName version ${_getVersion()}'); |
- exitHandler(0); |
- return null; // Only reachable in testing. |
- } else { |
- if (results.rest.isEmpty && !results['build-mode']) { |
- _showUsage(parser); |
- exitHandler(15); |
- return null; // Only reachable in testing. |
- } |
- } |
- return new CommandLineOptions._fromArgs(results); |
- } on FormatException catch (e) { |
- errorSink.writeln(e.message); |
- _showUsage(parser); |
- exitHandler(15); |
- return null; // Only reachable in testing. |
- } |
- } |
- |
- static _showUsage(ArgParser parser) { |
- errorSink.writeln( |
- 'Usage: $_binaryName [options...] <directory or list of files>'); |
- errorSink.writeln(''); |
- errorSink.writeln(parser.usage); |
- errorSink.writeln(''); |
- errorSink.writeln(''' |
-Run "dartanalyzer -h -v" for verbose help output, including less commonly used options. |
-For more information, see http://www.dartlang.org/tools/analyzer. |
-'''); |
- } |
-} |