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]);