OLD | NEW |
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'; |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 /// speed at the expense of memory usage. It may also be useful for working | 80 /// speed at the expense of memory usage. It may also be useful for working |
81 /// around bugs. | 81 /// around bugs. |
82 final bool disableCacheFlushing; | 82 final bool disableCacheFlushing; |
83 | 83 |
84 /// Whether to report hints | 84 /// Whether to report hints |
85 final bool disableHints; | 85 final bool disableHints; |
86 | 86 |
87 /// Whether to display version information | 87 /// Whether to display version information |
88 final bool displayVersion; | 88 final bool displayVersion; |
89 | 89 |
90 /// Whether to enable null-aware operators (DEP 9). | |
91 final bool enableNullAwareOperators; | |
92 | |
93 /// Whether to treat type mismatches found during constant evaluation as | 90 /// Whether to treat type mismatches found during constant evaluation as |
94 /// errors. | 91 /// errors. |
95 final bool enableTypeChecks; | 92 final bool enableTypeChecks; |
96 | 93 |
97 /// Whether to treat hints as fatal | 94 /// Whether to treat hints as fatal |
98 final bool hintsAreFatal; | 95 final bool hintsAreFatal; |
99 | 96 |
100 /// Whether to ignore unrecognized flags | 97 /// Whether to ignore unrecognized flags |
101 final bool ignoreUnrecognizedFlags; | 98 final bool ignoreUnrecognizedFlags; |
102 | 99 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 args['build-summary-exclude-informative'], | 155 args['build-summary-exclude-informative'], |
159 buildSummaryOutput = args['build-summary-output'], | 156 buildSummaryOutput = args['build-summary-output'], |
160 buildSummaryOutputSemantic = args['build-summary-output-semantic'], | 157 buildSummaryOutputSemantic = args['build-summary-output-semantic'], |
161 buildSuppressExitCode = args['build-suppress-exit-code'], | 158 buildSuppressExitCode = args['build-suppress-exit-code'], |
162 contextBuilderOptions = createContextBuilderOptions(args), | 159 contextBuilderOptions = createContextBuilderOptions(args), |
163 dartSdkPath = args['dart-sdk'], | 160 dartSdkPath = args['dart-sdk'], |
164 dartSdkSummaryPath = args['dart-sdk-summary'], | 161 dartSdkSummaryPath = args['dart-sdk-summary'], |
165 disableCacheFlushing = args['disable-cache-flushing'], | 162 disableCacheFlushing = args['disable-cache-flushing'], |
166 disableHints = args['no-hints'], | 163 disableHints = args['no-hints'], |
167 displayVersion = args['version'], | 164 displayVersion = args['version'], |
168 enableNullAwareOperators = args['enable-null-aware-operators'], | |
169 enableTypeChecks = args['enable_type_checks'], | 165 enableTypeChecks = args['enable_type_checks'], |
170 hintsAreFatal = args['fatal-hints'], | 166 hintsAreFatal = args['fatal-hints'], |
171 ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'], | 167 ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'], |
172 lints = args['lints'], | 168 lints = args['lints'], |
173 log = args['log'], | 169 log = args['log'], |
174 machineFormat = args['machine'] || args['format'] == 'machine', | 170 machineFormat = args['format'] == 'machine', |
175 perfReport = args['x-perf-report'], | 171 perfReport = args['x-perf-report'], |
176 shouldBatch = args['batch'], | 172 shouldBatch = args['batch'], |
177 showPackageWarnings = args['show-package-warnings'] || | 173 showPackageWarnings = args['show-package-warnings'] || |
178 args['package-warnings'] || | 174 args['package-warnings'] || |
179 args['x-package-warnings-prefix'] != null, | 175 args['x-package-warnings-prefix'] != null, |
180 showPackageWarningsPrefix = args['x-package-warnings-prefix'], | 176 showPackageWarningsPrefix = args['x-package-warnings-prefix'], |
181 showSdkWarnings = args['show-sdk-warnings'] || args['warnings'], | 177 showSdkWarnings = args['show-sdk-warnings'] || args['warnings'], |
182 sourceFiles = args.rest, | 178 sourceFiles = args.rest, |
183 warningsAreFatal = args['fatal-warnings'], | 179 warningsAreFatal = args['fatal-warnings'], |
184 strongMode = args['strong'], | 180 strongMode = args['strong'], |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 // Check SDK. | 217 // Check SDK. |
222 if (!options.buildModePersistentWorker) { | 218 if (!options.buildModePersistentWorker) { |
223 // Infer if unspecified. | 219 // Infer if unspecified. |
224 if (options.dartSdkPath == null) { | 220 if (options.dartSdkPath == null) { |
225 Directory sdkDir = getSdkDir(args); | 221 Directory sdkDir = getSdkDir(args); |
226 if (sdkDir != null) { | 222 if (sdkDir != null) { |
227 options.dartSdkPath = sdkDir.path; | 223 options.dartSdkPath = sdkDir.path; |
228 } | 224 } |
229 } | 225 } |
230 | 226 |
231 var sdkPath = options.dartSdkPath; | 227 String sdkPath = options.dartSdkPath; |
232 | 228 |
233 // Check that SDK is specified. | 229 // Check that SDK is specified. |
234 if (sdkPath == null) { | 230 if (sdkPath == null) { |
235 printAndFail('No Dart SDK found.'); | 231 printAndFail('No Dart SDK found.'); |
236 return null; // Only reachable in testing. | 232 return null; // Only reachable in testing. |
237 } | 233 } |
238 // Check that SDK is existing directory. | 234 // Check that SDK is existing directory. |
239 if (!(new Directory(sdkPath)).existsSync()) { | 235 if (!(new Directory(sdkPath)).existsSync()) { |
240 printAndFail('Invalid Dart SDK path: $sdkPath'); | 236 printAndFail('Invalid Dart SDK path: $sdkPath'); |
241 return null; // Only reachable in testing. | 237 return null; // Only reachable in testing. |
242 } | 238 } |
243 } | 239 } |
244 | 240 |
245 // Check package config. | 241 // Check package config. |
246 { | 242 { |
247 if (options.packageRootPath != null && | 243 if (options.packageRootPath != null && |
248 options.packageConfigPath != null) { | 244 options.packageConfigPath != null) { |
249 printAndFail("Cannot specify both '--package-root' and '--packages."); | 245 printAndFail("Cannot specify both '--package-root' and '--packages."); |
250 return null; // Only reachable in testing. | 246 return null; // Only reachable in testing. |
251 } | 247 } |
252 } | 248 } |
253 | 249 |
254 // OK. Report deprecated options. | |
255 if (options.enableNullAwareOperators) { | |
256 errorSink.writeln( | |
257 "Info: Option '--enable-null-aware-operators' is no longer needed. " | |
258 "Null aware operators are supported by default."); | |
259 } | |
260 | |
261 // Build mode. | 250 // Build mode. |
262 if (options.buildModePersistentWorker && !options.buildMode) { | 251 if (options.buildModePersistentWorker && !options.buildMode) { |
263 printAndFail('The option --persisten_worker can be used only ' | 252 printAndFail('The option --persisten_worker can be used only ' |
264 'together with --build-mode.'); | 253 'together with --build-mode.'); |
265 } | 254 } |
266 if (options.buildSummaryOnlyDiet && !options.buildSummaryOnly) { | 255 if (options.buildSummaryOnlyDiet && !options.buildSummaryOnly) { |
267 printAndFail('The option --build-summary-only-diet can be used only ' | 256 printAndFail('The option --build-summary-only-diet can be used only ' |
268 'together with --build-summary-only.'); | 257 'together with --build-summary-only.'); |
269 } | 258 } |
270 | 259 |
(...skipping 12 matching lines...) Expand all Loading... |
283 return "<unknown>"; | 272 return "<unknown>"; |
284 } | 273 } |
285 } | 274 } |
286 | 275 |
287 static CommandLineOptions _parse(List<String> args) { | 276 static CommandLineOptions _parse(List<String> args) { |
288 args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args); | 277 args = preprocessArgs(PhysicalResourceProvider.INSTANCE, args); |
289 | 278 |
290 bool verbose = args.contains('-v') || args.contains('--verbose'); | 279 bool verbose = args.contains('-v') || args.contains('--verbose'); |
291 bool hide = !verbose; | 280 bool hide = !verbose; |
292 | 281 |
293 var parser = new ArgParser(allowTrailingOptions: true); | 282 ArgParser parser = new ArgParser(allowTrailingOptions: true); |
| 283 |
| 284 if (!hide) { |
| 285 parser.addSeparator('General options:'); |
| 286 } |
| 287 |
| 288 // TODO(devoncarew): This defines some hidden flags, which would be better |
| 289 // defined with the rest of the hidden flags below (to group well with the |
| 290 // other flags). |
294 defineAnalysisArguments(parser, hide: hide); | 291 defineAnalysisArguments(parser, hide: hide); |
| 292 |
295 parser | 293 parser |
296 ..addOption('format', | 294 ..addOption('format', |
297 help: | 295 help: 'Specifies the format in which errors are displayed; the only ' |
298 'Specifies the format in which errors are displayed. The only curr
ently allowed value is \'machine\'.') | 296 'currently allowed value is \'machine\'.') |
299 ..addFlag('version', | 297 ..addFlag('version', |
300 help: 'Print the analyzer version.', | 298 help: 'Print the analyzer version.', |
301 defaultsTo: false, | 299 defaultsTo: false, |
302 negatable: false) | 300 negatable: false) |
303 ..addFlag('lints', | 301 ..addFlag('lints', |
304 help: 'Show lint results.', defaultsTo: false, negatable: false) | 302 help: 'Show lint results.', defaultsTo: false, negatable: false) |
305 ..addFlag('no-hints', | 303 ..addFlag('no-hints', |
306 help: 'Do not show hint results.', | 304 help: 'Do not show hint results.', |
307 defaultsTo: false, | 305 defaultsTo: false, |
308 negatable: false) | 306 negatable: false) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 ..addFlag('verbose', | 341 ..addFlag('verbose', |
344 abbr: 'v', | 342 abbr: 'v', |
345 defaultsTo: false, | 343 defaultsTo: false, |
346 help: 'Verbose output.', | 344 help: 'Verbose output.', |
347 negatable: false) | 345 negatable: false) |
348 ..addOption('url-mapping', | 346 ..addOption('url-mapping', |
349 help: '--url-mapping=libraryUri,/path/to/library.dart directs the ' | 347 help: '--url-mapping=libraryUri,/path/to/library.dart directs the ' |
350 'analyzer to use "library.dart" as the source for an import ' | 348 'analyzer to use "library.dart" as the source for an import ' |
351 'of "libraryUri".', | 349 'of "libraryUri".', |
352 allowMultiple: true, | 350 allowMultiple: true, |
353 splitCommas: false) | 351 splitCommas: false); |
354 | 352 |
355 // | 353 // Build mode options. |
356 // Build mode. | 354 if (!hide) { |
357 // | 355 parser.addSeparator('Build mode flags:'); |
| 356 } |
| 357 |
| 358 parser |
358 ..addFlag('persistent_worker', | 359 ..addFlag('persistent_worker', |
359 help: 'Enable Bazel persistent worker mode.', | 360 help: 'Enable Bazel persistent worker mode.', |
360 defaultsTo: false, | 361 defaultsTo: false, |
361 negatable: false, | 362 negatable: false, |
362 hide: hide) | 363 hide: hide) |
363 ..addOption('build-analysis-output', | 364 ..addOption('build-analysis-output', |
364 help: | 365 help: |
365 'Specifies the path to the file where analysis results should be w
ritten.', | 366 'Specifies the path to the file where analysis results should be w
ritten.', |
366 hide: hide) | 367 hide: hide) |
367 ..addFlag('build-mode', | 368 ..addFlag('build-mode', |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 ..addFlag('build-summary-exclude-informative', | 402 ..addFlag('build-summary-exclude-informative', |
402 help: 'Exclude @informative information (docs, offsets, etc). ' | 403 help: 'Exclude @informative information (docs, offsets, etc). ' |
403 'Deprecated: please use --build-summary-output-semantic instead.', | 404 'Deprecated: please use --build-summary-output-semantic instead.', |
404 defaultsTo: false, | 405 defaultsTo: false, |
405 negatable: false, | 406 negatable: false, |
406 hide: hide) | 407 hide: hide) |
407 ..addFlag('build-suppress-exit-code', | 408 ..addFlag('build-suppress-exit-code', |
408 help: 'Exit with code 0 even if errors are found.', | 409 help: 'Exit with code 0 even if errors are found.', |
409 defaultsTo: false, | 410 defaultsTo: false, |
410 negatable: false, | 411 negatable: false, |
411 hide: hide) | 412 hide: hide); |
412 | 413 |
413 // | 414 // Hidden flags. |
414 // Hidden flags. | 415 if (!hide) { |
415 // | 416 parser.addSeparator('Less frequently used flags:'); |
416 ..addFlag('machine', | 417 } |
417 help: 'Print errors in a format suitable for parsing (deprecated).', | 418 |
418 defaultsTo: false, | 419 parser |
419 negatable: false, | |
420 hide: hide) | |
421 ..addFlag('batch', | 420 ..addFlag('batch', |
422 help: 'Read commands from standard input (for testing).', | 421 help: 'Read commands from standard input (for testing).', |
423 defaultsTo: false, | 422 defaultsTo: false, |
424 negatable: false, | 423 negatable: false, |
425 hide: hide) | 424 hide: hide) |
426 ..addFlag('disable-cache-flushing', defaultsTo: false, hide: hide) | 425 ..addFlag('disable-cache-flushing', defaultsTo: false, hide: hide) |
427 ..addOption('x-perf-report', | 426 ..addOption('x-perf-report', |
428 help: 'Writes a performance report to the given file (experimental).', | 427 help: 'Writes a performance report to the given file (experimental).', |
429 hide: hide) | 428 hide: hide) |
430 ..addOption('x-package-warnings-prefix', | 429 ..addOption('x-package-warnings-prefix', |
431 help: | 430 help: |
432 'Show warnings from package: imports that match the given prefix', | 431 'Show warnings from package: imports that match the given prefix', |
433 hide: hide) | 432 hide: hide) |
434 ..addFlag('enable-conditional-directives', | 433 ..addFlag('enable-conditional-directives', |
435 help: | 434 help: |
436 'deprecated -- Enable support for conditional directives (DEP 40).
', | 435 'deprecated -- Enable support for conditional directives (DEP 40).
', |
437 defaultsTo: false, | 436 defaultsTo: false, |
438 negatable: false, | 437 negatable: false, |
439 hide: hide) | 438 hide: hide) |
440 ..addFlag('enable-null-aware-operators', | |
441 help: 'Enable support for null-aware operators (DEP 9).', | |
442 defaultsTo: false, | |
443 negatable: false, | |
444 hide: hide) | |
445 ..addFlag('enable-new-task-model', | |
446 help: 'deprecated -- Ennable new task model.', | |
447 defaultsTo: false, | |
448 negatable: false, | |
449 hide: hide) | |
450 ..addFlag('log', | 439 ..addFlag('log', |
451 help: 'Log additional messages and exceptions.', | 440 help: 'Log additional messages and exceptions.', |
452 defaultsTo: false, | 441 defaultsTo: false, |
453 negatable: false, | 442 negatable: false, |
454 hide: hide) | 443 hide: hide) |
455 ..addFlag('enable_type_checks', | 444 ..addFlag('enable_type_checks', |
456 help: 'Check types in constant evaluation.', | 445 help: 'Check types in constant evaluation.', |
457 defaultsTo: false, | 446 defaultsTo: false, |
458 negatable: false, | 447 negatable: false, |
459 hide: hide) | 448 hide: hide) |
460 ..addFlag('use-analysis-driver-memory-byte-store', | 449 ..addFlag('use-analysis-driver-memory-byte-store', |
461 help: 'Use memory byte store, not the file system cache.', | 450 help: 'Use memory byte store, not the file system cache.', |
462 defaultsTo: false, | 451 defaultsTo: false, |
463 negatable: false, | 452 negatable: false, |
464 hide: hide); | 453 hide: hide); |
465 | 454 |
466 try { | 455 try { |
467 if (args.contains('--$ignoreUnrecognizedFlagsFlag')) { | 456 if (args.contains('--$ignoreUnrecognizedFlagsFlag')) { |
468 args = filterUnknownArguments(args, parser); | 457 args = filterUnknownArguments(args, parser); |
469 } | 458 } |
470 var results = parser.parse(args); | 459 ArgResults results = parser.parse(args); |
471 | 460 |
472 // Persistent worker. | 461 // Persistent worker. |
473 if (args.contains('--persistent_worker')) { | 462 if (args.contains('--persistent_worker')) { |
474 bool validArgs; | 463 bool validArgs; |
475 if (!args.contains('--build-mode')) { | 464 if (!args.contains('--build-mode')) { |
476 validArgs = false; | 465 validArgs = false; |
477 } else if (args.length == 2) { | 466 } else if (args.length == 2) { |
478 validArgs = true; | 467 validArgs = true; |
479 } else if (args.length == 4 && args.contains('--dart-sdk')) { | 468 } else if (args.length == 4 && args.contains('--dart-sdk')) { |
480 validArgs = true; | 469 validArgs = true; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 } | 514 } |
526 return new CommandLineOptions._fromArgs(results); | 515 return new CommandLineOptions._fromArgs(results); |
527 } on FormatException catch (e) { | 516 } on FormatException catch (e) { |
528 errorSink.writeln(e.message); | 517 errorSink.writeln(e.message); |
529 _showUsage(parser); | 518 _showUsage(parser); |
530 exitHandler(15); | 519 exitHandler(15); |
531 return null; // Only reachable in testing. | 520 return null; // Only reachable in testing. |
532 } | 521 } |
533 } | 522 } |
534 | 523 |
535 static _showUsage(parser) { | 524 static _showUsage(ArgParser parser) { |
536 errorSink | 525 errorSink.writeln( |
537 .writeln('Usage: $_binaryName [options...] <libraries to analyze...>'); | 526 'Usage: $_binaryName [options...] <directory or list of files>'); |
538 errorSink.writeln(parser.getUsage()); | |
539 errorSink.writeln(''); | 527 errorSink.writeln(''); |
540 errorSink.writeln( | 528 errorSink.writeln(parser.usage); |
541 'For more information, see http://www.dartlang.org/tools/analyzer.'); | 529 errorSink.writeln(''); |
| 530 errorSink.writeln(''' |
| 531 Run "dartanalyzer -h -v" for verbose help output, including less commonly used o
ptions. |
| 532 For more information, see http://www.dartlang.org/tools/analyzer. |
| 533 '''); |
542 } | 534 } |
543 } | 535 } |
OLD | NEW |