Add FileState.libraryFiles with all files of the library.

Sometimes we need all files, so it would be nice handle both the library
file, and its parts uniformly.

R=brianwilkerson@google.com, paulberry@google.com

Change-Id: I55fa25cf6eff7210990d395c39a8829c647e1f25
Reviewed-on: https://dart-review.googlesource.com/74670
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 37bd368..278996c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -2458,10 +2458,12 @@
       FileState file = driver._fsState.getFileForPath(path);
       if (!file.isPart) {
         bool isExported = false;
-        TopLevelDeclaration declaration = file.topLevelDeclarations[name];
-        for (FileState part in file.partedFiles) {
+
+        TopLevelDeclaration declaration;
+        for (FileState part in file.libraryFiles) {
           declaration ??= part.topLevelDeclarations[name];
         }
+
         if (declaration == null) {
           declaration = file.exportedTopLevelDeclarations[name];
           isExported = true;
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index b048577..9bdaca9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -133,6 +133,7 @@
   List<FileState> _importedFiles;
   List<FileState> _exportedFiles;
   List<FileState> _partedFiles;
+  List<FileState> _libraryFiles;
   List<NameFilter> _exportFilters;
 
   Set<FileState> _directReferencedFiles = new Set<FileState>();
@@ -246,6 +247,12 @@
   }
 
   /**
+   * The list of files files that this library consists of, i.e. this library
+   * file itself and its [partedFiles].
+   */
+  List<FileState> get libraryFiles => _libraryFiles;
+
+  /**
    * Return information about line in the file.
    */
   LineInfo get lineInfo => _lineInfo;
@@ -505,6 +512,7 @@
           .putIfAbsent(file, () => <FileState>[])
           .add(this);
     }
+    _libraryFiles = [this]..addAll(_partedFiles);
 
     // Compute referenced files.
     Set<FileState> oldDirectReferencedFiles = _directReferencedFiles;
@@ -583,9 +591,8 @@
     _exportDeclarationsId = 0;
 
     // Append the library declarations.
-    declarations.addAll(topLevelDeclarations);
-    for (FileState part in partedFiles) {
-      declarations.addAll(part.topLevelDeclarations);
+    for (FileState file in libraryFiles) {
+      declarations.addAll(file.topLevelDeclarations);
     }
 
     // Record the declarations only if it is the full result.
@@ -921,18 +928,6 @@
     _partToLibraries.clear();
   }
 
-  void _addFileWithPath(String path, FileState file) {
-    var files = _pathToFiles[path];
-    if (files == null) {
-      knownFilePaths.add(path);
-      knownFiles.add(file);
-      files = <FileState>[];
-      _pathToFiles[path] = files;
-      fileStamp++;
-    }
-    files.add(file);
-  }
-
   /**
    * A specialized version of package:path context.toUri(). This assumes the
    * path is absolute as does a performant conversion to a file: uri.
@@ -944,6 +939,18 @@
       return new Uri(scheme: 'file', path: path);
     }
   }
+
+  void _addFileWithPath(String path, FileState file) {
+    var files = _pathToFiles[path];
+    if (files == null) {
+      knownFilePaths.add(path);
+      knownFiles.add(file);
+      files = <FileState>[];
+      _pathToFiles[path] = files;
+      fileStamp++;
+    }
+    files.add(file);
+  }
 }
 
 @visibleForTesting
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 8bb2cb1..3de1ee3 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -83,9 +83,8 @@
     Map<FileState, CompilationUnit> units = {};
 
     // Parse all files.
-    units[_library] = _parse(_library);
-    for (FileState part in _library.partedFiles) {
-      units[part] = _parse(part);
+    for (FileState file in _library.libraryFiles) {
+      units[file] = _parse(file);
     }
 
     // Resolve URIs in directives to corresponding sources.
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 7988281..a212a8f 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -78,11 +78,8 @@
 
           libraries[library.uriStr] = library;
 
-          // Append the defining unit.
-          store.addUnlinkedUnit(library.uriStr, library.unlinked);
-
-          // Append parts.
-          for (FileState part in library.partedFiles) {
+          // Append library units.
+          for (FileState part in library.libraryFiles) {
             store.addUnlinkedUnit(part.uriStr, part.unlinked);
           }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index b998712..658298a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -509,8 +509,7 @@
       String libraryPath = element.library.source.fullName;
       if (searchedFiles.add(libraryPath, this)) {
         FileState library = _driver.fsState.getFileForPath(libraryPath);
-        List<FileState> candidates = [library]..addAll(library.partedFiles);
-        for (FileState file in candidates) {
+        for (FileState file in library.libraryFiles) {
           if (file.path == path || file.referencedNames.contains(name)) {
             files.add(file.path);
           }
diff --git a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
index 990c2f8..6ec4d00 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -351,6 +351,7 @@
     expect(_excludeSdk(file.importedFiles), isEmpty);
     expect(file.exportedFiles, isEmpty);
     expect(file.partedFiles, isEmpty);
+    expect(file.libraryFiles, [file]);
     expect(_excludeSdk(file.directReferencedFiles), isEmpty);
     expect(file.isPart, isFalse);
     expect(file.library, isNull);
@@ -469,6 +470,8 @@
     expect(file.partedFiles[0].path, a4);
     expect(file.partedFiles[0].uri, Uri.parse('package:aaa/a4.dart'));
 
+    expect(file.libraryFiles, [file, file.partedFiles[0]]);
+
     expect(_excludeSdk(file.directReferencedFiles), hasLength(5));
 
     expect(fileSystemState.getFilesForPath(a1), [file]);