Make _FilesReferencingNameTask faster by using maintained FileSystemState.knownFiles list.
This makes the task itself 1.4 times faster, and search 15% faster.
R=brianwilkerson@google.com
Change-Id: I35444d46ee220fdb960d299f007739f044a20813
Reviewed-on: https://dart-review.googlesource.com/58143
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index ee5df1f..530e205 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -723,6 +723,11 @@
final Set<String> knownFilePaths = new Set<String>();
/**
+ * All known files.
+ */
+ final List<FileState> knownFiles = [];
+
+ /**
* Mapping from a path to the flag whether there is a URI for the path.
*/
final Map<String, bool> _hasUriForPath = {};
@@ -775,12 +780,6 @@
_testView = new FileSystemStateTestView(this);
}
- /**
- * Return the known files.
- */
- List<FileState> get knownFiles =>
- _pathToFiles.values.map((files) => files.first).toList();
-
@visibleForTesting
FileSystemStateTestView get test => _testView;
@@ -917,6 +916,7 @@
markFileForReading(path);
_uriToFile.clear();
knownFilePaths.clear();
+ knownFiles.clear();
_pathToFiles.clear();
_pathToCanonicalFile.clear();
_partToLibraries.clear();
@@ -926,6 +926,7 @@
var files = _pathToFiles[path];
if (files == null) {
knownFilePaths.add(path);
+ knownFiles.add(file);
files = <FileState>[];
_pathToFiles[path] = files;
fileStamp++;
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index dee8b79..1212bdc 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -401,7 +401,8 @@
}
}
- for (FileState file in _driver.fsState.knownFiles) {
+ List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
+ for (FileState file in knownFiles) {
UnitElementResult unitResult = await _driver.getUnitElement(file.path);
if (unitResult != null) {
CompilationUnitElement unitElement = unitResult.element;
@@ -537,7 +538,8 @@
// Check every file that references the given path.
List<SearchResult> results = <SearchResult>[];
- for (FileState file in _driver.fsState.knownFiles) {
+ List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
+ for (FileState file in knownFiles) {
for (FileState referencedFile in file.directReferencedFiles) {
if (referencedFile.path == path) {
await _addResultsInFile(