Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(547)

Unified Diff: pkg/analyzer/lib/src/summary/bazel_summary.dart

Issue 2379563004: Clean up Bazel provider, still only unlinked. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analyzer/test/src/summary/bazel_summary_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/summary/bazel_summary.dart
diff --git a/pkg/analyzer/lib/src/summary/bazel_summary.dart b/pkg/analyzer/lib/src/summary/bazel_summary.dart
index f3073953d7326137cc0c6449d520d1522707a6ff..5697784da960565d4ed954b6e8a9ab9d3c45cb5c 100644
--- a/pkg/analyzer/lib/src/summary/bazel_summary.dart
+++ b/pkg/analyzer/lib/src/summary/bazel_summary.dart
@@ -14,24 +14,23 @@ import 'package:crypto/crypto.dart';
import 'package:meta/meta.dart';
/**
- * Return the path of the directory where bundles for the given [uri] should be
- * looked for. This directory should contain corresponding pairs of `*.api.ds`
- * and `*.full.ds` files, possibly more than one pair. Return `null` if the
- * given [uri] does not have the expected structure, so the output path cannot
- * be computed.
+ * Return the [Folder] where bundles for the given [absoluteUri] should be
+ * looked for. This folder should contain corresponding `*.full.ds` files,
+ * possibly more than one one. Return `null` if the given [absoluteUri]
+ * does not have the expected structure, so the output path cannot be computed.
*/
-typedef String GetOutputPath(ResourceProvider provider, Uri uri);
+typedef Folder GetOutputFolder(Uri absoluteUri);
/**
* Information about a Dart package in Bazel.
*/
class Package {
- final String bundlePath;
- final PackageBundle bundle;
+ final File unlinkedFile;
+ final PackageBundle unlinked;
final Set<String> _unitUris = new Set<String>();
- Package(this.bundlePath, this.bundle) {
- _unitUris.addAll(bundle.unlinkedUnitUris);
+ Package(this.unlinkedFile, this.unlinked) {
+ _unitUris.addAll(unlinked.unlinkedUnitUris);
}
}
@@ -39,12 +38,12 @@ class Package {
* Class that reads summaries of Bazel packages.
*
* When the client needs to produce a resolution result for a new [Source], it
- * should call [getPackages] to checked whether there is the set of packages
- * to resynthesize resolution results.
+ * should call [getLinkedPackages] to check whether there is the set of
+ * packages to resynthesize resolution results.
*/
class SummaryProvider {
final ResourceProvider provider;
- final GetOutputPath getOutputPath;
+ final GetOutputFolder getOutputFolder;
final AnalysisContext context;
/**
@@ -52,35 +51,9 @@ class SummaryProvider {
* the map were consistent with their constituent sources at the moment when
* they were put into the map.
*/
- final Map<String, Package> bundlePathToPackageMap = <String, Package>{};
+ final Map<Folder, List<Package>> folderToPackagesMap = {};
- /**
- * When we detected than some bundle is not consistent with its constituent
- * sources (i.e. even its unlinked state is not consistent), we remember
- * this fact to avoid loading and checking consistency next time.
- */
- final Set<String> knownInconsistentBundlePaths = new Set<String>();
-
- SummaryProvider(this.provider, this.getOutputPath, this.context);
-
- /**
- * Return the [Package] that contains information about the source with
- * the given [uri], or `null` if such package does not exist.
- */
- @visibleForTesting
- Package getPackageForUri(Uri uri) {
- String outputPath = getOutputPath(provider, uri);
- if (outputPath != null) {
- List<Package> packages = _getPackages(outputPath);
- for (Package package in packages) {
- String uriStr = uri.toString();
- if (package._unitUris.contains(uriStr)) {
- return package;
- }
- }
- }
- return null;
- }
+ SummaryProvider(this.provider, this.getOutputFolder, this.context);
/**
* Return the complete list of [Package]s that are required to provide all
@@ -94,13 +67,33 @@ class SummaryProvider {
* If the full set of packages cannot be produced, for example because some
* bundles are not built, or out of date, etc, then `null` is returned.
*/
- List<PackageBundle> getPackages(Source source) {
+ List<Package> getLinkedPackages(Source source) {
// TODO(scheglov) implement
return null;
}
/**
- * Return the hexadecimal string for the given [source] contents.
+ * Return the [Package] that contains information about the source with
+ * the given [uri], or `null` if such package does not exist.
+ */
+ @visibleForTesting
+ Package getUnlinkedForUri(Uri uri) {
+ Folder outputFolder = getOutputFolder(uri);
+ if (outputFolder != null) {
+ String uriStr = uri.toString();
+ List<Package> packages = _getUnlinkedPackages(outputFolder);
+ for (Package package in packages) {
+ if (package._unitUris.contains(uriStr)) {
+ return package;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return the hexadecimal string of the MD5 hash of the contents of the
+ * given [source] in [context].
*/
String _computeSourceHashHex(Source source) {
String text = context.getContents(source).data;
@@ -110,63 +103,35 @@ class SummaryProvider {
}
/**
- * Return the [Package] from the file with the given [path], or `null` if the
- * file does not exist, or it cannot be read, or is not consistent with the
- * sources it contains, etc.
- */
- Package _getPackage(String path) {
- // Check if the bundle know to be inconsistent, missing, etc.
- if (knownInconsistentBundlePaths.contains(path)) {
- return null;
- }
- // Attempt to get from the cache or read from the file system.
- try {
- Package package = bundlePathToPackageMap[path];
- if (package == null) {
- File file = provider.getFile(path);
- List<int> bytes = file.readAsBytesSync();
- PackageBundle bundle = new PackageBundle.fromBuffer(bytes);
- // Check for consistency, and fail if it's not.
- if (!_isUnlinkedBundleConsistent(bundle)) {
- knownInconsistentBundlePaths.add(path);
- return null;
- }
- // OK, put the package into the cache.
- package = new Package(path, bundle);
- bundlePathToPackageMap[path] = package;
- }
- return package;
- } catch (_) {
- return null;
- }
- }
-
- /**
- * Return all consistent [Package]s in the given [folderPath].
+ * Return all consistent unlinked [Package]s in the given [folder]. Some of
+ * the returned packages might be already linked.
*/
- List<Package> _getPackages(String folderPath) {
- List<Package> packages = <Package>[];
- try {
- Folder folder = provider.getFolder(folderPath);
- List<Resource> children = folder.getChildren();
- for (Resource child in children) {
- if (child is File) {
- String packagePath = child.path;
- if (packagePath.toLowerCase().endsWith('.full.ds')) {
- Package package = _getPackage(packagePath);
- if (package != null) {
- packages.add(package);
+ List<Package> _getUnlinkedPackages(Folder folder) {
+ List<Package> packages = folderToPackagesMap[folder];
+ if (packages == null) {
+ packages = <Package>[];
+ try {
+ List<Resource> children = folder.getChildren();
+ for (Resource child in children) {
+ if (child is File) {
+ String packagePath = child.path;
+ if (packagePath.toLowerCase().endsWith('.full.ds')) {
+ Package package = _readUnlinkedPackage(child);
+ if (package != null) {
+ packages.add(package);
+ }
}
}
}
- }
- } on FileSystemException {}
+ } on FileSystemException {}
+ folderToPackagesMap[folder] = packages;
+ }
return packages;
}
/**
* Return `true` if the unlinked information of the [bundle] is consistent
- * with its constituent sources.
+ * with its constituent sources in [context].
*/
bool _isUnlinkedBundleConsistent(PackageBundle bundle) {
try {
@@ -184,8 +149,26 @@ class SummaryProvider {
List<String> bundleHashes = bundle.unlinkedUnitHashes.toList()..sort();
actualHashes.sort();
return listsEqual(actualHashes, bundleHashes);
- } catch (_) {
- return false;
- }
+ } on FileSystemException {}
+ return false;
+ }
+
+ /**
+ * Read the unlinked [Package] from the given [file], or return `null` if the
+ * file does not exist, or it cannot be read, or is not consistent with the
+ * constituent sources on the file system.
+ */
+ Package _readUnlinkedPackage(File file) {
+ try {
+ List<int> bytes = file.readAsBytesSync();
+ PackageBundle bundle = new PackageBundle.fromBuffer(bytes);
+ // Check for consistency, and fail if it's not.
+ if (!_isUnlinkedBundleConsistent(bundle)) {
+ return null;
+ }
+ // OK, use the bundle.
+ return new Package(file, bundle);
+ } on FileSystemException {}
+ return null;
}
}
« no previous file with comments | « no previous file | pkg/analyzer/test/src/summary/bazel_summary_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698