Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/dart2js.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart |
| index b44541509d61898caba2c840451aa51e13d98d03..bc203ed8a98093253c5e55a665e25fbc983365d5 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/dart2js.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart |
| @@ -56,7 +56,7 @@ String extractParameter(String argument) { |
| // m[0] is the entire match (which will be equal to argument). m[1] |
| // is something like "-o" or "--out=", and m[2] is the parameter. |
| Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument); |
| - if (m == null) helpAndFail('Error: Unknown option "$argument".'); |
| + if (m == null) helpAndFail('Unknown option "$argument".'); |
| return m[2]; |
| } |
| @@ -109,6 +109,9 @@ Future compile(List<String> argv) { |
| String outputLanguage = 'JavaScript'; |
| bool stripArgumentSet = false; |
| bool analyzeOnly = false; |
| + bool analyzeAll = false; |
| + // List of provided options that imply that output is expected. |
| + List<String> optionsImplyCompilation = <String>[]; |
| bool hasDisallowUnsafeEval = false; |
| // TODO(johnniwinther): Measure time for reading files. |
| SourceFileProvider inputProvider = new CompilerSourceFileProvider(); |
| @@ -130,6 +133,7 @@ Future compile(List<String> argv) { |
| } |
| setOutput(Iterator<String> arguments) { |
| + optionsImplyCompilation.add(arguments.current); |
| String path; |
| if (arguments.current == '-o') { |
| if (!arguments.moveNext()) { |
| @@ -145,6 +149,7 @@ Future compile(List<String> argv) { |
| } |
| setOutputType(String argument) { |
| + optionsImplyCompilation.add(argument); |
| if (argument == '--output-type=dart') { |
| outputLanguage = OUTPUT_LANGUAGE_DART; |
| if (!explicitOut) { |
| @@ -162,6 +167,7 @@ Future compile(List<String> argv) { |
| } |
| setStrip(String argument) { |
| + optionsImplyCompilation.add(argument); |
| stripArgumentSet = true; |
| passThrough(argument); |
| } |
| @@ -171,11 +177,21 @@ Future compile(List<String> argv) { |
| passThrough(argument); |
| } |
| + setAnalyzeAll(String argument) { |
| + analyzeAll = true; |
| + passThrough(argument); |
| + } |
| + |
| setVerbose(_) { |
| diagnosticHandler.verbose = true; |
| passThrough('--verbose'); |
| } |
| + implyCompilation(String argument) { |
| + optionsImplyCompilation.add(argument); |
| + passThrough(argument); |
| + } |
| + |
| addInEnvironment(String argument) { |
| int eqIndex = argument.indexOf('='); |
| String name = argument.substring(2, eqIndex); |
| @@ -198,7 +214,7 @@ Future compile(List<String> argv) { |
| String allowedCategoriesString = allowedCategoriesList.join(', '); |
| for (String category in categories) { |
| if (!allowedCategories.contains(category)) { |
| - fail('Error: unsupported library category "$category", ' |
| + fail('Unsupported library category "$category", ' |
| 'supported categories are: $allowedCategoriesString'); |
| } |
| } |
| @@ -221,7 +237,7 @@ Future compile(List<String> argv) { |
| passThrough('--enable-checked-mode'); |
| break; |
| case 'm': |
| - passThrough('--minify'); |
| + implyCompilation('--minify'); |
| break; |
| default: |
| throw 'Internal error: "$shortOption" did not match'; |
| @@ -255,7 +271,7 @@ Future compile(List<String> argv) { |
| new OptionHandler('--library-root=.+', setLibraryRoot), |
| new OptionHandler('--out=.+|-o.*', setOutput, multipleArguments: true), |
| new OptionHandler('--allow-mock-compilation', passThrough), |
| - new OptionHandler('--minify|-m', passThrough), |
| + new OptionHandler('--minify|-m', implyCompilation), |
| new OptionHandler('--force-strip=.*', setStrip), |
| new OptionHandler('--disable-diagnostic-colors', |
| (_) => diagnosticHandler.enableColors = false), |
| @@ -264,19 +280,20 @@ Future compile(List<String> argv) { |
| new OptionHandler('--enable[_-]checked[_-]mode|--checked', |
| (_) => passThrough('--enable-checked-mode')), |
| new OptionHandler('--enable-concrete-type-inference', |
| - (_) => passThrough('--enable-concrete-type-inference')), |
| + (_) => implyCompilation( |
| + '--enable-concrete-type-inference')), |
| new OptionHandler('--trust-type-annotations', |
| - (_) => passThrough('--trust-type-annotations')), |
| + (_) => implyCompilation('--trust-type-annotations')), |
| new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true), |
| new OptionHandler('--package-root=.+|-p.+', setPackageRoot), |
| - new OptionHandler('--analyze-all', passThrough), |
| + new OptionHandler('--analyze-all', setAnalyzeAll), |
| new OptionHandler('--analyze-only', setAnalyzeOnly), |
| - new OptionHandler('--analyze-signatures-only', passThrough), |
| + new OptionHandler('--analyze-signatures-only', setAnalyzeOnly), |
| new OptionHandler('--disable-native-live-type-analysis', passThrough), |
| new OptionHandler('--categories=.*', setCategories), |
| - new OptionHandler('--disable-type-inference', passThrough), |
| + new OptionHandler('--disable-type-inference', implyCompilation), |
| new OptionHandler('--terse', passThrough), |
| - new OptionHandler('--dump-info', passThrough), |
| + new OptionHandler('--dump-info', implyCompilation), |
| new OptionHandler('--disallow-unsafe-eval', |
| (_) => hasDisallowUnsafeEval = true), |
| new OptionHandler('--hide-package-warnings', passThrough), |
| @@ -284,7 +301,7 @@ Future compile(List<String> argv) { |
| // The following two options must come last. |
| new OptionHandler('-.*', (String argument) { |
| - helpAndFail('Error: Unknown option "$argument".'); |
| + helpAndFail("Unknown option '$argument'."); |
| }), |
| new OptionHandler('.*', (String argument) { |
| arguments.add(nativeToUriPath(argument)); |
| @@ -299,21 +316,21 @@ Future compile(List<String> argv) { |
| if (hasDisallowUnsafeEval) { |
| String precompiledName = |
| relativize(currentDirectory, computePrecompiledUri(), isWindows); |
| - helpAndFail("Error: option '--disallow-unsafe-eval' has been removed." |
| + helpAndFail("Option '--disallow-unsafe-eval' has been removed." |
| " Instead, the compiler generates a file named" |
| " '$precompiledName'."); |
| } |
| if (outputLanguage != OUTPUT_LANGUAGE_DART && stripArgumentSet) { |
| - helpAndFail('Error: --force-strip may only be used with ' |
| - '--output-type=dart'); |
| + helpAndFail("Option '--force-strip' may only be used with " |
| + "'--output-type=dart'."); |
| } |
| if (arguments.isEmpty) { |
| - helpAndFail('Error: No Dart file specified.'); |
| + helpAndFail('No Dart file specified.'); |
| } |
| if (arguments.length > 1) { |
| var extra = arguments.sublist(1); |
| - helpAndFail('Error: Extra arguments: ${extra.join(" ")}'); |
| + helpAndFail('Extra arguments: ${extra.join(" ")}'); |
| } |
| Uri uri = currentDirectory.resolve(arguments[0]); |
| @@ -321,7 +338,22 @@ Future compile(List<String> argv) { |
| packageRoot = uri.resolve('./packages/'); |
| } |
| - diagnosticHandler.info('package root is $packageRoot'); |
| + if ((analyzeOnly || analyzeAll) && !optionsImplyCompilation.isEmpty) { |
| + if (!analyzeOnly) { |
| + diagnosticHandler.info( |
| + "Option '--analyze-all' implies '--analyze-only'.", |
| + api.Diagnostic.INFO); |
| + } |
| + diagnosticHandler.info( |
| + "Options $optionsImplyCompilation indicate that output is expected, " |
| + "but compilation is turned off by the option '--analyze-only'.", |
| + api.Diagnostic.INFO); |
| + } |
| + if (analyzeAll) { |
|
floitsch
2014/03/07 14:03:35
*nit*: 'if' on one line.
Johnni Winther
2014/03/10 07:03:08
Done.
|
| + analyzeOnly = true; |
| + } |
| + |
| + diagnosticHandler.info('Package root is $packageRoot'); |
| int totalCharactersWritten = 0; |
| @@ -332,7 +364,7 @@ Future compile(List<String> argv) { |
| compilationDone(String code) { |
| if (analyzeOnly) return; |
| if (code == null) { |
| - fail('Error: Compilation failed.'); |
| + fail('Compilation failed.'); |
| } |
| writeString(Uri.parse('$out.deps'), |
| getDepsOutput(inputProvider.sourceFiles)); |
| @@ -375,14 +407,14 @@ Future compile(List<String> argv) { |
| String outName = out.path.substring(out.path.lastIndexOf('/') + 1); |
| uri = out.resolve('${outName}.$extension'); |
| } else { |
| - fail('Error: Unknown extension: $extension'); |
| + fail('Unknown extension: $extension'); |
| } |
| } else { |
| uri = out.resolve('$name.$extension'); |
| } |
| if (uri.scheme != 'file') { |
| - fail('Error: Unhandled scheme ${uri.scheme} in $uri.'); |
| + fail('Unhandled scheme ${uri.scheme} in $uri.'); |
| } |
| RandomAccessFile output; |
| @@ -460,7 +492,7 @@ class AbortLeg { |
| void writeString(Uri uri, String text) { |
| if (uri.scheme != 'file') { |
| - fail('Error: Unhandled scheme ${uri.scheme}.'); |
| + fail('Unhandled scheme ${uri.scheme}.'); |
| } |
| var file = new File(uri.toFilePath()).openSync(mode: FileMode.WRITE); |
| file.writeStringSync(text); |
| @@ -472,7 +504,7 @@ void fail(String message) { |
| diagnosticHandler.diagnosticHandler( |
| null, -1, -1, message, api.Diagnostic.ERROR); |
| } else { |
| - print(message); |
| + print('Error: $message'); |
| } |
| exitFunc(1); |
| } |
| @@ -534,9 +566,7 @@ Supported options: |
| --analyze-all |
| Analyze all code. Without this option, the compiler only analyzes |
| - code that is reachable from [main]. This option is useful for |
| - finding errors in libraries, but using it can result in bigger and |
| - slower output. |
| + code that is reachable from [main]. This option implies --analyze-only. |
| --analyze-only |
| Analyze but do not generate code. |