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

Unified Diff: pkg/analyzer/lib/src/dart/analysis/driver.dart

Issue 2450283003: Try to load the existing unlinked bundle by the content hash. (Closed)
Patch Set: Created 4 years, 2 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 | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/dart/analysis/driver.dart
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index e009131b80dfd8d73e7e03b09bf11648019260ff..1a3ae73c395e5e0f4fd03e0462d4acdcd1057219 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -235,9 +235,8 @@ class AnalysisDriver {
bool analyzed = false;
for (String path in _priorityFiles) {
if (_filesToAnalyze.remove(path)) {
- _File file = _fileForPath(path);
AnalysisResult result =
- _computeAnalysisResult(file, withUnit: true);
+ _computeAnalysisResult(path, withUnit: true);
yield result;
break;
}
@@ -252,8 +251,7 @@ class AnalysisDriver {
// Analyze a general file.
if (_filesToAnalyze.isNotEmpty) {
String path = _removeFirst(_filesToAnalyze);
- _File file = _fileForPath(path);
- AnalysisResult result = _computeAnalysisResult(file, withUnit: false);
+ AnalysisResult result = _computeAnalysisResult(path, withUnit: false);
yield result;
// Repeat the processing loop.
_hasWork.notify();
@@ -366,33 +364,38 @@ class AnalysisDriver {
}
/**
- * Compute the [AnalysisResult] for the [file].
+ * Return the cached or newly computed analysis result of the file with the
+ * given [path].
*
- * The result will have the fully resolved unit only if [withUnit] is `true`.
+ * The result will have the fully resolved unit and will always be newly
+ * compute only if [withUnit] is `true`.
*/
- AnalysisResult _computeAnalysisResult(_File file, {bool withUnit: false}) {
- // If we don't need to the fully resolved unit, check for a cached result.
+ AnalysisResult _computeAnalysisResult(String path, {bool withUnit: false}) {
+ Source source = _sourceForPath(path);
+
+ // If we don't need the fully resolved unit, check for the cached result.
if (!withUnit) {
- AnalysisResult result = _getCachedAnalysisResult(file);
+ _File file = new _File.forLinking(this, source);
+ // Prepare the key for the cached result.
+ String key = _getResolvedUnitKey(file);
+ if (key == null) {
+ _logger.run('Compute the dependency hash for $source', () {
+ _createLibraryContext(file);
+ key = _getResolvedUnitKey(file);
+ });
+ }
+ // Check for the cached result.
+ AnalysisResult result = _getCachedAnalysisResult(file, key);
if (result != null) {
return result;
}
}
// We need the fully resolved unit, or the result is not cached.
- return _logger.run('Compute analysis result for $file', () {
- _LibraryContext libraryContext = _createLibraryContext(file);
-
- // We recomputed the dependency hash, and we might have a cached result.
- if (!withUnit) {
- AnalysisResult result = _getCachedAnalysisResult(file);
- if (result != null) {
- _logger.writeln('Return the cached analysis result.');
- return result;
- }
- }
-
+ return _logger.run('Compute analysis result for $source', () {
// Still no result, compute and store it.
+ _File file = new _File.forResolution(this, source);
+ _LibraryContext libraryContext = _createLibraryContext(file);
AnalysisContext analysisContext = _createAnalysisContext(libraryContext);
try {
analysisContext.setContents(file.source, file.content);
@@ -559,37 +562,24 @@ class AnalysisDriver {
}
/**
- * Return the [_File] for the given [path] in [_sourceFactory].
- */
- _File _fileForPath(String path) {
- Source fileSource = _resourceProvider.getFile(path).createSource();
- Uri uri = _sourceFactory.restoreUri(fileSource);
- Source source = _resourceProvider.getFile(path).createSource(uri);
- return new _File.forResolution(this, source);
- }
-
- /**
- * If we know the dependency signature for the [file], try to load the
- * analysis result from the cache. Return `null` if not found.
+ * If we know the result [key] for the [file], try to load the analysis
+ * result from the cache. Return `null` if not found.
*/
- AnalysisResult _getCachedAnalysisResult(_File file) {
- String key = _getResolvedUnitKey(file);
- if (key != null) {
- List<int> bytes = _byteStore.get(key);
- if (bytes != null) {
- var unit = new AnalysisDriverResolvedUnit.fromBuffer(bytes);
- List<AnalysisError> errors = unit.errors
- .map((error) => new AnalysisError.forValues(
- file.source,
- error.offset,
- error.length,
- ErrorCode.byUniqueName(error.uniqueName),
- error.message,
- error.correction))
- .toList();
- return new AnalysisResult(
- file.path, file.uri, null, file.contentHash, null, errors);
- }
+ AnalysisResult _getCachedAnalysisResult(_File file, String key) {
+ List<int> bytes = _byteStore.get(key);
+ if (bytes != null) {
+ var unit = new AnalysisDriverResolvedUnit.fromBuffer(bytes);
+ List<AnalysisError> errors = unit.errors
+ .map((error) => new AnalysisError.forValues(
+ file.source,
+ error.offset,
+ error.length,
+ ErrorCode.byUniqueName(error.uniqueName),
+ error.message,
+ error.correction))
+ .toList();
+ return new AnalysisResult(
+ file.path, file.uri, null, file.contentHash, null, errors);
}
return null;
}
@@ -610,6 +600,15 @@ class AnalysisDriver {
}
/**
+ * Return the [Source] for the given [path] in [_sourceFactory].
+ */
+ Source _sourceForPath(String path) {
+ Source fileSource = _resourceProvider.getFile(path).createSource();
+ Uri uri = _sourceFactory.restoreUri(fileSource);
+ return _resourceProvider.getFile(path).createSource(uri);
+ }
+
+ /**
* Verify the API signature for the file with the given [path], and decide
* which linked libraries should be invalidated, and files reanalyzed.
*
@@ -620,7 +619,8 @@ class AnalysisDriver {
String oldSignature = _fileApiSignatureMap[path];
// Compute the new API signature.
// _File.forResolution() also updates the content hash in the cache.
- _File newFile = _fileForPath(path);
+ Source source = _sourceForPath(path);
+ _File newFile = new _File.forResolution(this, source);
String newSignature = newFile.unlinked.apiSignature;
// If the old API signature is not null, then the file was used to
// compute at least one dependency signature. If the new API signature
@@ -816,22 +816,10 @@ class _File {
*/
final CompilationUnit unit;
- factory _File.forLinking(AnalysisDriver driver, Source source) {
- // If we have enough cached information, use it.
- String contentHash = driver._fileContentHashMap[source.fullName];
- if (contentHash != null) {
- String key = '$contentHash.unlinked';
- List<int> bytes = driver._byteStore.get(key);
- if (bytes != null) {
- PackageBundle unlinked = new PackageBundle.fromBuffer(bytes);
- return new _File._(driver, source, null, contentHash, unlinked, null);
- }
- }
- // Otherwise, read the source, parse and build a new unlinked bundle.
- return new _File.forResolution(driver, source);
- }
-
- factory _File.forResolution(AnalysisDriver driver, Source source) {
+ /**
+ * Return the file with consistent [content] and [contentHash].
+ */
+ factory _File.forContent(AnalysisDriver driver, Source source) {
String path = source.fullName;
// Read the content.
String content;
@@ -853,6 +841,37 @@ class _File {
List<int> hashBytes = md5.convert(textBytes).bytes;
String contentHash = hex.encode(hashBytes);
driver._fileContentHashMap[path] = contentHash;
+ // Return information about the file content.
+ return new _File._(driver, source, content, contentHash, null, null);
+ }
+
+ factory _File.forLinking(AnalysisDriver driver, Source source) {
+ String path = source.fullName;
+ String contentHash = driver._fileContentHashMap[path];
+ // If we don't have the file content hash, compute it.
+ if (contentHash == null) {
+ _File file = new _File.forContent(driver, source);
+ contentHash = file.contentHash;
+ }
+ // If we have the cached unlinked bundle, use it.
+ {
+ String key = '$contentHash.unlinked';
+ List<int> bytes = driver._byteStore.get(key);
+ if (bytes != null) {
+ PackageBundle unlinked = new PackageBundle.fromBuffer(bytes);
+ driver._fileApiSignatureMap[path] = unlinked.apiSignature;
+ return new _File._(driver, source, null, contentHash, unlinked, null);
+ }
+ }
+ // Otherwise, read the source, parse and build a new unlinked bundle.
+ return new _File.forResolution(driver, source);
+ }
+
+ factory _File.forResolution(AnalysisDriver driver, Source source) {
+ _File file = new _File.forContent(driver, source);
+ String path = file.path;
+ String content = file.content;
+ String contentHash = file.contentHash;
// Parse the unit.
CompilationUnit unit = _parse(driver, source, content);
// Prepare the unlinked bundle.
@@ -873,7 +892,7 @@ class _File {
unlinked = new PackageBundle.fromBuffer(bytes);
driver._fileApiSignatureMap[path] = unlinked.apiSignature;
}
- // Update the current file state.
+ // Return the full file.
return new _File._(driver, source, content, contentHash, unlinked, unit);
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698