Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Side by Side Diff: pkg/analyzer_cli/lib/src/options.dart

Issue 2584293003: DDC/AnalyzerCLI common cmdline option processing (Closed)
Patch Set: address comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer_cli.src.options; 5 library analyzer_cli.src.options;
6 6
7 import 'dart:io'; 7 import 'dart:io';
8 8
9 import 'package:analyzer/file_system/physical_file_system.dart'; 9 import 'package:analyzer/file_system/physical_file_system.dart';
10 import 'package:analyzer/src/command_line/arguments.dart'; 10 import 'package:analyzer/src/command_line/arguments.dart';
11 import 'package:analyzer/src/context/builder.dart';
11 import 'package:analyzer_cli/src/driver.dart'; 12 import 'package:analyzer_cli/src/driver.dart';
12 import 'package:args/args.dart'; 13 import 'package:args/args.dart';
13 import 'package:cli_util/cli_util.dart' show getSdkDir; 14 import 'package:cli_util/cli_util.dart' show getSdkDir;
14 15
15 const _binaryName = 'dartanalyzer'; 16 const _binaryName = 'dartanalyzer';
16 17
17 /// Shared exit handler. 18 /// Shared exit handler.
18 /// 19 ///
19 /// *Visible for testing.* 20 /// *Visible for testing.*
20 ExitHandler exitHandler = exit; 21 ExitHandler exitHandler = exit;
21 22
22 /// Print the given [message] to stderr and exit with the given [exitCode]. 23 /// Print the given [message] to stderr and exit with the given [exitCode].
23 void printAndFail(String message, {int exitCode: 15}) { 24 void printAndFail(String message, {int exitCode: 15}) {
24 errorSink.writeln(message); 25 errorSink.writeln(message);
25 exitHandler(exitCode); 26 exitHandler(exitCode);
26 } 27 }
27 28
28 /// Exit handler. 29 /// Exit handler.
29 /// 30 ///
30 /// *Visible for testing.* 31 /// *Visible for testing.*
31 typedef void ExitHandler(int code); 32 typedef void ExitHandler(int code);
32 33
33 /// Analyzer commandline configuration options. 34 /// Analyzer commandline configuration options.
34 class CommandLineOptions { 35 class CommandLineOptions {
35 /// The path to an analysis options file
36 final String analysisOptionsFile;
37
38 /// The path to output analysis results when in build mode. 36 /// The path to output analysis results when in build mode.
39 final String buildAnalysisOutput; 37 final String buildAnalysisOutput;
40 38
41 /// Whether to use build mode. 39 /// Whether to use build mode.
42 final bool buildMode; 40 final bool buildMode;
43 41
44 /// Whether to use build mode as a Bazel persistent worker. 42 /// Whether to use build mode as a Bazel persistent worker.
45 final bool buildModePersistentWorker; 43 final bool buildModePersistentWorker;
46 44
47 /// List of summary file paths to use in build mode. 45 /// List of summary file paths to use in build mode.
(...skipping 12 matching lines...) Expand all
60 /// The path to output the summary when creating summaries in build mode. 58 /// The path to output the summary when creating summaries in build mode.
61 final String buildSummaryOutput; 59 final String buildSummaryOutput;
62 60
63 /// The path to output the semantic-only summary when creating summaries in 61 /// The path to output the semantic-only summary when creating summaries in
64 /// build mode. 62 /// build mode.
65 final String buildSummaryOutputSemantic; 63 final String buildSummaryOutputSemantic;
66 64
67 /// Whether to suppress a nonzero exit code in build mode. 65 /// Whether to suppress a nonzero exit code in build mode.
68 final bool buildSuppressExitCode; 66 final bool buildSuppressExitCode;
69 67
68 /// The options defining the context in which analysis is performed.
69 final ContextBuilderOptions contextBuilderOptions;
70
70 /// The path to the dart SDK. 71 /// The path to the dart SDK.
71 String dartSdkPath; 72 String dartSdkPath;
72 73
73 /// The path to the dart SDK summary file. 74 /// The path to the dart SDK summary file.
74 String dartSdkSummaryPath; 75 String dartSdkSummaryPath;
75 76
76 /// A table mapping the names of defined variables to their values.
77 final Map<String, String> definedVariables;
78
79 /// Whether to disable cache flushing. This option can improve analysis 77 /// Whether to disable cache flushing. This option can improve analysis
80 /// speed at the expense of memory usage. It may also be useful for working 78 /// speed at the expense of memory usage. It may also be useful for working
81 /// around bugs. 79 /// around bugs.
82 final bool disableCacheFlushing; 80 final bool disableCacheFlushing;
83 81
84 /// Whether to report hints 82 /// Whether to report hints
85 final bool disableHints; 83 final bool disableHints;
86 84
87 /// Whether to display version information 85 /// Whether to display version information
88 final bool displayVersion; 86 final bool displayVersion;
89 87
90 /// Whether to enable null-aware operators (DEP 9). 88 /// Whether to enable null-aware operators (DEP 9).
91 final bool enableNullAwareOperators; 89 final bool enableNullAwareOperators;
92 90
93 /// Whether to strictly follow the specification when generating warnings on
94 /// "call" methods (fixes dartbug.com/21938).
95 final bool enableStrictCallChecks;
96
97 /// Whether to relax restrictions on mixins (DEP 34).
98 final bool enableSuperMixins;
99
100 /// Whether to treat type mismatches found during constant evaluation as 91 /// Whether to treat type mismatches found during constant evaluation as
101 /// errors. 92 /// errors.
102 final bool enableTypeChecks; 93 final bool enableTypeChecks;
103 94
104 /// Whether to treat hints as fatal 95 /// Whether to treat hints as fatal
105 final bool hintsAreFatal; 96 final bool hintsAreFatal;
106 97
107 /// Whether to ignore unrecognized flags 98 /// Whether to ignore unrecognized flags
108 final bool ignoreUnrecognizedFlags; 99 final bool ignoreUnrecognizedFlags;
109 100
110 /// Whether to report lints 101 /// Whether to report lints
111 final bool lints; 102 final bool lints;
112 103
113 /// Whether to log additional analysis messages and exceptions 104 /// Whether to log additional analysis messages and exceptions
114 final bool log; 105 final bool log;
115 106
116 /// Whether to use machine format for error display 107 /// Whether to use machine format for error display
117 final bool machineFormat; 108 final bool machineFormat;
118 109
119 /// The path to the package root
120 final String packageRootPath;
121
122 /// The path to a `.packages` configuration file
123 final String packageConfigPath;
124
125 /// The path to a file to write a performance log. 110 /// The path to a file to write a performance log.
126 /// (Or null if not enabled.) 111 /// (Or null if not enabled.)
127 final String perfReport; 112 final String perfReport;
128 113
129 /// Batch mode (for unit testing) 114 /// Batch mode (for unit testing)
130 final bool shouldBatch; 115 final bool shouldBatch;
131 116
132 /// Whether to show package: warnings 117 /// Whether to show package: warnings
133 final bool showPackageWarnings; 118 final bool showPackageWarnings;
134 119
(...skipping 15 matching lines...) Expand all
150 /// Whether implicit casts are enabled (in strong mode) 135 /// Whether implicit casts are enabled (in strong mode)
151 final bool implicitCasts; 136 final bool implicitCasts;
152 137
153 /// Whether implicit dynamic is enabled (mainly for strong mode users) 138 /// Whether implicit dynamic is enabled (mainly for strong mode users)
154 final bool implicitDynamic; 139 final bool implicitDynamic;
155 140
156 /// Whether to treat lints as fatal 141 /// Whether to treat lints as fatal
157 final bool lintsAreFatal; 142 final bool lintsAreFatal;
158 143
159 /// Initialize options from the given parsed [args]. 144 /// Initialize options from the given parsed [args].
160 CommandLineOptions._fromArgs( 145 CommandLineOptions._fromArgs(ArgResults args)
161 ArgResults args, Map<String, String> definedVariables)
162 : buildAnalysisOutput = args['build-analysis-output'], 146 : buildAnalysisOutput = args['build-analysis-output'],
163 buildMode = args['build-mode'], 147 buildMode = args['build-mode'],
164 buildModePersistentWorker = args['persistent_worker'], 148 buildModePersistentWorker = args['persistent_worker'],
165 buildSummaryInputs = args['build-summary-input'] as List<String>, 149 buildSummaryInputs = args['build-summary-input'] as List<String>,
166 buildSummaryOnly = args['build-summary-only'], 150 buildSummaryOnly = args['build-summary-only'],
167 buildSummaryOnlyDiet = args['build-summary-only-diet'], 151 buildSummaryOnlyDiet = args['build-summary-only-diet'],
168 buildSummaryExcludeInformative = 152 buildSummaryExcludeInformative =
169 args['build-summary-exclude-informative'], 153 args['build-summary-exclude-informative'],
170 buildSummaryOutput = args['build-summary-output'], 154 buildSummaryOutput = args['build-summary-output'],
171 buildSummaryOutputSemantic = args['build-summary-output-semantic'], 155 buildSummaryOutputSemantic = args['build-summary-output-semantic'],
172 buildSuppressExitCode = args['build-suppress-exit-code'], 156 buildSuppressExitCode = args['build-suppress-exit-code'],
157 contextBuilderOptions = createContextBuilderOptions(args),
173 dartSdkPath = args['dart-sdk'], 158 dartSdkPath = args['dart-sdk'],
174 dartSdkSummaryPath = args['dart-sdk-summary'], 159 dartSdkSummaryPath = args['dart-sdk-summary'],
175 definedVariables = definedVariables,
176 analysisOptionsFile = args['options'],
177 disableCacheFlushing = args['disable-cache-flushing'], 160 disableCacheFlushing = args['disable-cache-flushing'],
178 disableHints = args['no-hints'], 161 disableHints = args['no-hints'],
179 displayVersion = args['version'], 162 displayVersion = args['version'],
180 enableNullAwareOperators = args['enable-null-aware-operators'], 163 enableNullAwareOperators = args['enable-null-aware-operators'],
181 enableStrictCallChecks = args['enable-strict-call-checks'],
182 enableSuperMixins = args['supermixin'],
183 enableTypeChecks = args['enable_type_checks'], 164 enableTypeChecks = args['enable_type_checks'],
184 hintsAreFatal = args['fatal-hints'], 165 hintsAreFatal = args['fatal-hints'],
185 ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'], 166 ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'],
186 lints = args['lints'], 167 lints = args['lints'],
187 log = args['log'], 168 log = args['log'],
188 machineFormat = args['machine'] || args['format'] == 'machine', 169 machineFormat = args['machine'] || args['format'] == 'machine',
189 packageConfigPath = args['packages'],
190 packageRootPath = args['package-root'],
191 perfReport = args['x-perf-report'], 170 perfReport = args['x-perf-report'],
192 shouldBatch = args['batch'], 171 shouldBatch = args['batch'],
193 showPackageWarnings = args['show-package-warnings'] || 172 showPackageWarnings = args['show-package-warnings'] ||
194 args['package-warnings'] || 173 args['package-warnings'] ||
195 args['x-package-warnings-prefix'] != null, 174 args['x-package-warnings-prefix'] != null,
196 showPackageWarningsPrefix = args['x-package-warnings-prefix'], 175 showPackageWarningsPrefix = args['x-package-warnings-prefix'],
197 showSdkWarnings = args['show-sdk-warnings'] || args['warnings'], 176 showSdkWarnings = args['show-sdk-warnings'] || args['warnings'],
198 sourceFiles = args.rest, 177 sourceFiles = args.rest,
199 warningsAreFatal = args['fatal-warnings'], 178 warningsAreFatal = args['fatal-warnings'],
200 strongMode = args['strong'], 179 strongMode = args['strong'],
201 implicitCasts = !args['no-implicit-casts'], 180 implicitCasts = !args['no-implicit-casts'],
202 implicitDynamic = !args['no-implicit-dynamic'], 181 implicitDynamic = !args['no-implicit-dynamic'],
203 lintsAreFatal = args['fatal-lints']; 182 lintsAreFatal = args['fatal-lints'];
204 183
184 /// The path to an analysis options file
185 String get analysisOptionsFile =>
186 contextBuilderOptions.defaultAnalysisOptionsFilePath;
187
188 /// A table mapping the names of defined variables to their values.
189 Map<String, String> get definedVariables =>
190 contextBuilderOptions.declaredVariables;
191
192 /// Whether to strictly follow the specification when generating warnings on
193 /// "call" methods (fixes dartbug.com/21938).
194 bool get enableStrictCallChecks =>
195 contextBuilderOptions.defaultOptions.enableStrictCallChecks;
196
197 /// Whether to relax restrictions on mixins (DEP 34).
198 bool get enableSuperMixins =>
199 contextBuilderOptions.defaultOptions.enableSuperMixins;
200
201 /// The path to the package root
202 String get packageRootPath =>
203 contextBuilderOptions.defaultPackagesDirectoryPath;
204
205 /// The path to a `.packages` configuration file
206 String get packageConfigPath => contextBuilderOptions.defaultPackageFilePath;
207
205 /// Parse [args] into [CommandLineOptions] describing the specified 208 /// Parse [args] into [CommandLineOptions] describing the specified
206 /// analyzer options. In case of a format error, calls [printAndFail], which 209 /// analyzer options. In case of a format error, calls [printAndFail], which
207 /// by default prints an error message to stderr and exits. 210 /// by default prints an error message to stderr and exits.
208 static CommandLineOptions parse(List<String> args, 211 static CommandLineOptions parse(List<String> args,
209 [printAndFail(String msg) = printAndFail]) { 212 [printAndFail(String msg) = printAndFail]) {
210 CommandLineOptions options = _parse(args); 213 CommandLineOptions options = _parse(args);
211 // Check SDK. 214 // Check SDK.
212 if (!options.buildModePersistentWorker) { 215 if (!options.buildModePersistentWorker) {
213 // Infer if unspecified. 216 // Infer if unspecified.
214 if (options.dartSdkPath == null) { 217 if (options.dartSdkPath == null) {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 ..addFlag('enable_type_checks', 450 ..addFlag('enable_type_checks',
448 help: 'Check types in constant evaluation.', 451 help: 'Check types in constant evaluation.',
449 defaultsTo: false, 452 defaultsTo: false,
450 negatable: false, 453 negatable: false,
451 hide: hide); 454 hide: hide);
452 455
453 try { 456 try {
454 // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061 457 // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
455 args = 458 args =
456 args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList(); 459 args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList();
457 Map<String, String> definedVariables = <String, String>{};
458 args = extractDefinedVariables(args, definedVariables);
459 if (args.contains('--$ignoreUnrecognizedFlagsFlag')) { 460 if (args.contains('--$ignoreUnrecognizedFlagsFlag')) {
460 args = filterUnknownArguments(args, parser); 461 args = filterUnknownArguments(args, parser);
461 } 462 }
462 var results = parser.parse(args); 463 var results = parser.parse(args);
463 464
464 // Persistent worker. 465 // Persistent worker.
465 if (args.contains('--persistent_worker')) { 466 if (args.contains('--persistent_worker')) {
466 bool validArgs; 467 bool validArgs;
467 if (!args.contains('--build-mode')) { 468 if (!args.contains('--build-mode')) {
468 validArgs = false; 469 validArgs = false;
469 } else if (args.length == 2) { 470 } else if (args.length == 2) {
470 validArgs = true; 471 validArgs = true;
471 } else if (args.length == 4 && args.contains('--dart-sdk')) { 472 } else if (args.length == 4 && args.contains('--dart-sdk')) {
472 validArgs = true; 473 validArgs = true;
473 } else { 474 } else {
474 validArgs = false; 475 validArgs = false;
475 } 476 }
476 if (!validArgs) { 477 if (!validArgs) {
477 printAndFail('The --persistent_worker flag should be used with and ' 478 printAndFail('The --persistent_worker flag should be used with and '
478 'only with the --build-mode flag, and possibly the --dart-sdk ' 479 'only with the --build-mode flag, and possibly the --dart-sdk '
479 'option. Got: $args'); 480 'option. Got: $args');
480 return null; // Only reachable in testing. 481 return null; // Only reachable in testing.
481 } 482 }
482 return new CommandLineOptions._fromArgs(results, definedVariables); 483 return new CommandLineOptions._fromArgs(results);
483 } 484 }
484 485
485 // Help requests. 486 // Help requests.
486 if (results['help']) { 487 if (results['help']) {
487 _showUsage(parser); 488 _showUsage(parser);
488 exitHandler(0); 489 exitHandler(0);
489 return null; // Only reachable in testing. 490 return null; // Only reachable in testing.
490 } 491 }
491 // Batch mode and input files. 492 // Batch mode and input files.
492 if (results['batch']) { 493 if (results['batch']) {
(...skipping 15 matching lines...) Expand all
508 outSink.write('$_binaryName version ${_getVersion()}'); 509 outSink.write('$_binaryName version ${_getVersion()}');
509 exitHandler(0); 510 exitHandler(0);
510 return null; // Only reachable in testing. 511 return null; // Only reachable in testing.
511 } else { 512 } else {
512 if (results.rest.isEmpty && !results['build-mode']) { 513 if (results.rest.isEmpty && !results['build-mode']) {
513 _showUsage(parser); 514 _showUsage(parser);
514 exitHandler(15); 515 exitHandler(15);
515 return null; // Only reachable in testing. 516 return null; // Only reachable in testing.
516 } 517 }
517 } 518 }
518 return new CommandLineOptions._fromArgs(results, definedVariables); 519 return new CommandLineOptions._fromArgs(results);
519 } on FormatException catch (e) { 520 } on FormatException catch (e) {
520 errorSink.writeln(e.message); 521 errorSink.writeln(e.message);
521 _showUsage(parser); 522 _showUsage(parser);
522 exitHandler(15); 523 exitHandler(15);
523 return null; // Only reachable in testing. 524 return null; // Only reachable in testing.
524 } 525 }
525 } 526 }
526 527
527 static _showUsage(parser) { 528 static _showUsage(parser) {
528 errorSink 529 errorSink
529 .writeln('Usage: $_binaryName [options...] <libraries to analyze...>'); 530 .writeln('Usage: $_binaryName [options...] <libraries to analyze...>');
530 errorSink.writeln(parser.getUsage()); 531 errorSink.writeln(parser.getUsage());
531 errorSink.writeln(''); 532 errorSink.writeln('');
532 errorSink.writeln( 533 errorSink.writeln(
533 'For more information, see http://www.dartlang.org/tools/analyzer.'); 534 'For more information, see http://www.dartlang.org/tools/analyzer.');
534 } 535 }
535 } 536 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/command_line/arguments.dart ('k') | pkg/analyzer_cli/test/options_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698