OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 dart2js.cmdline; | 5 library dart2js.cmdline; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:collection' show Queue, LinkedHashMap; | 8 import 'dart:collection' show Queue, LinkedHashMap; |
9 import 'dart:io'; | 9 import 'dart:io'; |
10 import 'dart:utf'; | 10 import 'dart:utf'; |
(...skipping 11 matching lines...) Expand all Loading... |
22 /** | 22 /** |
23 * A string to identify the revision or build. | 23 * A string to identify the revision or build. |
24 * | 24 * |
25 * This ID is displayed if the compiler crashes and in verbose mode, and is | 25 * This ID is displayed if the compiler crashes and in verbose mode, and is |
26 * an aid in reproducing bug reports. | 26 * an aid in reproducing bug reports. |
27 * | 27 * |
28 * The actual string is rewritten by a wrapper script when included in the sdk. | 28 * The actual string is rewritten by a wrapper script when included in the sdk. |
29 */ | 29 */ |
30 String BUILD_ID = null; | 30 String BUILD_ID = null; |
31 | 31 |
32 typedef void HandleOption(String option); | 32 /** |
| 33 * The data passed to the [HandleOption] callback is either a single |
| 34 * string argument, or the arguments iterator for multiple arguments |
| 35 * handlers. |
| 36 */ |
| 37 typedef void HandleOption(data); |
33 | 38 |
34 class OptionHandler { | 39 class OptionHandler { |
35 String pattern; | 40 final String pattern; |
36 HandleOption handle; | 41 final HandleOption handle; |
| 42 final bool multipleArguments; |
37 | 43 |
38 OptionHandler(this.pattern, this.handle); | 44 OptionHandler(this.pattern, this.handle, {this.multipleArguments: false}); |
39 } | 45 } |
40 | 46 |
41 /** | 47 /** |
42 * Extract the parameter of an option. | 48 * Extract the parameter of an option. |
43 * | 49 * |
44 * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters | 50 * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters |
45 * are ['fisk.js'] and ['hest.js'], respectively. | 51 * are ['fisk.js'] and ['hest.js'], respectively. |
46 */ | 52 */ |
47 String extractParameter(String argument) { | 53 String extractParameter(String argument) { |
48 // m[0] is the entire match (which will be equal to argument). m[1] | 54 // m[0] is the entire match (which will be equal to argument). m[1] |
49 // is something like "-o" or "--out=", and m[2] is the parameter. | 55 // is something like "-o" or "--out=", and m[2] is the parameter. |
50 Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument); | 56 Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument); |
51 if (m == null) helpAndFail('Error: Unknown option "$argument".'); | 57 if (m == null) helpAndFail('Error: Unknown option "$argument".'); |
52 return m[2]; | 58 return m[2]; |
53 } | 59 } |
54 | 60 |
55 String extractPath(String argument) { | 61 String extractPath(String argument) { |
56 String path = nativeToUriPath(extractParameter(argument)); | 62 String path = nativeToUriPath(extractParameter(argument)); |
57 return path.endsWith("/") ? path : "$path/"; | 63 return path.endsWith("/") ? path : "$path/"; |
58 } | 64 } |
59 | 65 |
60 void parseCommandLine(List<OptionHandler> handlers, List<String> argv) { | 66 void parseCommandLine(List<OptionHandler> handlers, List<String> argv) { |
61 // TODO(ahe): Use ../../args/args.dart for parsing options instead. | 67 // TODO(ahe): Use ../../args/args.dart for parsing options instead. |
62 var patterns = <String>[]; | 68 var patterns = <String>[]; |
63 for (OptionHandler handler in handlers) { | 69 for (OptionHandler handler in handlers) { |
64 patterns.add(handler.pattern); | 70 patterns.add(handler.pattern); |
65 } | 71 } |
66 var pattern = new RegExp('^(${patterns.join(")\$|(")})\$'); | 72 var pattern = new RegExp('^(${patterns.join(")\$|(")})\$'); |
67 OUTER: for (String argument in argv) { | 73 |
| 74 Iterator<String> arguments = argv.iterator; |
| 75 OUTER: while (arguments.moveNext()) { |
| 76 String argument = arguments.current; |
68 Match match = pattern.firstMatch(argument); | 77 Match match = pattern.firstMatch(argument); |
69 assert(match.groupCount == handlers.length); | 78 assert(match.groupCount == handlers.length); |
70 for (int i = 0; i < handlers.length; i++) { | 79 for (int i = 0; i < handlers.length; i++) { |
71 if (match[i + 1] != null) { | 80 if (match[i + 1] != null) { |
72 handlers[i].handle(argument); | 81 OptionHandler handler = handlers[i]; |
| 82 if (handler.multipleArguments) { |
| 83 handler.handle(arguments); |
| 84 } else { |
| 85 handler.handle(argument); |
| 86 } |
73 continue OUTER; | 87 continue OUTER; |
74 } | 88 } |
75 } | 89 } |
76 throw 'Internal error: "$argument" did not match'; | 90 throw 'Internal error: "$argument" did not match'; |
77 } | 91 } |
78 } | 92 } |
79 | 93 |
80 void compile(List<String> argv) { | 94 void compile(List<String> argv) { |
81 bool isWindows = (Platform.operatingSystem == 'windows'); | 95 bool isWindows = (Platform.operatingSystem == 'windows'); |
82 Uri libraryRoot = currentDirectory; | 96 Uri libraryRoot = currentDirectory; |
(...skipping 18 matching lines...) Expand all Loading... |
101 } | 115 } |
102 | 116 |
103 setLibraryRoot(String argument) { | 117 setLibraryRoot(String argument) { |
104 libraryRoot = currentDirectory.resolve(extractPath(argument)); | 118 libraryRoot = currentDirectory.resolve(extractPath(argument)); |
105 } | 119 } |
106 | 120 |
107 setPackageRoot(String argument) { | 121 setPackageRoot(String argument) { |
108 packageRoot = currentDirectory.resolve(extractPath(argument)); | 122 packageRoot = currentDirectory.resolve(extractPath(argument)); |
109 } | 123 } |
110 | 124 |
111 setOutput(String argument) { | 125 setOutput(Iterator<String> arguments) { |
| 126 String path; |
| 127 if (arguments.current == '-o') { |
| 128 if (!arguments.moveNext()) { |
| 129 helpAndFail('Error: Missing file after -o option.'); |
| 130 } |
| 131 path = arguments.current; |
| 132 } else { |
| 133 path = extractParameter(arguments.current); |
| 134 } |
112 explicitOut = true; | 135 explicitOut = true; |
113 out = currentDirectory.resolve(nativeToUriPath(extractParameter(argument))); | 136 out = currentDirectory.resolve(nativeToUriPath(path)); |
114 sourceMapOut = Uri.parse('$out.map'); | 137 sourceMapOut = Uri.parse('$out.map'); |
115 } | 138 } |
116 | 139 |
117 setOutputType(String argument) { | 140 setOutputType(String argument) { |
118 if (argument == '--output-type=dart') { | 141 if (argument == '--output-type=dart') { |
119 outputLanguage = OUTPUT_LANGUAGE_DART; | 142 outputLanguage = OUTPUT_LANGUAGE_DART; |
120 if (!explicitOut) { | 143 if (!explicitOut) { |
121 out = currentDirectory.resolve('out.dart'); | 144 out = currentDirectory.resolve('out.dart'); |
122 sourceMapOut = currentDirectory.resolve('out.dart.map'); | 145 sourceMapOut = currentDirectory.resolve('out.dart.map'); |
123 } | 146 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 List<OptionHandler> handlers = <OptionHandler>[ | 224 List<OptionHandler> handlers = <OptionHandler>[ |
202 new OptionHandler('-[chv?]+', handleShortOptions), | 225 new OptionHandler('-[chv?]+', handleShortOptions), |
203 new OptionHandler('--throw-on-error', | 226 new OptionHandler('--throw-on-error', |
204 (_) => diagnosticHandler.throwOnError = true), | 227 (_) => diagnosticHandler.throwOnError = true), |
205 new OptionHandler('--suppress-warnings', | 228 new OptionHandler('--suppress-warnings', |
206 (_) => diagnosticHandler.showWarnings = false), | 229 (_) => diagnosticHandler.showWarnings = false), |
207 new OptionHandler('--output-type=dart|--output-type=js', setOutputType), | 230 new OptionHandler('--output-type=dart|--output-type=js', setOutputType), |
208 new OptionHandler('--verbose', setVerbose), | 231 new OptionHandler('--verbose', setVerbose), |
209 new OptionHandler('--version', (_) => wantVersion = true), | 232 new OptionHandler('--version', (_) => wantVersion = true), |
210 new OptionHandler('--library-root=.+', setLibraryRoot), | 233 new OptionHandler('--library-root=.+', setLibraryRoot), |
211 new OptionHandler('--out=.+|-o.+', setOutput), | 234 new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true), |
212 new OptionHandler('--allow-mock-compilation', passThrough), | 235 new OptionHandler('--allow-mock-compilation', passThrough), |
213 new OptionHandler('--minify', passThrough), | 236 new OptionHandler('--minify', passThrough), |
214 new OptionHandler('--force-strip=.*', setStrip), | 237 new OptionHandler('--force-strip=.*', setStrip), |
215 // TODO(ahe): Remove the --no-colors option. | 238 // TODO(ahe): Remove the --no-colors option. |
216 new OptionHandler('--disable-diagnostic-colors', | 239 new OptionHandler('--disable-diagnostic-colors', |
217 (_) => diagnosticHandler.enableColors = false), | 240 (_) => diagnosticHandler.enableColors = false), |
218 new OptionHandler('--enable-diagnostic-colors', | 241 new OptionHandler('--enable-diagnostic-colors', |
219 (_) => diagnosticHandler.enableColors = true), | 242 (_) => diagnosticHandler.enableColors = true), |
220 new OptionHandler('--enable[_-]checked[_-]mode|--checked', | 243 new OptionHandler('--enable[_-]checked[_-]mode|--checked', |
221 (_) => passThrough('--enable-checked-mode')), | 244 (_) => passThrough('--enable-checked-mode')), |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 // This message should be no longer than 20 lines. The default | 418 // This message should be no longer than 20 lines. The default |
396 // terminal size normally 80x24. Two lines are used for the prompts | 419 // terminal size normally 80x24. Two lines are used for the prompts |
397 // before and after running the compiler. Another two lines may be | 420 // before and after running the compiler. Another two lines may be |
398 // used to print an error message. | 421 // used to print an error message. |
399 print(''' | 422 print(''' |
400 Usage: dart2js [options] dartfile | 423 Usage: dart2js [options] dartfile |
401 | 424 |
402 Compiles Dart to JavaScript. | 425 Compiles Dart to JavaScript. |
403 | 426 |
404 Common options: | 427 Common options: |
405 -o<file> Generate the output into <file>. | 428 -o <file> Generate the output into <file>. |
406 -c Insert runtime type checks and enable assertions (checked mode). | 429 -c Insert runtime type checks and enable assertions (checked mode). |
407 -h Display this message (add -v for information about all options).'''); | 430 -h Display this message (add -v for information about all options).''')
; |
408 } | 431 } |
409 | 432 |
410 void verboseHelp() { | 433 void verboseHelp() { |
411 print(r''' | 434 print(r''' |
412 Usage: dart2js [options] dartfile | 435 Usage: dart2js [options] dartfile |
413 | 436 |
414 Compiles Dart to JavaScript. | 437 Compiles Dart to JavaScript. |
415 | 438 |
416 Supported options: | 439 Supported options: |
417 -o<file>, --out=<file> | 440 -o <file>, --out=<file> |
418 Generate the output into <file>. | 441 Generate the output into <file>. |
419 | 442 |
420 -c, --enable-checked-mode, --checked | 443 -c, --enable-checked-mode, --checked |
421 Insert runtime type checks and enable assertions (checked mode). | 444 Insert runtime type checks and enable assertions (checked mode). |
422 | 445 |
423 -h, /h, /?, --help | 446 -h, /h, /?, --help |
424 Display this message (add -v for information about all options). | 447 Display this message (add -v for information about all options). |
425 | 448 |
426 -v, --verbose | 449 -v, --verbose |
427 Display verbose information. | 450 Display verbose information. |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 print(trace); | 567 print(trace); |
545 } finally { | 568 } finally { |
546 exit(253); // 253 is recognized as a crash by our test scripts. | 569 exit(253); // 253 is recognized as a crash by our test scripts. |
547 } | 570 } |
548 } | 571 } |
549 } | 572 } |
550 | 573 |
551 void main() { | 574 void main() { |
552 mainWithErrorHandler(new Options()); | 575 mainWithErrorHandler(new Options()); |
553 } | 576 } |
OLD | NEW |