Index: pkg/analyzer_cli/lib/src/driver.dart |
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart |
index 3de4b4d12cb155e67deed6e9b18aa9e5550bc1e0..85c53ee2809121a4d3158aeadb80021ced4dfb00 100644 |
--- a/pkg/analyzer_cli/lib/src/driver.dart |
+++ b/pkg/analyzer_cli/lib/src/driver.dart |
@@ -34,6 +34,7 @@ import 'package:analyzer/src/services/lint.dart'; |
import 'package:analyzer/src/task/options.dart'; |
import 'package:analyzer_cli/src/analyzer_impl.dart'; |
import 'package:analyzer_cli/src/options.dart'; |
+import 'package:analyzer_cli/src/package_analyzer.dart'; |
import 'package:analyzer_cli/src/perf_report.dart'; |
import 'package:analyzer_cli/starter.dart'; |
import 'package:linter/src/plugin/linter_plugin.dart'; |
@@ -113,7 +114,13 @@ class Driver implements CommandLineStarter { |
_setupEnv(options); |
// Do analysis. |
- if (_isBatch) { |
+ if (options.packageMode) { |
+ ErrorSeverity severity = _analyzePackage(options); |
+ // In case of error propagate exit code. |
+ if (severity == ErrorSeverity.ERROR) { |
+ exitCode = severity.ordinal; |
+ } |
+ } else if (_isBatch) { |
_BatchRunner.runAsBatch(args, (List<String> args) { |
CommandLineOptions options = CommandLineOptions.parse(args); |
return _analyzeAll(options); |
@@ -215,6 +222,13 @@ class Driver implements CommandLineStarter { |
return allResult; |
} |
+ /// Perform package analysis according to the given [options]. |
+ ErrorSeverity _analyzePackage(CommandLineOptions options) { |
+ return _analyzeAllTag.makeCurrentWhile(() { |
+ return new PackageAnalyzer(options).analyze(); |
+ }); |
+ } |
+ |
/// Determine whether the context created during a previous call to |
/// [_analyzeAll] can be re-used in order to analyze using [options]. |
bool _canContextBeReused(CommandLineOptions options) { |
@@ -461,6 +475,7 @@ class Driver implements CommandLineStarter { |
// Create a context. |
AnalysisContext context = AnalysisEngine.instance.createAnalysisContext(); |
+ _context = context; |
// Choose a package resolution policy and a diet parsing policy based on |
// the command-line options. |
@@ -471,34 +486,10 @@ class Driver implements CommandLineStarter { |
context.sourceFactory = sourceFactory; |
- Map<String, String> definedVariables = options.definedVariables; |
- if (!definedVariables.isEmpty) { |
- DeclaredVariables declaredVariables = context.declaredVariables; |
- definedVariables.forEach((String variableName, String value) { |
- declaredVariables.define(variableName, value); |
- }); |
- } |
- |
- if (options.log) { |
- AnalysisEngine.instance.logger = new StdLogger(); |
- } |
- |
- // Set context options. |
- AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl(); |
- contextOptions.hint = !options.disableHints; |
- contextOptions.enableStrictCallChecks = options.enableStrictCallChecks; |
- contextOptions.enableSuperMixins = options.enableSuperMixins; |
- contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; |
- contextOptions.generateImplicitErrors = options.showPackageWarnings; |
- contextOptions.generateSdkErrors = options.showSdkWarnings; |
- contextOptions.lint = options.lints; |
- contextOptions.strongMode = options.strongMode; |
- context.analysisOptions = contextOptions; |
- sourceFactory.dartSdk.context.analysisOptions = contextOptions; |
- _context = context; |
- |
- // Process analysis options file (and notify all interested parties). |
- _processAnalysisOptions(options, context); |
+ setAnalysisContextOptions(_context, options, |
+ (AnalysisOptionsImpl contextOptions) { |
+ contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; |
+ }); |
} |
/// Return discovered packagespec, or `null` if none is found. |
@@ -515,22 +506,6 @@ class Driver implements CommandLineStarter { |
return null; |
} |
- fileSystem.File _getOptionsFile(CommandLineOptions options) { |
- fileSystem.File file; |
- String filePath = options.analysisOptionsFile; |
- if (filePath != null) { |
- file = PhysicalResourceProvider.INSTANCE.getFile(filePath); |
- if (!file.exists) { |
- printAndFail('Options file not found: $filePath', |
- exitCode: ErrorSeverity.ERROR.ordinal); |
- } |
- } else { |
- filePath = AnalysisEngine.ANALYSIS_OPTIONS_FILE; |
- file = PhysicalResourceProvider.INSTANCE.getFile(filePath); |
- } |
- return file; |
- } |
- |
Map<String, List<fileSystem.Folder>> _getPackageMap(Packages packages) { |
if (packages == null) { |
return null; |
@@ -546,34 +521,6 @@ class Driver implements CommandLineStarter { |
return folderMap; |
} |
- void _processAnalysisOptions( |
- CommandLineOptions options, AnalysisContext context) { |
- fileSystem.File file = _getOptionsFile(options); |
- List<OptionsProcessor> optionsProcessors = |
- AnalysisEngine.instance.optionsPlugin.optionsProcessors; |
- try { |
- AnalysisOptionsProvider analysisOptionsProvider = |
- new AnalysisOptionsProvider(); |
- Map<String, YamlNode> optionMap = |
- analysisOptionsProvider.getOptionsFromFile(file); |
- optionsProcessors.forEach( |
- (OptionsProcessor p) => p.optionsProcessed(context, optionMap)); |
- |
- // Fill in lint rule defaults in case lints are enabled and rules are |
- // not specified in an options file. |
- if (options.lints && !containsLintRuleEntry(optionMap)) { |
- setLints(context, linterPlugin.contributedRules); |
- } |
- |
- // Ask engine to further process options. |
- if (optionMap != null) { |
- configureContextOptions(context, optionMap); |
- } |
- } on Exception catch (e) { |
- optionsProcessors.forEach((OptionsProcessor p) => p.onError(e)); |
- } |
- } |
- |
void _processPlugins() { |
List<Plugin> plugins = <Plugin>[]; |
plugins.addAll(AnalysisEngine.instance.requiredPlugins); |
@@ -611,6 +558,41 @@ class Driver implements CommandLineStarter { |
_isBatch = options.shouldBatch; |
} |
+ static void setAnalysisContextOptions( |
+ AnalysisContext context, |
+ CommandLineOptions options, |
+ void configureContextOptions(AnalysisOptionsImpl contextOptions)) { |
+ Map<String, String> definedVariables = options.definedVariables; |
+ if (!definedVariables.isEmpty) { |
+ DeclaredVariables declaredVariables = context.declaredVariables; |
+ definedVariables.forEach((String variableName, String value) { |
+ declaredVariables.define(variableName, value); |
+ }); |
+ } |
+ |
+ if (options.log) { |
+ AnalysisEngine.instance.logger = new StdLogger(); |
+ } |
+ |
+ // Prepare context options. |
+ AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl(); |
+ contextOptions.hint = !options.disableHints; |
+ contextOptions.enableStrictCallChecks = options.enableStrictCallChecks; |
+ contextOptions.enableSuperMixins = options.enableSuperMixins; |
+ contextOptions.generateImplicitErrors = options.showPackageWarnings; |
+ contextOptions.generateSdkErrors = options.showSdkWarnings; |
+ contextOptions.lint = options.lints; |
+ contextOptions.strongMode = options.strongMode; |
+ configureContextOptions(contextOptions); |
+ |
+ // Set context options. |
+ context.analysisOptions = contextOptions; |
+ context.sourceFactory.dartSdk.context.analysisOptions = contextOptions; |
+ |
+ // Process analysis options file (and notify all interested parties). |
+ _processAnalysisOptions(context, options); |
+ } |
+ |
/// Perform a deep comparison of two string maps. |
static bool _equalMaps(Map<String, String> m1, Map<String, String> m2) { |
if (m1.length != m2.length) { |
@@ -624,9 +606,53 @@ class Driver implements CommandLineStarter { |
return true; |
} |
+ static fileSystem.File _getOptionsFile(CommandLineOptions options) { |
+ fileSystem.File file; |
+ String filePath = options.analysisOptionsFile; |
+ if (filePath != null) { |
+ file = PhysicalResourceProvider.INSTANCE.getFile(filePath); |
+ if (!file.exists) { |
+ printAndFail('Options file not found: $filePath', |
+ exitCode: ErrorSeverity.ERROR.ordinal); |
+ } |
+ } else { |
+ filePath = AnalysisEngine.ANALYSIS_OPTIONS_FILE; |
+ file = PhysicalResourceProvider.INSTANCE.getFile(filePath); |
+ } |
+ return file; |
+ } |
+ |
/// Convert [sourcePath] into an absolute path. |
static String _normalizeSourcePath(String sourcePath) => |
path.normalize(new File(sourcePath).absolute.path); |
+ |
+ static void _processAnalysisOptions( |
+ AnalysisContext context, CommandLineOptions options) { |
+ fileSystem.File file = _getOptionsFile(options); |
+ List<OptionsProcessor> optionsProcessors = |
+ AnalysisEngine.instance.optionsPlugin.optionsProcessors; |
+ try { |
+ AnalysisOptionsProvider analysisOptionsProvider = |
+ new AnalysisOptionsProvider(); |
+ Map<String, YamlNode> optionMap = |
+ analysisOptionsProvider.getOptionsFromFile(file); |
+ optionsProcessors.forEach( |
+ (OptionsProcessor p) => p.optionsProcessed(context, optionMap)); |
+ |
+ // Fill in lint rule defaults in case lints are enabled and rules are |
+ // not specified in an options file. |
+ if (options.lints && !containsLintRuleEntry(optionMap)) { |
+ setLints(context, linterPlugin.contributedRules); |
+ } |
+ |
+ // Ask engine to further process options. |
+ if (optionMap != null) { |
+ configureContextOptions(context, optionMap); |
+ } |
+ } on Exception catch (e) { |
+ optionsProcessors.forEach((OptionsProcessor p) => p.onError(e)); |
+ } |
+ } |
} |
/// Provides a framework to read command line options from stdin and feed them |