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 bca565b631bce03d862c928c9ff38f37d02edd00..eb1df03926c0f9552ab2a11ea80a0d64f631708a 100644 |
--- a/pkg/analyzer_cli/lib/src/driver.dart |
+++ b/pkg/analyzer_cli/lib/src/driver.dart |
@@ -80,6 +80,9 @@ class Driver implements CommandLineStarter { |
/// `null` if [_analyzeAll] hasn't been called yet. |
AnalysisContext _context; |
+ /// The total number of source files loaded by an AnalysisContext. |
+ int _analyzedFileCount = 0; |
+ |
/// If [_context] is not `null`, the [CommandLineOptions] that guided its |
/// creation. |
CommandLineOptions _previousOptions; |
@@ -105,6 +108,9 @@ class Driver implements CommandLineStarter { |
@override |
void start(List<String> args) { |
+ if (_context != null) { |
+ throw new StateError("start() can only be called once"); |
+ } |
int startTime = new DateTime.now().millisecondsSinceEpoch; |
StringUtilities.INTERNER = new MappedInterner(); |
@@ -137,8 +143,13 @@ class Driver implements CommandLineStarter { |
} |
} |
+ if (_context != null) { |
+ _analyzedFileCount += _context.sources.length; |
+ } |
+ |
if (options.perfReport != null) { |
- String json = makePerfReport(startTime, currentTimeMillis(), options); |
+ String json = makePerfReport( |
+ startTime, currentTimeMillis(), options, _analyzedFileCount, stats); |
new File(options.perfReport).writeAsStringSync(json); |
} |
} |
@@ -267,6 +278,10 @@ class Driver implements CommandLineStarter { |
if (options.showPackageWarnings != _previousOptions.showPackageWarnings) { |
return false; |
} |
+ if (options.showPackageWarningsPrefix != |
+ _previousOptions.showPackageWarningsPrefix) { |
+ return false; |
+ } |
if (options.showSdkWarnings != _previousOptions.showSdkWarnings) { |
return false; |
} |
@@ -300,38 +315,14 @@ class Driver implements CommandLineStarter { |
return (Source source) => true; |
} |
- // Determine the set of packages requiring a full parse. Use null to |
- // represent the case where all packages require a full parse. |
- Set<String> packagesRequiringFullParse; |
- if (options.showPackageWarnings) { |
- // We are showing warnings from all packages so all packages require a |
- // full parse. |
- packagesRequiringFullParse = null; |
- } else { |
- // We aren't showing warnings for dependent packages, but we may still |
- // need to show warnings for "self" packages, so we need to do a full |
- // parse in any package containing files mentioned on the command line. |
- // TODO(paulberry): implement this. As a temporary workaround, we're |
- // fully parsing all packages. |
- packagesRequiringFullParse = null; |
- } |
return (Source source) { |
if (options.sourceFiles.contains(source.fullName)) { |
return true; |
} else if (source.uri.scheme == 'dart') { |
return options.showSdkWarnings; |
- } else if (source.uri.scheme == 'package') { |
- if (packagesRequiringFullParse == null) { |
- return true; |
- } else if (source.uri.pathSegments.length == 0) { |
- // We should never see a URI like this, but fully parse it to be |
- // safe. |
- return true; |
- } else { |
- return packagesRequiringFullParse |
- .contains(source.uri.pathSegments[0]); |
- } |
} else { |
+ // TODO(paulberry): diet parse 'package:' imports when we don't want |
+ // diagnostics. (Full parse is still needed for "self" packages.) |
return true; |
} |
}; |
@@ -508,18 +499,22 @@ class Driver implements CommandLineStarter { |
} |
_previousOptions = options; |
+ // Save stats from previous context before clobbering it. |
+ if (_context != null) { |
+ _analyzedFileCount += _context.sources.length; |
+ } |
+ |
// Create a context. |
- AnalysisContext context = AnalysisEngine.instance.createAnalysisContext(); |
- _context = context; |
+ _context = AnalysisEngine.instance.createAnalysisContext(); |
// Choose a package resolution policy and a diet parsing policy based on |
// the command-line options. |
SourceFactory sourceFactory = _chooseUriResolutionPolicy( |
- options, (context as InternalAnalysisContext).embedderYamlLocator); |
+ options, (_context as InternalAnalysisContext).embedderYamlLocator); |
AnalyzeFunctionBodiesPredicate dietParsingPolicy = |
_chooseDietParsingPolicy(options); |
- context.sourceFactory = sourceFactory; |
+ _context.sourceFactory = sourceFactory; |
setAnalysisContextOptions(_context, options, |
(AnalysisOptionsImpl contextOptions) { |