| OLD | NEW |
| 1 #!/usr/bin/env dart | 1 #!/usr/bin/env dart |
| 2 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
| 4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 /// Command line tool to run the checker on a Dart program. | 6 /// Command line tool to run the checker on a Dart program. |
| 7 library ddc.bin.checker; | 7 library ddc.bin.checker; |
| 8 | 8 |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 | 10 |
| 11 import 'package:args/args.dart'; | |
| 12 import 'package:cli_util/cli_util.dart' show getSdkDir; | |
| 13 import 'package:logging/logging.dart' show Logger, Level; | |
| 14 | |
| 15 import 'package:dev_compiler/config.dart'; | |
| 16 import 'package:dev_compiler/devc.dart'; | 11 import 'package:dev_compiler/devc.dart'; |
| 17 import 'package:dev_compiler/src/checker/dart_sdk.dart' show mockSdkSources; | 12 import 'package:dev_compiler/src/checker/dart_sdk.dart' show mockSdkSources; |
| 18 import 'package:dev_compiler/src/checker/resolver.dart' show TypeResolver; | 13 import 'package:dev_compiler/src/checker/resolver.dart' show TypeResolver; |
| 19 import 'package:dev_compiler/src/options.dart'; | 14 import 'package:dev_compiler/src/options.dart'; |
| 20 | 15 |
| 21 final ArgParser argParser = new ArgParser() | |
| 22 ..addFlag( | |
| 23 'covariant-generics', help: 'Use covariant generics', defaultsTo: true) | |
| 24 ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null) | |
| 25 ..addFlag('dart-gen', | |
| 26 abbr: 'd', help: 'Generate dart output', defaultsTo: false) | |
| 27 ..addFlag('dart-gen-fmt', | |
| 28 help: 'Generate readable dart output', defaultsTo: true) | |
| 29 ..addFlag('dump-info', | |
| 30 abbr: 'i', help: 'Dump summary information', defaultsTo: false) | |
| 31 ..addOption('dump-info-file', | |
| 32 abbr: 'f', | |
| 33 help: 'Dump info json file (requires dump-info)', | |
| 34 defaultsTo: null) | |
| 35 ..addOption('dump-src-to', help: 'Dump dart src code', defaultsTo: null) | |
| 36 ..addFlag('force-compile', | |
| 37 help: 'Compile code with static errors', defaultsTo: false) | |
| 38 ..addFlag('help', abbr: 'h', help: 'Display this message') | |
| 39 ..addFlag('ignore-types', | |
| 40 help: 'Ignore types during codegen', defaultsTo: false) | |
| 41 ..addOption('log', abbr: 'l', help: 'Logging level', defaultsTo: 'severe') | |
| 42 ..addFlag('mock-sdk', | |
| 43 abbr: 'm', help: 'Use a mock Dart SDK', defaultsTo: false) | |
| 44 ..addOption('out', abbr: 'o', help: 'Output directory', defaultsTo: null) | |
| 45 ..addFlag('relaxed-casts', | |
| 46 help: 'Cast between Dart assignable types', defaultsTo: true) | |
| 47 ..addOption('package-root', | |
| 48 abbr: 'p', | |
| 49 help: 'Package root to resolve "package:" imports', | |
| 50 defaultsTo: 'packages/') | |
| 51 ..addFlag('use-multi-package', | |
| 52 help: 'Whether to use the multi-package resolver for "package:" imports', | |
| 53 defaultsTo: false) | |
| 54 ..addOption('nonnullable', | |
| 55 abbr: 'n', | |
| 56 help: 'Comma separated string of non-nullable types', | |
| 57 defaultsTo: null) | |
| 58 ..addOption('package-paths', help: 'if using the multi-package resolver, ' | |
| 59 'the list of directories where to look for packages.', defaultsTo: '') | |
| 60 ..addFlag('sdk-check', | |
| 61 abbr: 's', help: 'Typecheck sdk libs', defaultsTo: false) | |
| 62 ..addFlag('infer-from-overrides', | |
| 63 help: 'Infer unspecified types of fields and return types from ' | |
| 64 'definitions in supertypes', defaultsTo: true) | |
| 65 ..addFlag('infer-transitively', | |
| 66 help: 'Infer consts/fields from definitions in other libraries', | |
| 67 defaultsTo: false) | |
| 68 ..addFlag('infer-only-finals', | |
| 69 help: 'Do not infer non-const or non-final fields', defaultsTo: false) | |
| 70 ..addFlag('infer-eagerly', | |
| 71 help: 'experimental: allows a non-stable order of transitive inference on' | |
| 72 ' consts and fields. This is used to test for possible inference with a ' | |
| 73 'proper implementation in the future.', defaultsTo: false); | |
| 74 | |
| 75 void _showUsageAndExit() { | 16 void _showUsageAndExit() { |
| 76 print('usage: dartdevc [<options>] <file.dart>\n'); | 17 print('usage: dartdevc [<options>] <file.dart>\n'); |
| 77 print('<file.dart> is a single Dart file to process.\n'); | 18 print('<file.dart> is a single Dart file to process.\n'); |
| 78 print('<options> include:\n'); | 19 print('<options> include:\n'); |
| 79 print(argParser.usage); | 20 print(argParser.usage); |
| 80 exit(1); | 21 exit(1); |
| 81 } | 22 } |
| 82 | 23 |
| 83 void main(List<String> argv) { | 24 void main(List<String> args) { |
| 84 ArgResults args = argParser.parse(argv); | 25 var options = parseOptions(args); |
| 85 if (args['help']) _showUsageAndExit(); | 26 if (options.help) _showUsageAndExit(); |
| 86 | 27 |
| 87 bool shouldMockSdk = args['mock-sdk']; | 28 if (!options.useMockSdk && options.dartSdkPath == null) { |
| 88 String dartSdkPath; | 29 print('Could not automatically find dart sdk path.'); |
| 89 if (!shouldMockSdk) { | 30 print('Please pass in explicitly: --dart-sdk <path>'); |
| 90 var sdkDir = getSdkDir(argv); | 31 exit(1); |
| 91 if (sdkDir == null) { | |
| 92 print('Could not automatically find dart sdk path.'); | |
| 93 print('Please pass in explicitly: --dart-sdk <path>'); | |
| 94 exit(1); | |
| 95 } | |
| 96 dartSdkPath = sdkDir.path; | |
| 97 } | 32 } |
| 98 | 33 |
| 99 if (args.rest.length == 0) { | 34 if (options.entryPointFile == null) { |
| 100 print('Expected filename.'); | 35 print('Expected filename.'); |
| 101 _showUsageAndExit(); | 36 _showUsageAndExit(); |
| 102 } | 37 } |
| 103 | 38 |
| 104 String levelName = args['log'].toUpperCase(); | 39 if (!options.dumpInfo) setupLogger(options.logLevel, print); |
| 105 Level level = Level.LEVELS.firstWhere((Level l) => l.name == levelName, | |
| 106 orElse: () => Level.SEVERE); | |
| 107 var useColors = stdioType(stdout) == StdioType.TERMINAL; | |
| 108 if (!args['dump-info']) setupLogger(level, print); | |
| 109 | 40 |
| 110 var options = new CompilerOptions( | 41 var typeResolver = options.useMockSdk |
| 111 checkSdk: args['sdk-check'], | |
| 112 dumpInfo: args['dump-info'], | |
| 113 dumpInfoFile: args['dump-info-file'], | |
| 114 dumpSrcDir: args['dump-src-to'], | |
| 115 forceCompile: args['force-compile'], | |
| 116 formatOutput: args['dart-gen-fmt'], | |
| 117 ignoreTypes: args['ignore-types'], | |
| 118 outputDart: args['dart-gen'], | |
| 119 outputDir: args['out'], | |
| 120 covariantGenerics: args['covariant-generics'], | |
| 121 relaxedCasts: args['relaxed-casts'], | |
| 122 useColors: useColors, | |
| 123 useMultiPackage: args['use-multi-package'], | |
| 124 packageRoot: args['package-root'], | |
| 125 packagePaths: args['package-paths'].split(','), | |
| 126 inferFromOverrides: args['infer-from-overrides'], | |
| 127 inferStaticsFromIdentifiers: args['infer-transitively'], | |
| 128 inferInNonStableOrder: args['infer-eagerly'], | |
| 129 onlyInferConstsAndFinalFields: args['infer-only-finals'], | |
| 130 nonnullableTypes: optionsToList(args['nonnullable'], | |
| 131 defaultValue: TypeOptions.NONNULLABLE_TYPES)); | |
| 132 | |
| 133 var typeResolver = shouldMockSdk | |
| 134 ? new TypeResolver.fromMock(mockSdkSources, options) | 42 ? new TypeResolver.fromMock(mockSdkSources, options) |
| 135 : new TypeResolver.fromDir(dartSdkPath, options); | 43 : new TypeResolver.fromDir(options.dartSdkPath, options); |
| 136 var filename = args.rest.first; | 44 var result = compile(options.entryPointFile, typeResolver, options); |
| 137 var result = compile(filename, typeResolver, options); | |
| 138 exit(result.failure ? 1 : 0); | 45 exit(result.failure ? 1 : 0); |
| 139 } | 46 } |
| OLD | NEW |