Index: pkg/analyzer/lib/src/summary/incremental_cache.dart |
diff --git a/pkg/analyzer/lib/src/summary/incremental_cache.dart b/pkg/analyzer/lib/src/summary/incremental_cache.dart |
index 379b9ae64d8e2731d48c4227054df9dbc002ee9d..38f32034b085d545b57e6add288524d9b04d877c 100644 |
--- a/pkg/analyzer/lib/src/summary/incremental_cache.dart |
+++ b/pkg/analyzer/lib/src/summary/incremental_cache.dart |
@@ -8,6 +8,7 @@ import 'dart:core' hide Resource; |
import 'package:analyzer/dart/element/element.dart'; |
import 'package:analyzer/file_system/file_system.dart'; |
import 'package:analyzer/src/generated/engine.dart'; |
+import 'package:analyzer/src/generated/error.dart'; |
import 'package:analyzer/src/generated/source.dart'; |
import 'package:analyzer/src/summary/format.dart'; |
import 'package:analyzer/src/summary/idl.dart'; |
@@ -159,6 +160,28 @@ class IncrementalCache { |
} |
/** |
+ * Return cached errors in the given [source] in the context of the given |
+ * [librarySource], or `null` if the cache does not have this information. |
+ */ |
+ List<AnalysisError> getSourceErrorsInLibrary( |
+ Source librarySource, Source source) { |
+ try { |
+ String key = _getSourceErrorsKey(librarySource, source); |
+ List<int> bytes = storage.get(key); |
+ if (bytes == null) { |
+ return null; |
+ } |
+ CacheSourceErrorsInLibrary errorsObject = |
+ new CacheSourceErrorsInLibrary.fromBuffer(bytes); |
+ return errorsObject.errors |
+ .map((e) => _convertErrorFromCached(source, e)) |
+ .toList(); |
+ } catch (e) { |
+ return null; |
+ } |
+ } |
+ |
+ /** |
* Return the kind of the given [source], or `null` if unknown. |
*/ |
SourceKind getSourceKind(Source source) { |
@@ -189,6 +212,19 @@ class IncrementalCache { |
} |
/** |
+ * Associate the given [errors] with the [source] in the [librarySource]. |
+ */ |
+ void putSourceErrorsInLibrary( |
+ Source librarySource, Source source, List<AnalysisError> errors) { |
+ CacheSourceErrorsInLibraryBuilder builder = |
+ new CacheSourceErrorsInLibraryBuilder( |
+ errors: errors.map(_convertErrorToCached).toList()); |
+ String key = _getSourceErrorsKey(librarySource, source); |
+ List<int> bytes = builder.toBuffer(); |
+ storage.put(key, bytes); |
+ } |
+ |
+ /** |
* Fill the whole source closure of the library with the given |
* [librarySource]. It includes defining units and parts of the library and |
* all its directly or indirectly imported or exported libraries. |
@@ -236,6 +272,33 @@ class IncrementalCache { |
} |
/** |
+ * Return the [AnalysisError] for the given [cachedError]. |
+ */ |
+ AnalysisError _convertErrorFromCached( |
+ Source source, CacheAnalysisError cachedError) { |
+ ErrorCode errorCode = _getErrorCode(cachedError); |
+ return new AnalysisError.forValues( |
+ source, |
+ cachedError.offset, |
+ cachedError.length, |
+ errorCode, |
+ cachedError.message, |
+ cachedError.correction); |
+ } |
+ |
+ /** |
+ * Return the [CacheAnalysisError] for the given [error]. |
+ */ |
+ CacheAnalysisError _convertErrorToCached(AnalysisError error) { |
+ return new CacheAnalysisErrorBuilder( |
+ errorCodeUniqueName: error.errorCode.uniqueName, |
+ offset: error.offset, |
+ length: error.length, |
+ message: error.message, |
+ correction: error.correction); |
+ } |
+ |
+ /** |
* Get the content based information about the given [source], maybe `null` |
* if the information is not in the cache. |
*/ |
@@ -263,6 +326,18 @@ class IncrementalCache { |
} |
/** |
+ * Return the [ErrorCode] of the given [error], throws if not found. |
+ */ |
+ ErrorCode _getErrorCode(CacheAnalysisError error) { |
+ String uniqueName = error.errorCodeUniqueName; |
+ ErrorCode errorCode = ErrorCode.byUniqueName(uniqueName); |
+ if (errorCode != null) { |
+ return errorCode; |
+ } |
+ throw new StateError('Unable to find ErrorCode: $uniqueName'); |
+ } |
+ |
+ /** |
* Get the bundle for the given key. |
*/ |
PackageBundle _getLibraryBundle(String key) { |
@@ -328,6 +403,18 @@ class IncrementalCache { |
} |
/** |
+ * Return the key for errors in the [source] in the [librarySource]. |
+ */ |
+ String _getSourceErrorsKey(Source librarySource, Source source) { |
+ List<int> hash = _computeSaltedMD5OfBytes((ByteConversionSink byteSink) { |
+ byteSink.add(_getLibraryClosureHash(librarySource)); |
+ byteSink.add(_getSourceContentHash(source)); |
+ }); |
+ String hashStr = hex.encode(hash); |
+ return '$hashStr.errorsInLibrary'; |
+ } |
+ |
+ /** |
* Return a source representing the URI that results from resolving the given |
* (possibly relative) [containedUri] against the URI associated with the |
* [containingSource], whether or not the resulting source exists, or `null` |