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(