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 e6e3ad7197df7846220bbfdb77f1013a3f0f4b0c..cfd3b49d5bf0807103b8beccf3e09d99937afc54 100644 |
--- a/pkg/analyzer_cli/lib/src/driver.dart |
+++ b/pkg/analyzer_cli/lib/src/driver.dart |
@@ -38,12 +38,6 @@ import 'package:analyzer/src/summary/idl.dart'; |
import 'package:analyzer/src/summary/package_bundle_reader.dart'; |
import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; |
import 'package:analyzer/src/task/options.dart'; |
-import 'package:analyzer_cli/src/analyzer_impl.dart'; |
-import 'package:analyzer_cli/src/build_mode.dart'; |
-import 'package:analyzer_cli/src/error_formatter.dart'; |
-import 'package:analyzer_cli/src/options.dart'; |
-import 'package:analyzer_cli/src/perf_report.dart'; |
-import 'package:analyzer_cli/starter.dart'; |
import 'package:linter/src/rules.dart' as linter; |
import 'package:package_config/discovery.dart' as pkg_discovery; |
import 'package:package_config/packages.dart' show Packages; |
@@ -54,6 +48,13 @@ import 'package:plugin/manager.dart'; |
import 'package:plugin/plugin.dart'; |
import 'package:yaml/yaml.dart'; |
+import '../starter.dart' show CommandLineStarter; |
+import 'analyzer_impl.dart'; |
+import 'build_mode.dart'; |
+import 'error_formatter.dart'; |
+import 'options.dart'; |
+import 'perf_report.dart'; |
+ |
/// Shared IO sink for standard error reporting. |
/// |
/// *Visible for testing.* |
@@ -159,7 +160,7 @@ class Driver implements CommandLineStarter { |
if (options.perfReport != null) { |
String json = makePerfReport( |
- startTime, currentTimeMillis(), options, _analyzedFileCount, stats); |
+ startTime, currentTimeMillis, options, _analyzedFileCount, stats); |
new io.File(options.perfReport).writeAsStringSync(json); |
} |
} |
@@ -176,7 +177,17 @@ class Driver implements CommandLineStarter { |
/// Perform analysis according to the given [options]. |
Future<ErrorSeverity> _analyzeAllImpl(CommandLineOptions options) async { |
if (!options.machineFormat) { |
- outSink.writeln("Analyzing ${options.sourceFiles}..."); |
+ List<String> fileNames = options.sourceFiles.map((String file) { |
+ file = path.normalize(file); |
+ if (file == '.') { |
+ file = path.basename(path.current); |
+ } else if (file == '..') { |
+ file = path.basename(path.normalize(path.absolute(file))); |
+ } |
+ return file; |
+ }).toList(); |
+ |
+ outSink.writeln("Analyzing ${fileNames.join(', ')}..."); |
} |
// Create a context, or re-use the previous one. |
@@ -187,11 +198,11 @@ class Driver implements CommandLineStarter { |
return ErrorSeverity.ERROR; |
} |
- // Add all the files to be analyzed en masse to the context. Skip any |
+ // Add all the files to be analyzed en masse to the context. Skip any |
// files that were added earlier (whether explicitly or implicitly) to |
// avoid causing those files to be unnecessarily re-read. |
Set<Source> knownSources = context.sources.toSet(); |
- List<Source> sourcesToAnalyze = <Source>[]; |
+ Set<Source> sourcesToAnalyze = new Set<Source>(); |
ChangeSet changeSet = new ChangeSet(); |
for (String sourcePath in options.sourceFiles) { |
sourcePath = sourcePath.trim(); |
@@ -215,49 +226,50 @@ class Driver implements CommandLineStarter { |
sourcesToAnalyze.add(source); |
} |
- if (analysisDriver != null) { |
- files.forEach((file) { |
- analysisDriver.addFile(file.path); |
- }); |
- } else { |
- context.applyChanges(changeSet); |
- } |
+ files.forEach((file) { |
Brian Wilkerson
2017/02/19 22:52:17
It looks like this CL is also removing the non-dri
devoncarew
2017/02/21 04:30:47
No - it's unintentional. I had a fair amount of ch
|
+ analysisDriver.addFile(file.path); |
+ }); |
} |
// Analyze the libraries. |
ErrorSeverity allResult = ErrorSeverity.NONE; |
- var libUris = <Uri>[]; |
- var parts = <Source>[]; |
+ List<Uri> libUris = <Uri>[]; |
+ Set<Source> partSources = new Set<Source>(); |
+ |
for (Source source in sourcesToAnalyze) { |
SourceKind sourceKind = analysisDriver != null |
? await analysisDriver.getSourceKind(source.fullName) |
: context.computeKindOf(source); |
if (sourceKind == SourceKind.PART) { |
- parts.add(source); |
+ partSources.add(source); |
continue; |
} |
+ // TODO(devoncarew): Analyzing each source individually causes errors to |
+ // be reported multiple times (#25697). |
ErrorSeverity status = await _runAnalyzer(source, options); |
allResult = allResult.max(status); |
libUris.add(source.uri); |
} |
// Check that each part has a corresponding source in the input list. |
- for (Source part in parts) { |
+ for (Source partSource in partSources) { |
bool found = false; |
if (analysisDriver != null) { |
- var partFile = analysisDriver.fsState.getFileForPath(part.fullName); |
+ var partFile = |
+ analysisDriver.fsState.getFileForPath(partSource.fullName); |
if (libUris.contains(partFile.library?.uri)) { |
found = true; |
} |
} else { |
- for (var lib in context.getLibrariesContaining(part)) { |
+ for (var lib in context.getLibrariesContaining(partSource)) { |
if (libUris.contains(lib.uri)) { |
found = true; |
} |
} |
} |
if (!found) { |
- errorSink.writeln("${part.fullName} is a part and cannot be analyzed."); |
+ errorSink.writeln( |
+ "${partSource.fullName} is a part and cannot be analyzed."); |
errorSink.writeln("Please pass in a library that contains this part."); |
io.exitCode = ErrorSeverity.ERROR.ordinal; |
allResult = allResult.max(ErrorSeverity.ERROR); |
@@ -468,6 +480,8 @@ class Driver implements CommandLineStarter { |
return new SourceFactory(resolvers, packageInfo.packages); |
} |
+ // TODO(devoncarew): This needs to respect analysis_options excludes. |
+ |
/// Collect all analyzable files at [filePath], recursively if it's a |
/// directory, ignoring links. |
Iterable<io.File> _collectFiles(String filePath) { |
@@ -688,7 +702,7 @@ class Driver implements CommandLineStarter { |
/// Analyze a single source. |
Future<ErrorSeverity> _runAnalyzer( |
Source source, CommandLineOptions options) async { |
- int startTime = currentTimeMillis(); |
+ int startTime = currentTimeMillis; |
AnalyzerImpl analyzer = new AnalyzerImpl(_context.analysisOptions, _context, |
analysisDriver, source, options, stats, startTime); |
ErrorSeverity errorSeverity = await analyzer.analyze(); |