OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 /// Set of flags and options passed to the compiler | 5 /// Set of flags and options passed to the compiler |
6 library dev_compiler.src.options; | 6 library dev_compiler.src.options; |
7 | 7 |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 | 9 |
10 import 'package:args/args.dart'; | 10 import 'package:args/args.dart'; |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 | 229 |
230 /// Whether to emit the source map files. | 230 /// Whether to emit the source map files. |
231 @override | 231 @override |
232 final bool emitSourceMaps; | 232 final bool emitSourceMaps; |
233 | 233 |
234 /// Location for runtime files, such as `dart_runtime.js`. By default this is | 234 /// Location for runtime files, such as `dart_runtime.js`. By default this is |
235 /// inferred to be under `lib/runtime/` in the location of the `dev_compiler` | 235 /// inferred to be under `lib/runtime/` in the location of the `dev_compiler` |
236 /// package (if we can infer where that is located). | 236 /// package (if we can infer where that is located). |
237 final String runtimeDir; | 237 final String runtimeDir; |
238 | 238 |
| 239 /// Custom URI mappings, such as "dart:foo" -> "path/to/foo.dart" |
| 240 final Map<String, String> customUrlMappings; |
| 241 |
239 CompilerOptions({this.allowConstCasts: true, this.checkSdk: false, | 242 CompilerOptions({this.allowConstCasts: true, this.checkSdk: false, |
240 this.dumpInfo: false, this.dumpInfoFile, this.dumpSrcDir, | 243 this.dumpInfo: false, this.dumpInfoFile, this.dumpSrcDir, |
241 this.forceCompile: false, this.formatOutput: false, | 244 this.forceCompile: false, this.formatOutput: false, |
242 this.ignoreTypes: false, | 245 this.ignoreTypes: false, |
243 this.wrapClosures: RulesOptions.wrapClosuresDefault, this.outputDir, | 246 this.wrapClosures: RulesOptions.wrapClosuresDefault, this.outputDir, |
244 this.outputDart: false, this.useColors: true, | 247 this.outputDart: false, this.useColors: true, |
245 this.covariantGenerics: true, this.relaxedCasts: true, | 248 this.covariantGenerics: true, this.relaxedCasts: true, |
246 this.useMultiPackage: false, this.packageRoot: 'packages/', | 249 this.useMultiPackage: false, this.packageRoot: 'packages/', |
247 this.packagePaths: const <String>[], this.resources: const <String>[], | 250 this.packagePaths: const <String>[], this.resources: const <String>[], |
248 this.inferDownwards: RulesOptions.inferDownwardsDefault, | 251 this.inferDownwards: RulesOptions.inferDownwardsDefault, |
249 this.inferFromOverrides: ResolverOptions.inferFromOverridesDefault, | 252 this.inferFromOverrides: ResolverOptions.inferFromOverridesDefault, |
250 this.inferTransitively: ResolverOptions.inferTransitivelyDefault, | 253 this.inferTransitively: ResolverOptions.inferTransitivelyDefault, |
251 this.onlyInferConstsAndFinalFields: ResolverOptions.onlyInferConstAndFinal
FieldsDefault, | 254 this.onlyInferConstsAndFinalFields: ResolverOptions.onlyInferConstAndFinal
FieldsDefault, |
252 this.nonnullableTypes: TypeOptions.NONNULLABLE_TYPES, this.help: false, | 255 this.nonnullableTypes: TypeOptions.NONNULLABLE_TYPES, this.help: false, |
253 this.useMockSdk: false, this.dartSdkPath, this.logLevel: Level.SEVERE, | 256 this.useMockSdk: false, this.dartSdkPath, this.logLevel: Level.SEVERE, |
254 this.emitSourceMaps: true, this.entryPointFile: null, | 257 this.emitSourceMaps: true, this.entryPointFile: null, |
255 this.serverMode: false, this.useImplicitHtml: false, | 258 this.serverMode: false, this.useImplicitHtml: false, |
256 this.enableHashing: false, this.host: 'localhost', this.port: 8080, | 259 this.enableHashing: false, this.host: 'localhost', this.port: 8080, |
257 this.runtimeDir}); | 260 this.runtimeDir, this.customUrlMappings: const {}}); |
258 } | 261 } |
259 | 262 |
260 /// Parses options from the command-line | 263 /// Parses options from the command-line |
261 CompilerOptions parseOptions(List<String> argv) { | 264 CompilerOptions parseOptions(List<String> argv) { |
262 ArgResults args = argParser.parse(argv); | 265 ArgResults args = argParser.parse(argv); |
| 266 bool showUsage = args['help']; |
| 267 |
263 var serverMode = args['server']; | 268 var serverMode = args['server']; |
264 var enableHashing = args['hashing']; | 269 var enableHashing = args['hashing']; |
265 if (enableHashing == null) { | 270 if (enableHashing == null) { |
266 enableHashing = serverMode; | 271 enableHashing = serverMode; |
267 } | 272 } |
268 // TODO(jmesserly): shouldn't level always default to warning? | 273 // TODO(jmesserly): shouldn't level always default to warning? |
269 var logLevel = serverMode ? Level.WARNING : Level.SEVERE; | 274 var logLevel = serverMode ? Level.WARNING : Level.SEVERE; |
270 var levelName = args['log']; | 275 var levelName = args['log']; |
271 if (levelName != null) { | 276 if (levelName != null) { |
272 levelName = levelName.toUpperCase(); | 277 levelName = levelName.toUpperCase(); |
273 logLevel = Level.LEVELS.firstWhere((l) => l.name == levelName, | 278 logLevel = Level.LEVELS.firstWhere((l) => l.name == levelName, |
274 orElse: () => logLevel); | 279 orElse: () => logLevel); |
275 } | 280 } |
276 var useColors = stdioType(stdout) == StdioType.TERMINAL; | 281 var useColors = stdioType(stdout) == StdioType.TERMINAL; |
277 var sdkPath = args['dart-sdk']; | 282 var sdkPath = args['dart-sdk']; |
278 if (sdkPath == null && !args['mock-sdk']) { | 283 if (sdkPath == null && !args['mock-sdk']) { |
279 sdkPath = getSdkDir(argv).path; | 284 sdkPath = getSdkDir(argv).path; |
280 } | 285 } |
281 var runtimeDir = args['runtime-dir']; | 286 var runtimeDir = args['runtime-dir']; |
282 if (runtimeDir == null) { | 287 if (runtimeDir == null) { |
283 runtimeDir = _computeRuntimeDir(); | 288 runtimeDir = _computeRuntimeDir(); |
284 } | 289 } |
285 var outputDir = args['out']; | 290 var outputDir = args['out']; |
286 if (outputDir == null && serverMode) { | 291 if (outputDir == null && serverMode) { |
287 outputDir = Directory.systemTemp.createTempSync("dev_compiler_out_").path; | 292 outputDir = Directory.systemTemp.createTempSync("dev_compiler_out_").path; |
288 } | 293 } |
289 var dumpInfo = args['dump-info']; | 294 var dumpInfo = args['dump-info']; |
290 if (dumpInfo == null) dumpInfo = serverMode; | 295 if (dumpInfo == null) dumpInfo = serverMode; |
291 | 296 |
| 297 var customUrlMappings = <String, String>{}; |
| 298 for (var mapping in args['url-mapping']) { |
| 299 var splitMapping = mapping.split(','); |
| 300 if (splitMapping.length != 2) { |
| 301 showUsage = true; |
| 302 continue; |
| 303 } |
| 304 customUrlMappings[splitMapping[0]] = splitMapping[1]; |
| 305 } |
| 306 |
292 var entryPointFile = args.rest.length == 0 ? null : args.rest.first; | 307 var entryPointFile = args.rest.length == 0 ? null : args.rest.first; |
293 | 308 |
294 return new CompilerOptions( | 309 return new CompilerOptions( |
295 allowConstCasts: args['allow-const-casts'], | 310 allowConstCasts: args['allow-const-casts'], |
296 checkSdk: args['sdk-check'], | 311 checkSdk: args['sdk-check'], |
297 dumpInfo: dumpInfo, | 312 dumpInfo: dumpInfo, |
298 dumpInfoFile: args['dump-info-file'], | 313 dumpInfoFile: args['dump-info-file'], |
299 dumpSrcDir: args['dump-src-to'], | 314 dumpSrcDir: args['dump-src-to'], |
300 forceCompile: args['force-compile'] || serverMode, | 315 forceCompile: args['force-compile'] || serverMode, |
301 formatOutput: args['dart-gen-fmt'], | 316 formatOutput: args['dart-gen-fmt'], |
302 ignoreTypes: args['ignore-types'], | 317 ignoreTypes: args['ignore-types'], |
303 wrapClosures: args['wrap-closures'], | 318 wrapClosures: args['wrap-closures'], |
304 outputDart: args['dart-gen'], | 319 outputDart: args['dart-gen'], |
305 outputDir: outputDir, | 320 outputDir: outputDir, |
306 covariantGenerics: args['covariant-generics'], | 321 covariantGenerics: args['covariant-generics'], |
307 relaxedCasts: args['relaxed-casts'], | 322 relaxedCasts: args['relaxed-casts'], |
308 useColors: useColors, | 323 useColors: useColors, |
| 324 customUrlMappings: customUrlMappings, |
309 useMultiPackage: args['use-multi-package'], | 325 useMultiPackage: args['use-multi-package'], |
310 packageRoot: args['package-root'], | 326 packageRoot: args['package-root'], |
311 packagePaths: args['package-paths'].split(','), | 327 packagePaths: args['package-paths'].split(','), |
312 resources: args['resources'] | 328 resources: args['resources'] |
313 .split(',') | 329 .split(',') |
314 .where((s) => s.isNotEmpty) | 330 .where((s) => s.isNotEmpty) |
315 .toList(), | 331 .toList(), |
316 inferDownwards: args['infer-downwards'], | 332 inferDownwards: args['infer-downwards'], |
317 inferFromOverrides: args['infer-from-overrides'], | 333 inferFromOverrides: args['infer-from-overrides'], |
318 inferTransitively: args['infer-transitively'], | 334 inferTransitively: args['infer-transitively'], |
319 onlyInferConstsAndFinalFields: args['infer-only-finals'], | 335 onlyInferConstsAndFinalFields: args['infer-only-finals'], |
320 nonnullableTypes: optionsToList(args['nonnullable'], | 336 nonnullableTypes: optionsToList(args['nonnullable'], |
321 defaultValue: TypeOptions.NONNULLABLE_TYPES), | 337 defaultValue: TypeOptions.NONNULLABLE_TYPES), |
322 help: args['help'], | 338 help: showUsage, |
323 useMockSdk: args['mock-sdk'], | 339 useMockSdk: args['mock-sdk'], |
324 dartSdkPath: sdkPath, | 340 dartSdkPath: sdkPath, |
325 logLevel: logLevel, | 341 logLevel: logLevel, |
326 emitSourceMaps: args['source-maps'], | 342 emitSourceMaps: args['source-maps'], |
327 entryPointFile: entryPointFile, | 343 entryPointFile: entryPointFile, |
328 serverMode: serverMode, | 344 serverMode: serverMode, |
329 useImplicitHtml: serverMode && entryPointFile.endsWith('.dart'), | 345 useImplicitHtml: serverMode && entryPointFile.endsWith('.dart'), |
330 enableHashing: enableHashing, | 346 enableHashing: enableHashing, |
331 host: args['host'], | 347 host: args['host'], |
332 port: int.parse(args['port']), | 348 port: int.parse(args['port']), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null) | 389 ..addOption('dart-sdk', help: 'Dart SDK Path', defaultsTo: null) |
374 ..addFlag('dart-gen', | 390 ..addFlag('dart-gen', |
375 abbr: 'd', help: 'Generate dart output', defaultsTo: false) | 391 abbr: 'd', help: 'Generate dart output', defaultsTo: false) |
376 ..addFlag('dart-gen-fmt', | 392 ..addFlag('dart-gen-fmt', |
377 help: 'Generate readable dart output', defaultsTo: true) | 393 help: 'Generate readable dart output', defaultsTo: true) |
378 ..addOption('dump-src-to', help: 'Dump dart src code', defaultsTo: null) | 394 ..addOption('dump-src-to', help: 'Dump dart src code', defaultsTo: null) |
379 ..addOption('package-root', | 395 ..addOption('package-root', |
380 abbr: 'p', | 396 abbr: 'p', |
381 help: 'Package root to resolve "package:" imports', | 397 help: 'Package root to resolve "package:" imports', |
382 defaultsTo: 'packages/') | 398 defaultsTo: 'packages/') |
| 399 ..addOption('url-mapping', |
| 400 help: '--url-mapping=libraryUri,/path/to/library.dart uses library.dart\n' |
| 401 'as the source for an import of of "libraryUri".', |
| 402 allowMultiple: true, |
| 403 splitCommas: false) |
383 ..addFlag('use-multi-package', | 404 ..addFlag('use-multi-package', |
384 help: 'Whether to use the multi-package resolver for "package:" imports', | 405 help: 'Whether to use the multi-package resolver for "package:" imports', |
385 defaultsTo: false) | 406 defaultsTo: false) |
386 ..addOption('package-paths', | 407 ..addOption('package-paths', |
387 help: 'if using the multi-package resolver, the list of directories to\n' | 408 help: 'if using the multi-package resolver, the list of directories to\n' |
388 'look for packages in.', defaultsTo: '') | 409 'look for packages in.', defaultsTo: '') |
389 ..addOption('resources', | 410 ..addOption('resources', |
390 help: 'Additional resources to serve', defaultsTo: '') | 411 help: 'Additional resources to serve', defaultsTo: '') |
391 ..addFlag('source-maps', | 412 ..addFlag('source-maps', |
392 help: 'Whether to emit source map files', defaultsTo: true) | 413 help: 'Whether to emit source map files', defaultsTo: true) |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 // The pub-cache directory is two levels up, but we verify that the layout | 479 // The pub-cache directory is two levels up, but we verify that the layout |
459 // looks correct. | 480 // looks correct. |
460 if (path.basename(dir) != 'dev_compiler') return null; | 481 if (path.basename(dir) != 'dev_compiler') return null; |
461 dir = path.dirname(dir); | 482 dir = path.dirname(dir); |
462 if (path.basename(dir) != 'global_packages') return null; | 483 if (path.basename(dir) != 'global_packages') return null; |
463 dir = path.dirname(dir); | 484 dir = path.dirname(dir); |
464 return path.join(dir, cacheDir, 'lib', 'runtime'); | 485 return path.join(dir, cacheDir, 'lib', 'runtime'); |
465 } | 486 } |
466 return null; | 487 return null; |
467 } | 488 } |
OLD | NEW |