 Chromium Code Reviews
 Chromium Code Reviews| 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.driver; | 5 library analyzer_cli.src.driver; | 
| 6 | 6 | 
| 7 import 'dart:async'; | 7 import 'dart:async'; | 
| 8 import 'dart:convert'; | 8 import 'dart:convert'; | 
| 9 import 'dart:io'; | 9 import 'dart:io'; | 
| 10 | 10 | 
| 11 import 'package:analyzer/file_system/file_system.dart' as fileSystem; | 11 import 'package:analyzer/file_system/file_system.dart' as file_system; | 
| 12 import 'package:analyzer/file_system/physical_file_system.dart'; | 12 import 'package:analyzer/file_system/physical_file_system.dart'; | 
| 13 import 'package:analyzer/plugin/embedded_resolver_provider.dart'; | 13 import 'package:analyzer/plugin/embedded_resolver_provider.dart'; | 
| 14 import 'package:analyzer/plugin/options.dart'; | 14 import 'package:analyzer/plugin/options.dart'; | 
| 15 import 'package:analyzer/plugin/resolver_provider.dart'; | 15 import 'package:analyzer/plugin/resolver_provider.dart'; | 
| 16 import 'package:analyzer/source/analysis_options_provider.dart'; | 16 import 'package:analyzer/source/analysis_options_provider.dart'; | 
| 17 import 'package:analyzer/source/embedder.dart'; | 17 import 'package:analyzer/source/embedder.dart'; | 
| 18 import 'package:analyzer/source/package_map_provider.dart'; | 18 import 'package:analyzer/source/package_map_provider.dart'; | 
| 19 import 'package:analyzer/source/package_map_resolver.dart'; | 19 import 'package:analyzer/source/package_map_resolver.dart'; | 
| 20 import 'package:analyzer/source/pub_package_map_provider.dart'; | 20 import 'package:analyzer/source/pub_package_map_provider.dart'; | 
| 21 import 'package:analyzer/source/sdk_ext.dart'; | 21 import 'package:analyzer/source/sdk_ext.dart'; | 
| (...skipping 12 matching lines...) Expand all Loading... | |
| 34 import 'package:analyzer/src/services/lint.dart'; | 34 import 'package:analyzer/src/services/lint.dart'; | 
| 35 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; | 35 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; | 
| 36 import 'package:analyzer/src/task/options.dart'; | 36 import 'package:analyzer/src/task/options.dart'; | 
| 37 import 'package:analyzer_cli/src/analyzer_impl.dart'; | 37 import 'package:analyzer_cli/src/analyzer_impl.dart'; | 
| 38 import 'package:analyzer_cli/src/build_mode.dart'; | 38 import 'package:analyzer_cli/src/build_mode.dart'; | 
| 39 import 'package:analyzer_cli/src/error_formatter.dart'; | 39 import 'package:analyzer_cli/src/error_formatter.dart'; | 
| 40 import 'package:analyzer_cli/src/options.dart'; | 40 import 'package:analyzer_cli/src/options.dart'; | 
| 41 import 'package:analyzer_cli/src/perf_report.dart'; | 41 import 'package:analyzer_cli/src/perf_report.dart'; | 
| 42 import 'package:analyzer_cli/starter.dart'; | 42 import 'package:analyzer_cli/starter.dart'; | 
| 43 import 'package:linter/src/plugin/linter_plugin.dart'; | 43 import 'package:linter/src/plugin/linter_plugin.dart'; | 
| 44 import 'package:package_config/discovery.dart' as pkgDiscovery; | 44 import 'package:package_config/discovery.dart' as pkg_discovery; | 
| 45 import 'package:package_config/packages.dart' show Packages; | 45 import 'package:package_config/packages.dart' show Packages; | 
| 46 import 'package:package_config/packages_file.dart' as pkgfile show parse; | 46 import 'package:package_config/packages_file.dart' as pkgfile show parse; | 
| 47 import 'package:package_config/src/packages_impl.dart' show MapPackages; | 47 import 'package:package_config/src/packages_impl.dart' show MapPackages; | 
| 48 import 'package:path/path.dart' as path; | 48 import 'package:path/path.dart' as path; | 
| 49 import 'package:plugin/manager.dart'; | 49 import 'package:plugin/manager.dart'; | 
| 50 import 'package:plugin/plugin.dart'; | 50 import 'package:plugin/plugin.dart'; | 
| 51 import 'package:yaml/yaml.dart'; | 51 import 'package:yaml/yaml.dart'; | 
| 52 | 52 | 
| 53 /// Shared IO sink for standard error reporting. | 53 /// Shared IO sink for standard error reporting. | 
| 54 /// | 54 /// | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 | 97 | 
| 98 /// Collected analysis statistics. | 98 /// Collected analysis statistics. | 
| 99 final AnalysisStats stats = new AnalysisStats(); | 99 final AnalysisStats stats = new AnalysisStats(); | 
| 100 | 100 | 
| 101 /// This Driver's current analysis context. | 101 /// This Driver's current analysis context. | 
| 102 /// | 102 /// | 
| 103 /// *Visible for testing.* | 103 /// *Visible for testing.* | 
| 104 AnalysisContext get context => _context; | 104 AnalysisContext get context => _context; | 
| 105 | 105 | 
| 106 @override | 106 @override | 
| 107 void set userDefinedPlugins(List<Plugin> plugins) { | 107 set userDefinedPlugins(List<Plugin> plugins) { | 
| 
Brian Wilkerson
2016/05/18 14:42:19
Personally, I like having "void" for setters. I kn
 
pquitslund
2016/05/18 17:26:40
Got it.  It should come as no surprise that I tend
 | |
| 108 _userDefinedPlugins = plugins ?? <Plugin>[]; | 108 _userDefinedPlugins = plugins ?? <Plugin>[]; | 
| 109 } | 109 } | 
| 110 | 110 | 
| 111 @override | 111 @override | 
| 112 void start(List<String> args) { | 112 void start(List<String> args) { | 
| 113 if (_context != null) { | 113 if (_context != null) { | 
| 114 throw new StateError("start() can only be called once"); | 114 throw new StateError("start() can only be called once"); | 
| 115 } | 115 } | 
| 116 int startTime = new DateTime.now().millisecondsSinceEpoch; | 116 int startTime = new DateTime.now().millisecondsSinceEpoch; | 
| 117 | 117 | 
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 324 // diagnostics. (Full parse is still needed for "self" packages.) | 324 // diagnostics. (Full parse is still needed for "self" packages.) | 
| 325 return true; | 325 return true; | 
| 326 } | 326 } | 
| 327 }; | 327 }; | 
| 328 } | 328 } | 
| 329 | 329 | 
| 330 /// Decide on the appropriate method for resolving URIs based on the given | 330 /// Decide on the appropriate method for resolving URIs based on the given | 
| 331 /// [options] and [customUrlMappings] settings, and return a | 331 /// [options] and [customUrlMappings] settings, and return a | 
| 332 /// [SourceFactory] that has been configured accordingly. | 332 /// [SourceFactory] that has been configured accordingly. | 
| 333 SourceFactory _chooseUriResolutionPolicy(CommandLineOptions options, | 333 SourceFactory _chooseUriResolutionPolicy(CommandLineOptions options, | 
| 334 Map<fileSystem.Folder, YamlMap> embedderMap, _PackageInfo packageInfo) { | 334 Map<file_system.Folder, YamlMap> embedderMap, _PackageInfo packageInfo) { | 
| 335 // Create a custom package resolver if one has been specified. | 335 // Create a custom package resolver if one has been specified. | 
| 336 if (packageResolverProvider != null) { | 336 if (packageResolverProvider != null) { | 
| 337 fileSystem.Folder folder = | 337 file_system.Folder folder = | 
| 338 PhysicalResourceProvider.INSTANCE.getResource('.'); | 338 PhysicalResourceProvider.INSTANCE.getResource('.'); | 
| 339 UriResolver resolver = packageResolverProvider(folder); | 339 UriResolver resolver = packageResolverProvider(folder); | 
| 340 if (resolver != null) { | 340 if (resolver != null) { | 
| 341 UriResolver sdkResolver; | 341 UriResolver sdkResolver; | 
| 342 | 342 | 
| 343 // Check for a resolver provider. | 343 // Check for a resolver provider. | 
| 344 if (embeddedUriResolverProvider != null) { | 344 if (embeddedUriResolverProvider != null) { | 
| 345 EmbedderUriResolver embedderUriResolver = | 345 EmbedderUriResolver embedderUriResolver = | 
| 346 embeddedUriResolverProvider(folder); | 346 embeddedUriResolverProvider(folder); | 
| 347 if (embedderUriResolver != null && embedderUriResolver.length != 0) { | 347 if (embedderUriResolver != null && embedderUriResolver.length != 0) { | 
| (...skipping 18 matching lines...) Expand all Loading... | |
| 366 | 366 | 
| 367 if (options.packageRootPath != null) { | 367 if (options.packageRootPath != null) { | 
| 368 JavaFile packageDirectory = new JavaFile(options.packageRootPath); | 368 JavaFile packageDirectory = new JavaFile(options.packageRootPath); | 
| 369 packageUriResolver = new PackageUriResolver([packageDirectory]); | 369 packageUriResolver = new PackageUriResolver([packageDirectory]); | 
| 370 } else if (options.packageConfigPath == null) { | 370 } else if (options.packageConfigPath == null) { | 
| 371 // TODO(pq): remove? | 371 // TODO(pq): remove? | 
| 372 if (packageInfo.packageMap == null) { | 372 if (packageInfo.packageMap == null) { | 
| 373 // Fall back to pub list-package-dirs. | 373 // Fall back to pub list-package-dirs. | 
| 374 PubPackageMapProvider pubPackageMapProvider = | 374 PubPackageMapProvider pubPackageMapProvider = | 
| 375 new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk); | 375 new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk); | 
| 376 fileSystem.Resource cwd = | 376 file_system.Resource cwd = | 
| 377 PhysicalResourceProvider.INSTANCE.getResource('.'); | 377 PhysicalResourceProvider.INSTANCE.getResource('.'); | 
| 378 PackageMapInfo packageMapInfo = | 378 PackageMapInfo packageMapInfo = | 
| 379 pubPackageMapProvider.computePackageMap(cwd); | 379 pubPackageMapProvider.computePackageMap(cwd); | 
| 380 Map<String, List<fileSystem.Folder>> packageMap = | 380 Map<String, List<file_system.Folder>> packageMap = | 
| 381 packageMapInfo.packageMap; | 381 packageMapInfo.packageMap; | 
| 382 | 382 | 
| 383 // Only create a packageUriResolver if pub list-package-dirs succeeded. | 383 // Only create a packageUriResolver if pub list-package-dirs succeeded. | 
| 384 // If it failed, that's not a problem; it simply means we have no way | 384 // If it failed, that's not a problem; it simply means we have no way | 
| 385 // to resolve packages. | 385 // to resolve packages. | 
| 386 if (packageMapInfo.packageMap != null) { | 386 if (packageMapInfo.packageMap != null) { | 
| 387 packageUriResolver = new PackageMapUriResolver( | 387 packageUriResolver = new PackageMapUriResolver( | 
| 388 PhysicalResourceProvider.INSTANCE, packageMap); | 388 PhysicalResourceProvider.INSTANCE, packageMap); | 
| 389 } | 389 } | 
| 390 } | 390 } | 
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 485 _chooseDietParsingPolicy(options); | 485 _chooseDietParsingPolicy(options); | 
| 486 setAnalysisContextOptions(_context, options, | 486 setAnalysisContextOptions(_context, options, | 
| 487 (AnalysisOptionsImpl contextOptions) { | 487 (AnalysisOptionsImpl contextOptions) { | 
| 488 contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; | 488 contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; | 
| 489 }); | 489 }); | 
| 490 | 490 | 
| 491 // Find package info. | 491 // Find package info. | 
| 492 _PackageInfo packageInfo = _findPackages(options); | 492 _PackageInfo packageInfo = _findPackages(options); | 
| 493 | 493 | 
| 494 // Process embedders. | 494 // Process embedders. | 
| 495 Map<fileSystem.Folder, YamlMap> embedderMap = | 495 Map<file_system.Folder, YamlMap> embedderMap = | 
| 496 _findEmbedders(packageInfo.packageMap); | 496 _findEmbedders(packageInfo.packageMap); | 
| 497 | 497 | 
| 498 // Scan for SDK extenders. | 498 // Scan for SDK extenders. | 
| 499 bool hasSdkExt = _hasSdkExt(packageInfo.packageMap?.values); | 499 bool hasSdkExt = _hasSdkExt(packageInfo.packageMap?.values); | 
| 500 | 500 | 
| 501 // No summaries in the presence of embedders or extenders. | 501 // No summaries in the presence of embedders or extenders. | 
| 502 bool useSummaries = embedderMap.isEmpty && !hasSdkExt; | 502 bool useSummaries = embedderMap.isEmpty && !hasSdkExt; | 
| 503 | 503 | 
| 504 // Once options and embedders are processed, setup the SDK. | 504 // Once options and embedders are processed, setup the SDK. | 
| 505 _setupSdk(options, useSummaries); | 505 _setupSdk(options, useSummaries); | 
| 506 | 506 | 
| 507 // Choose a package resolution policy and a diet parsing policy based on | 507 // Choose a package resolution policy and a diet parsing policy based on | 
| 508 // the command-line options. | 508 // the command-line options. | 
| 509 SourceFactory sourceFactory = | 509 SourceFactory sourceFactory = | 
| 510 _chooseUriResolutionPolicy(options, embedderMap, packageInfo); | 510 _chooseUriResolutionPolicy(options, embedderMap, packageInfo); | 
| 511 | 511 | 
| 512 _context.sourceFactory = sourceFactory; | 512 _context.sourceFactory = sourceFactory; | 
| 513 } | 513 } | 
| 514 | 514 | 
| 515 /// Return discovered packagespec, or `null` if none is found. | 515 /// Return discovered packagespec, or `null` if none is found. | 
| 516 Packages _discoverPackagespec(Uri root) { | 516 Packages _discoverPackagespec(Uri root) { | 
| 517 try { | 517 try { | 
| 518 Packages packages = pkgDiscovery.findPackagesFromFile(root); | 518 Packages packages = pkg_discovery.findPackagesFromFile(root); | 
| 519 if (packages != Packages.noPackages) { | 519 if (packages != Packages.noPackages) { | 
| 520 return packages; | 520 return packages; | 
| 521 } | 521 } | 
| 522 } catch (_) { | 522 } catch (_) { | 
| 523 // Ignore and fall through to null. | 523 // Ignore and fall through to null. | 
| 524 } | 524 } | 
| 525 | 525 | 
| 526 return null; | 526 return null; | 
| 527 } | 527 } | 
| 528 | 528 | 
| 529 Map<fileSystem.Folder, YamlMap> _findEmbedders( | 529 Map<file_system.Folder, YamlMap> _findEmbedders( | 
| 530 Map<String, List<fileSystem.Folder>> packageMap) { | 530 Map<String, List<file_system.Folder>> packageMap) { | 
| 531 EmbedderYamlLocator locator = | 531 EmbedderYamlLocator locator = | 
| 532 (_context as InternalAnalysisContext).embedderYamlLocator; | 532 (_context as InternalAnalysisContext).embedderYamlLocator; | 
| 533 locator.refresh(packageMap); | 533 locator.refresh(packageMap); | 
| 534 return locator.embedderYamls; | 534 return locator.embedderYamls; | 
| 535 } | 535 } | 
| 536 | 536 | 
| 537 _PackageInfo _findPackages(CommandLineOptions options) { | 537 _PackageInfo _findPackages(CommandLineOptions options) { | 
| 538 if (packageResolverProvider != null) { | 538 if (packageResolverProvider != null) { | 
| 539 // The resolver provider will do all the work later. | 539 // The resolver provider will do all the work later. | 
| 540 return null; | 540 return null; | 
| 541 } | 541 } | 
| 542 | 542 | 
| 543 Packages packages; | 543 Packages packages; | 
| 544 Map<String, List<fileSystem.Folder>> packageMap; | 544 Map<String, List<file_system.Folder>> packageMap; | 
| 545 | 545 | 
| 546 if (options.packageConfigPath != null) { | 546 if (options.packageConfigPath != null) { | 
| 547 String packageConfigPath = options.packageConfigPath; | 547 String packageConfigPath = options.packageConfigPath; | 
| 548 Uri fileUri = new Uri.file(packageConfigPath); | 548 Uri fileUri = new Uri.file(packageConfigPath); | 
| 549 try { | 549 try { | 
| 550 File configFile = new File.fromUri(fileUri).absolute; | 550 File configFile = new File.fromUri(fileUri).absolute; | 
| 551 List<int> bytes = configFile.readAsBytesSync(); | 551 List<int> bytes = configFile.readAsBytesSync(); | 
| 552 Map<String, Uri> map = pkgfile.parse(bytes, configFile.uri); | 552 Map<String, Uri> map = pkgfile.parse(bytes, configFile.uri); | 
| 553 packages = new MapPackages(map); | 553 packages = new MapPackages(map); | 
| 554 packageMap = _getPackageMap(packages); | 554 packageMap = _getPackageMap(packages); | 
| 555 } catch (e) { | 555 } catch (e) { | 
| 556 printAndFail( | 556 printAndFail( | 
| 557 'Unable to read package config data from $packageConfigPath: $e'); | 557 'Unable to read package config data from $packageConfigPath: $e'); | 
| 558 } | 558 } | 
| 559 } else if (options.packageRootPath != null) { | 559 } else if (options.packageRootPath != null) { | 
| 560 packageMap = _PackageRootPackageMapBuilder | 560 packageMap = _PackageRootPackageMapBuilder | 
| 561 .buildPackageMap(options.packageRootPath); | 561 .buildPackageMap(options.packageRootPath); | 
| 562 } else { | 562 } else { | 
| 563 fileSystem.Resource cwd = | 563 file_system.Resource cwd = | 
| 564 PhysicalResourceProvider.INSTANCE.getResource('.'); | 564 PhysicalResourceProvider.INSTANCE.getResource('.'); | 
| 565 // Look for .packages. | 565 // Look for .packages. | 
| 566 packages = _discoverPackagespec(new Uri.directory(cwd.path)); | 566 packages = _discoverPackagespec(new Uri.directory(cwd.path)); | 
| 567 packageMap = _getPackageMap(packages); | 567 packageMap = _getPackageMap(packages); | 
| 568 } | 568 } | 
| 569 | 569 | 
| 570 return new _PackageInfo(packages, packageMap); | 570 return new _PackageInfo(packages, packageMap); | 
| 571 } | 571 } | 
| 572 | 572 | 
| 573 Map<String, List<fileSystem.Folder>> _getPackageMap(Packages packages) { | 573 Map<String, List<file_system.Folder>> _getPackageMap(Packages packages) { | 
| 574 if (packages == null) { | 574 if (packages == null) { | 
| 575 return null; | 575 return null; | 
| 576 } | 576 } | 
| 577 | 577 | 
| 578 Map<String, List<fileSystem.Folder>> folderMap = | 578 Map<String, List<file_system.Folder>> folderMap = | 
| 579 new Map<String, List<fileSystem.Folder>>(); | 579 new Map<String, List<file_system.Folder>>(); | 
| 580 packages.asMap().forEach((String packagePath, Uri uri) { | 580 packages.asMap().forEach((String packagePath, Uri uri) { | 
| 581 folderMap[packagePath] = [ | 581 folderMap[packagePath] = [ | 
| 582 PhysicalResourceProvider.INSTANCE.getFolder(path.fromUri(uri)) | 582 PhysicalResourceProvider.INSTANCE.getFolder(path.fromUri(uri)) | 
| 583 ]; | 583 ]; | 
| 584 }); | 584 }); | 
| 585 return folderMap; | 585 return folderMap; | 
| 586 } | 586 } | 
| 587 | 587 | 
| 588 bool _hasSdkExt(Iterable<List<fileSystem.Folder>> folders) { | 588 bool _hasSdkExt(Iterable<List<file_system.Folder>> folders) { | 
| 589 if (folders != null) { | 589 if (folders != null) { | 
| 590 //TODO: ideally share this traversal with SdkExtUriResolver | 590 //TODO: ideally share this traversal with SdkExtUriResolver | 
| 591 for (Iterable<fileSystem.Folder> libDirs in folders) { | 591 for (Iterable<file_system.Folder> libDirs in folders) { | 
| 592 if (libDirs.any((fileSystem.Folder libDir) => | 592 if (libDirs.any((file_system.Folder libDir) => | 
| 593 libDir.getChild(SdkExtUriResolver.SDK_EXT_NAME).exists)) { | 593 libDir.getChild(SdkExtUriResolver.SDK_EXT_NAME).exists)) { | 
| 594 return true; | 594 return true; | 
| 595 } | 595 } | 
| 596 } | 596 } | 
| 597 } | 597 } | 
| 598 return false; | 598 return false; | 
| 599 } | 599 } | 
| 600 | 600 | 
| 601 /// Returns `true` if this relative path is a hidden directory. | 601 /// Returns `true` if this relative path is a hidden directory. | 
| 602 bool _isInHiddenDir(String relative) => | 602 bool _isInHiddenDir(String relative) => | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 662 contextOptions.lint = options.lints; | 662 contextOptions.lint = options.lints; | 
| 663 contextOptions.strongMode = options.strongMode; | 663 contextOptions.strongMode = options.strongMode; | 
| 664 return contextOptions; | 664 return contextOptions; | 
| 665 } | 665 } | 
| 666 | 666 | 
| 667 static void setAnalysisContextOptions( | 667 static void setAnalysisContextOptions( | 
| 668 AnalysisContext context, | 668 AnalysisContext context, | 
| 669 CommandLineOptions options, | 669 CommandLineOptions options, | 
| 670 void configureContextOptions(AnalysisOptionsImpl contextOptions)) { | 670 void configureContextOptions(AnalysisOptionsImpl contextOptions)) { | 
| 671 Map<String, String> definedVariables = options.definedVariables; | 671 Map<String, String> definedVariables = options.definedVariables; | 
| 672 if (!definedVariables.isEmpty) { | 672 if (definedVariables.isNotEmpty) { | 
| 673 DeclaredVariables declaredVariables = context.declaredVariables; | 673 DeclaredVariables declaredVariables = context.declaredVariables; | 
| 674 definedVariables.forEach((String variableName, String value) { | 674 definedVariables.forEach((String variableName, String value) { | 
| 675 declaredVariables.define(variableName, value); | 675 declaredVariables.define(variableName, value); | 
| 676 }); | 676 }); | 
| 677 } | 677 } | 
| 678 | 678 | 
| 679 if (options.log) { | 679 if (options.log) { | 
| 680 AnalysisEngine.instance.logger = new StdLogger(); | 680 AnalysisEngine.instance.logger = new StdLogger(); | 
| 681 } | 681 } | 
| 682 | 682 | 
| (...skipping 15 matching lines...) Expand all Loading... | |
| 698 return false; | 698 return false; | 
| 699 } | 699 } | 
| 700 for (String key in m1.keys) { | 700 for (String key in m1.keys) { | 
| 701 if (!m2.containsKey(key) || m1[key] != m2[key]) { | 701 if (!m2.containsKey(key) || m1[key] != m2[key]) { | 
| 702 return false; | 702 return false; | 
| 703 } | 703 } | 
| 704 } | 704 } | 
| 705 return true; | 705 return true; | 
| 706 } | 706 } | 
| 707 | 707 | 
| 708 static fileSystem.File _getOptionsFile(CommandLineOptions options) { | 708 static file_system.File _getOptionsFile(CommandLineOptions options) { | 
| 709 fileSystem.File file; | 709 file_system.File file; | 
| 710 String filePath = options.analysisOptionsFile; | 710 String filePath = options.analysisOptionsFile; | 
| 711 if (filePath != null) { | 711 if (filePath != null) { | 
| 712 file = PhysicalResourceProvider.INSTANCE.getFile(filePath); | 712 file = PhysicalResourceProvider.INSTANCE.getFile(filePath); | 
| 713 if (!file.exists) { | 713 if (!file.exists) { | 
| 714 printAndFail('Options file not found: $filePath', | 714 printAndFail('Options file not found: $filePath', | 
| 715 exitCode: ErrorSeverity.ERROR.ordinal); | 715 exitCode: ErrorSeverity.ERROR.ordinal); | 
| 716 } | 716 } | 
| 717 } else { | 717 } else { | 
| 718 filePath = AnalysisEngine.ANALYSIS_OPTIONS_FILE; | 718 filePath = AnalysisEngine.ANALYSIS_OPTIONS_FILE; | 
| 719 file = PhysicalResourceProvider.INSTANCE.getFile(filePath); | 719 file = PhysicalResourceProvider.INSTANCE.getFile(filePath); | 
| 720 if (!file.exists) { | 720 if (!file.exists) { | 
| 721 filePath = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE; | 721 filePath = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE; | 
| 722 file = PhysicalResourceProvider.INSTANCE.getFile(filePath); | 722 file = PhysicalResourceProvider.INSTANCE.getFile(filePath); | 
| 723 } | 723 } | 
| 724 } | 724 } | 
| 725 return file; | 725 return file; | 
| 726 } | 726 } | 
| 727 | 727 | 
| 728 /// Convert [sourcePath] into an absolute path. | 728 /// Convert [sourcePath] into an absolute path. | 
| 729 static String _normalizeSourcePath(String sourcePath) => | 729 static String _normalizeSourcePath(String sourcePath) => | 
| 730 path.normalize(new File(sourcePath).absolute.path); | 730 path.normalize(new File(sourcePath).absolute.path); | 
| 731 | 731 | 
| 732 static void _processAnalysisOptions( | 732 static void _processAnalysisOptions( | 
| 733 AnalysisContext context, CommandLineOptions options) { | 733 AnalysisContext context, CommandLineOptions options) { | 
| 734 fileSystem.File file = _getOptionsFile(options); | 734 file_system.File file = _getOptionsFile(options); | 
| 735 List<OptionsProcessor> optionsProcessors = | 735 List<OptionsProcessor> optionsProcessors = | 
| 736 AnalysisEngine.instance.optionsPlugin.optionsProcessors; | 736 AnalysisEngine.instance.optionsPlugin.optionsProcessors; | 
| 737 try { | 737 try { | 
| 738 AnalysisOptionsProvider analysisOptionsProvider = | 738 AnalysisOptionsProvider analysisOptionsProvider = | 
| 739 new AnalysisOptionsProvider(); | 739 new AnalysisOptionsProvider(); | 
| 740 Map<String, YamlNode> optionMap = | 740 Map<String, YamlNode> optionMap = | 
| 741 analysisOptionsProvider.getOptionsFromFile(file); | 741 analysisOptionsProvider.getOptionsFromFile(file); | 
| 742 optionsProcessors.forEach( | 742 optionsProcessors.forEach( | 
| 743 (OptionsProcessor p) => p.optionsProcessed(context, optionMap)); | 743 (OptionsProcessor p) => p.optionsProcessed(context, optionMap)); | 
| 744 | 744 | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 816 } | 816 } | 
| 817 } | 817 } | 
| 818 | 818 | 
| 819 class _DriverError implements Exception { | 819 class _DriverError implements Exception { | 
| 820 String msg; | 820 String msg; | 
| 821 _DriverError(this.msg); | 821 _DriverError(this.msg); | 
| 822 } | 822 } | 
| 823 | 823 | 
| 824 class _PackageInfo { | 824 class _PackageInfo { | 
| 825 Packages packages; | 825 Packages packages; | 
| 826 Map<String, List<fileSystem.Folder>> packageMap; | 826 Map<String, List<file_system.Folder>> packageMap; | 
| 827 _PackageInfo(this.packages, this.packageMap); | 827 _PackageInfo(this.packages, this.packageMap); | 
| 828 } | 828 } | 
| 829 | 829 | 
| 830 /// [SdkExtUriResolver] needs a Map from package name to folder. In the case | 830 /// [SdkExtUriResolver] needs a Map from package name to folder. In the case | 
| 831 /// that the analyzer is invoked with a --package-root option, we need to | 831 /// that the analyzer is invoked with a --package-root option, we need to | 
| 832 /// manually create this mapping. Given [packageRootPath], | 832 /// manually create this mapping. Given [packageRootPath], | 
| 833 /// [_PackageRootPackageMapBuilder] creates a simple mapping from package name | 833 /// [_PackageRootPackageMapBuilder] creates a simple mapping from package name | 
| 834 /// to full path on disk (resolving any symbolic links). | 834 /// to full path on disk (resolving any symbolic links). | 
| 835 class _PackageRootPackageMapBuilder { | 835 class _PackageRootPackageMapBuilder { | 
| 836 static Map<String, List<fileSystem.Folder>> buildPackageMap( | 836 static Map<String, List<file_system.Folder>> buildPackageMap( | 
| 837 String packageRootPath) { | 837 String packageRootPath) { | 
| 838 var packageRoot = new Directory(packageRootPath); | 838 var packageRoot = new Directory(packageRootPath); | 
| 839 if (!packageRoot.existsSync()) { | 839 if (!packageRoot.existsSync()) { | 
| 840 throw new _DriverError( | 840 throw new _DriverError( | 
| 841 'Package root directory ($packageRootPath) does not exist.'); | 841 'Package root directory ($packageRootPath) does not exist.'); | 
| 842 } | 842 } | 
| 843 var packages = packageRoot.listSync(followLinks: false); | 843 var packages = packageRoot.listSync(followLinks: false); | 
| 844 var result = new Map<String, List<fileSystem.Folder>>(); | 844 var result = new Map<String, List<file_system.Folder>>(); | 
| 845 for (var package in packages) { | 845 for (var package in packages) { | 
| 846 var packageName = path.basename(package.path); | 846 var packageName = path.basename(package.path); | 
| 847 var realPath = package.resolveSymbolicLinksSync(); | 847 var realPath = package.resolveSymbolicLinksSync(); | 
| 848 result[packageName] = [ | 848 result[packageName] = [ | 
| 849 PhysicalResourceProvider.INSTANCE.getFolder(realPath) | 849 PhysicalResourceProvider.INSTANCE.getFolder(realPath) | 
| 850 ]; | 850 ]; | 
| 851 } | 851 } | 
| 852 return result; | 852 return result; | 
| 853 } | 853 } | 
| 854 } | 854 } | 
| OLD | NEW |