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_cli/src/driver.dart'; | 9 import 'package:analyzer_cli/src/driver.dart'; |
10 import 'package:args/args.dart'; | 10 import 'package:args/args.dart'; |
(...skipping 21 matching lines...) Expand all Loading... |
32 class CommandLineOptions { | 32 class CommandLineOptions { |
33 /// The path to an analysis options file | 33 /// The path to an analysis options file |
34 final String analysisOptionsFile; | 34 final String analysisOptionsFile; |
35 | 35 |
36 /// The path to output analysis results when in build mode. | 36 /// The path to output analysis results when in build mode. |
37 final String buildAnalysisOutput; | 37 final String buildAnalysisOutput; |
38 | 38 |
39 /// Whether to use build mode. | 39 /// Whether to use build mode. |
40 final bool buildMode; | 40 final bool buildMode; |
41 | 41 |
| 42 /// Whether to use build mode as a Bazel persistent worker. |
| 43 final bool buildModePersistentWorker; |
| 44 |
42 /// List of summary file paths to use in build mode. | 45 /// List of summary file paths to use in build mode. |
43 final List<String> buildSummaryInputs; | 46 final List<String> buildSummaryInputs; |
44 | 47 |
45 /// Whether to skip analysis when creating summaries in build mode. | 48 /// Whether to skip analysis when creating summaries in build mode. |
46 final bool buildSummaryOnly; | 49 final bool buildSummaryOnly; |
47 | 50 |
48 /// Whether to create summaries using only ASTs, i.e. don't perform | 51 /// Whether to create summaries using only ASTs, i.e. don't perform |
49 /// resolution. | 52 /// resolution. |
50 final bool buildSummaryOnlyAst; | 53 final bool buildSummaryOnlyAst; |
51 | 54 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 final bool warningsAreFatal; | 141 final bool warningsAreFatal; |
139 | 142 |
140 /// Whether to use strong static checking. | 143 /// Whether to use strong static checking. |
141 final bool strongMode; | 144 final bool strongMode; |
142 | 145 |
143 /// Initialize options from the given parsed [args]. | 146 /// Initialize options from the given parsed [args]. |
144 CommandLineOptions._fromArgs( | 147 CommandLineOptions._fromArgs( |
145 ArgResults args, Map<String, String> definedVariables) | 148 ArgResults args, Map<String, String> definedVariables) |
146 : buildAnalysisOutput = args['build-analysis-output'], | 149 : buildAnalysisOutput = args['build-analysis-output'], |
147 buildMode = args['build-mode'], | 150 buildMode = args['build-mode'], |
| 151 buildModePersistentWorker = args['persistent_worker'], |
148 buildSummaryFallback = args['build-summary-fallback'], | 152 buildSummaryFallback = args['build-summary-fallback'], |
149 buildSummaryInputs = args['build-summary-input'], | 153 buildSummaryInputs = args['build-summary-input'], |
150 buildSummaryOnly = args['build-summary-only'], | 154 buildSummaryOnly = args['build-summary-only'], |
151 buildSummaryOnlyAst = args['build-summary-only-ast'], | 155 buildSummaryOnlyAst = args['build-summary-only-ast'], |
152 buildSummaryOnlyDiet = args['build-summary-only-diet'], | 156 buildSummaryOnlyDiet = args['build-summary-only-diet'], |
153 buildSummaryExcludeInformative = | 157 buildSummaryExcludeInformative = |
154 args['build-summary-exclude-informative'], | 158 args['build-summary-exclude-informative'], |
155 buildSummaryOutput = args['build-summary-output'], | 159 buildSummaryOutput = args['build-summary-output'], |
156 buildSuppressExitCode = args['build-suppress-exit-code'], | 160 buildSuppressExitCode = args['build-suppress-exit-code'], |
157 dartSdkPath = args['dart-sdk'], | 161 dartSdkPath = args['dart-sdk'], |
(...skipping 21 matching lines...) Expand all Loading... |
179 showPackageWarningsPrefix = args['x-package-warnings-prefix'], | 183 showPackageWarningsPrefix = args['x-package-warnings-prefix'], |
180 showSdkWarnings = args['show-sdk-warnings'] || args['warnings'], | 184 showSdkWarnings = args['show-sdk-warnings'] || args['warnings'], |
181 sourceFiles = args.rest, | 185 sourceFiles = args.rest, |
182 warningsAreFatal = args['fatal-warnings'], | 186 warningsAreFatal = args['fatal-warnings'], |
183 strongMode = args['strong']; | 187 strongMode = args['strong']; |
184 | 188 |
185 /// Parse [args] into [CommandLineOptions] describing the specified | 189 /// Parse [args] into [CommandLineOptions] describing the specified |
186 /// analyzer options. In case of a format error, calls [printAndFail], which | 190 /// analyzer options. In case of a format error, calls [printAndFail], which |
187 /// by default prints an error message to stderr and exits. | 191 /// by default prints an error message to stderr and exits. |
188 static CommandLineOptions parse(List<String> args, | 192 static CommandLineOptions parse(List<String> args, |
189 [printAndFail = printAndFail]) { | 193 [printAndFail(String msg) = printAndFail]) { |
190 CommandLineOptions options = _parse(args); | 194 CommandLineOptions options = _parse(args); |
191 // Check SDK. | 195 // Check SDK. |
192 { | 196 { |
193 // Infer if unspecified. | 197 // Infer if unspecified. |
194 if (options.dartSdkPath == null) { | 198 if (options.dartSdkPath == null) { |
195 Directory sdkDir = getSdkDir(args); | 199 Directory sdkDir = getSdkDir(args); |
196 if (sdkDir != null) { | 200 if (sdkDir != null) { |
197 options.dartSdkPath = sdkDir.path; | 201 options.dartSdkPath = sdkDir.path; |
198 } | 202 } |
199 } | 203 } |
(...skipping 22 matching lines...) Expand all Loading... |
222 } | 226 } |
223 | 227 |
224 // OK. Report deprecated options. | 228 // OK. Report deprecated options. |
225 if (options.enableNullAwareOperators) { | 229 if (options.enableNullAwareOperators) { |
226 errorSink.writeln( | 230 errorSink.writeln( |
227 "Info: Option '--enable-null-aware-operators' is no longer needed. " | 231 "Info: Option '--enable-null-aware-operators' is no longer needed. " |
228 "Null aware operators are supported by default."); | 232 "Null aware operators are supported by default."); |
229 } | 233 } |
230 | 234 |
231 // Build mode. | 235 // Build mode. |
| 236 if (options.buildModePersistentWorker && !options.buildMode) { |
| 237 printAndFail('The option --persisten_worker can be used only ' |
| 238 'together with --build-mode.'); |
| 239 } |
232 if (options.buildSummaryOnlyDiet && !options.buildSummaryOnly) { | 240 if (options.buildSummaryOnlyDiet && !options.buildSummaryOnly) { |
233 printAndFail('The option --build-summary-only-diet can be used only ' | 241 printAndFail('The option --build-summary-only-diet can be used only ' |
234 'together with --build-summary-only.'); | 242 'together with --build-summary-only.'); |
235 } | 243 } |
236 | 244 |
237 return options; | 245 return options; |
238 } | 246 } |
239 | 247 |
240 static String _getVersion() { | 248 static String _getVersion() { |
241 try { | 249 try { |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 negatable: false) | 332 negatable: false) |
325 ..addOption('url-mapping', | 333 ..addOption('url-mapping', |
326 help: '--url-mapping=libraryUri,/path/to/library.dart directs the ' | 334 help: '--url-mapping=libraryUri,/path/to/library.dart directs the ' |
327 'analyzer to use "library.dart" as the source for an import ' | 335 'analyzer to use "library.dart" as the source for an import ' |
328 'of "libraryUri".', | 336 'of "libraryUri".', |
329 allowMultiple: true, | 337 allowMultiple: true, |
330 splitCommas: false) | 338 splitCommas: false) |
331 // | 339 // |
332 // Build mode. | 340 // Build mode. |
333 // | 341 // |
| 342 ..addFlag('persistent_worker', |
| 343 help: 'Enable Bazel persistent worker mode.', |
| 344 defaultsTo: false, |
| 345 negatable: false, |
| 346 hide: true) |
334 ..addOption('build-analysis-output', | 347 ..addOption('build-analysis-output', |
335 help: | 348 help: |
336 'Specifies the path to the file where analysis results should be w
ritten.', | 349 'Specifies the path to the file where analysis results should be w
ritten.', |
337 hide: true) | 350 hide: true) |
338 ..addFlag('build-mode', | 351 ..addFlag('build-mode', |
339 // TODO(paulberry): add more documentation. | 352 // TODO(paulberry): add more documentation. |
340 help: 'Enable build mode.', | 353 help: 'Enable build mode.', |
341 defaultsTo: false, | 354 defaultsTo: false, |
342 negatable: false, | 355 negatable: false, |
343 hide: true) | 356 hide: true) |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 hide: true) | 443 hide: true) |
431 ..addFlag('strong', | 444 ..addFlag('strong', |
432 help: 'Enable strong static checks (https://goo.gl/DqcBsw)'); | 445 help: 'Enable strong static checks (https://goo.gl/DqcBsw)'); |
433 | 446 |
434 try { | 447 try { |
435 // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061 | 448 // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061 |
436 args = | 449 args = |
437 args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList(); | 450 args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList(); |
438 Map<String, String> definedVariables = <String, String>{}; | 451 Map<String, String> definedVariables = <String, String>{}; |
439 var results = parser.parse(args, definedVariables); | 452 var results = parser.parse(args, definedVariables); |
| 453 |
| 454 // Persistent worker. |
| 455 if (args.contains('--persistent_worker')) { |
| 456 if (args.length != 2 || !args.contains('--build-mode')) { |
| 457 printAndFail('The --persistent_worker flag should be used with and ' |
| 458 'only with the --build-mode flag.'); |
| 459 return null; // Only reachable in testing. |
| 460 } |
| 461 return new CommandLineOptions._fromArgs(results, definedVariables); |
| 462 } |
| 463 |
440 // Help requests. | 464 // Help requests. |
441 if (results['help']) { | 465 if (results['help']) { |
442 _showUsage(parser); | 466 _showUsage(parser); |
443 exitHandler(0); | 467 exitHandler(0); |
444 return null; // Only reachable in testing. | 468 return null; // Only reachable in testing. |
445 } | 469 } |
446 // Batch mode and input files. | 470 // Batch mode and input files. |
447 if (results['batch']) { | 471 if (results['batch']) { |
448 if (results.rest.isNotEmpty) { | 472 if (results.rest.isNotEmpty) { |
449 errorSink.writeln('No source files expected in the batch mode.'); | 473 errorSink.writeln('No source files expected in the batch mode.'); |
450 _showUsage(parser); | 474 _showUsage(parser); |
451 exitHandler(15); | 475 exitHandler(15); |
452 return null; // Only reachable in testing. | 476 return null; // Only reachable in testing. |
453 } | 477 } |
| 478 } else if (results['persistent_worker']) { |
| 479 if (results.rest.isNotEmpty) { |
| 480 errorSink.writeln( |
| 481 'No source files expected in the persistent worker mode.'); |
| 482 _showUsage(parser); |
| 483 exitHandler(15); |
| 484 return null; // Only reachable in testing. |
| 485 } |
454 } else if (results['version']) { | 486 } else if (results['version']) { |
455 outSink.write('$_binaryName version ${_getVersion()}'); | 487 outSink.write('$_binaryName version ${_getVersion()}'); |
456 exitHandler(0); | 488 exitHandler(0); |
457 return null; // Only reachable in testing. | 489 return null; // Only reachable in testing. |
458 } else { | 490 } else { |
459 if (results.rest.isEmpty) { | 491 if (results.rest.isEmpty) { |
460 _showUsage(parser); | 492 _showUsage(parser); |
461 exitHandler(15); | 493 exitHandler(15); |
462 return null; // Only reachable in testing. | 494 return null; // Only reachable in testing. |
463 } | 495 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 | 647 |
616 int _getNextFlagIndex(args, i) { | 648 int _getNextFlagIndex(args, i) { |
617 for (; i < args.length; ++i) { | 649 for (; i < args.length; ++i) { |
618 if (args[i].startsWith('--')) { | 650 if (args[i].startsWith('--')) { |
619 return i; | 651 return i; |
620 } | 652 } |
621 } | 653 } |
622 return i; | 654 return i; |
623 } | 655 } |
624 } | 656 } |
OLD | NEW |