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

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

Issue 2451733003: Move unlinked bundle access to _File itself. (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 701e2e552e32e6e11c78994b1764e745e1346c19..88358a81984fb59eb5c9dd860bfa14e1cf06ca08 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -349,13 +349,17 @@ class AnalysisDriver {
return _logger.run('Compute analysis result for $file', () {
_LibraryContext libraryContext = _createLibraryContext(file);
AnalysisContext analysisContext = _createAnalysisContext(libraryContext);
- analysisContext.setContents(file.source, file.content);
- // TODO(scheglov) Add support for parts.
- CompilationUnit resolvedUnit =
- analysisContext.resolveCompilationUnit2(file.source, file.source);
- List<AnalysisError> errors = analysisContext.computeErrors(file.source);
- return new AnalysisResult(file.path, file.uri, file.content,
- file.contentHash, resolvedUnit, errors);
+ try {
+ analysisContext.setContents(file.source, file.content);
+ // TODO(scheglov) Add support for parts.
+ CompilationUnit resolvedUnit =
+ analysisContext.resolveCompilationUnit2(file.source, file.source);
+ List<AnalysisError> errors = analysisContext.computeErrors(file.source);
+ return new AnalysisResult(file.path, file.uri, file.content,
+ file.contentHash, resolvedUnit, errors);
+ } finally {
+ analysisContext.dispose();
+ }
});
}
@@ -402,7 +406,7 @@ class AnalysisDriver {
// Append the defining unit.
_ReferencedUris referenced;
{
- PackageBundle bundle = _getUnlinked(libraryFile);
+ PackageBundle bundle = libraryFile.unlinked;
UnlinkedUnit unlinked = bundle.unlinkedUnits.single;
referenced = new _ReferencedUris(unlinked);
node.unlinkedBundles.add(bundle);
@@ -412,7 +416,7 @@ class AnalysisDriver {
// Append parts.
for (String uri in referenced.parted) {
_File file = libraryFile.resolveUri(uri);
- PackageBundle bundle = _getUnlinked(file);
+ PackageBundle bundle = file.unlinked;
UnlinkedUnit unlinked = bundle.unlinkedUnits.single;
node.unlinkedBundles.add(bundle);
_addToStoreUnlinked(store, file.uri.toString(), unlinked);
@@ -501,40 +505,6 @@ class AnalysisDriver {
}
/**
- * Return the unlinked bundle of [file] for the current file state, or `null`.
- */
- PackageBundle _getCurrentUnlinked(_File file) {
- String key = '${file.currentContentHash}.unlinked';
- List<int> bytes = _byteStore.get(key);
- return bytes != null ? new PackageBundle.fromBuffer(bytes) : null;
- }
-
- /**
- * Return the unlinked bundle of [file] for the current file state.
- *
- * Return [_getCurrentUnlinked] or read the [file] content is read, compute
- * the content hash and update the current file state accordingly. Parse the
- * content into the [CompilationUnit] and serialize into a new unlinked
- * bundle. The bundle is then put into the [_byteStore] and returned.
- */
- PackageBundle _getUnlinked(_File file) {
- // By accessing 'contentHash' we ensure that the current file state
- // has some version of the file content hash, so we will be able to
- // use it to attempt to get the current unlinked bundle.
- String key = '${file.contentHash}.unlinked';
- return _getCurrentUnlinked(file) ??
- _logger.run('Create unlinked for $file', () {
- UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(file.unit);
- PackageBundleAssembler assembler = new PackageBundleAssembler();
- assembler.addUnlinkedUnitWithHash(
- file.uri.toString(), unlinkedUnit, key);
- List<int> bytes = assembler.assemble().toBuffer();
- _byteStore.put(key, bytes);
- return new PackageBundle.fromBuffer(bytes);
- });
- }
-
- /**
* Verify the API signatures for the changed files, and decide which linked
* libraries should be invalidated, and files reanalyzed.
*
@@ -549,11 +519,11 @@ class AnalysisDriver {
for (String path in _filesToVerifyUnlinkedSignature) {
_File file = _fileForPath(path);
// Get the existing old API signature, maybe null.
- String oldSignature = _getCurrentUnlinked(file)?.apiSignature;
+ String oldSignature = file.currentUnlinked?.apiSignature;
// Clear the content hash cache, so force the file reading.
_fileContentHashMap.remove(path);
// Compute the new API signature.
- String newSignature = _getUnlinked(file).apiSignature;
+ String newSignature = file.unlinked.apiSignature;
// If the signatures are not the same, then potentially every linked
// library is inconsistent and should be recomputed, and every explicit
// file has inconsistent analysis results which also should be recomputed.
@@ -767,6 +737,21 @@ class _File {
return driver._fileContentHashMap[path];
}
+ /**
+ * Return the unlinked bundle for the current file state, or `null`.
+ */
+ PackageBundle get currentUnlinked {
+ String hash = currentContentHash;
+ if (hash != null) {
+ String key = '$hash.unlinked';
+ List<int> bytes = driver._byteStore.get(key);
+ if (bytes != null) {
+ return new PackageBundle.fromBuffer(bytes);
+ }
+ }
+ return null;
+ }
+
String get path => source.fullName;
/**
@@ -777,22 +762,46 @@ class _File {
* analysis context, so at some point the unit might become resolved.
*/
CompilationUnit get unit {
- AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
-
- CharSequenceReader reader = new CharSequenceReader(content);
- Scanner scanner = new Scanner(source, reader, errorListener);
- scanner.scanGenericMethodComments = driver._analysisOptions.strongMode;
- Token token = scanner.tokenize();
- LineInfo lineInfo = new LineInfo(scanner.lineStarts);
-
- Parser parser = new Parser(source, errorListener);
- parser.parseGenericMethodComments = driver._analysisOptions.strongMode;
- _unit = parser.parseCompilationUnit(token);
- _unit.lineInfo = lineInfo;
-
+ if (_unit == null) {
+ AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
+
+ CharSequenceReader reader = new CharSequenceReader(content);
+ Scanner scanner = new Scanner(source, reader, errorListener);
+ scanner.scanGenericMethodComments = driver._analysisOptions.strongMode;
+ Token token = scanner.tokenize();
+ LineInfo lineInfo = new LineInfo(scanner.lineStarts);
+
+ Parser parser = new Parser(source, errorListener);
+ parser.parseGenericMethodComments = driver._analysisOptions.strongMode;
+ _unit = parser.parseCompilationUnit(token);
+ _unit.lineInfo = lineInfo;
+ }
return _unit;
}
+ /**
+ * Return the unlinked bundle for the current file state.
+ *
+ * If the file [contentHash] is cached, try to load the bundle with this
+ * hash. Otherwise, read the content, compute the new hash and try to find
+ * the existing bundle, or parse the content and compute a new bundle.
+ */
+ PackageBundle get unlinked {
+ String key = '$contentHash.unlinked';
+ List<int> bytes = driver._byteStore.get(key);
+ if (bytes == null) {
+ driver._logger.run('Create unlinked for $this', () {
+ UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
+ PackageBundleAssembler assembler = new PackageBundleAssembler();
+ assembler.addUnlinkedUnitWithHash(
+ uri.toString(), unlinkedUnit, contentHash);
+ bytes = assembler.assemble().toBuffer();
+ driver._byteStore.put(key, bytes);
+ });
+ }
+ return new PackageBundle.fromBuffer(bytes);
+ }
+
Uri get uri => source.uri;
/**
« 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