| Index: pkg/analyzer/lib/src/context/cache.dart
|
| diff --git a/pkg/analyzer/lib/src/context/cache.dart b/pkg/analyzer/lib/src/context/cache.dart
|
| index 5ae41bd5b0ff5448bd6db22ec162dd336af56ee7..db5140363cea944bf0e1491ba26cda1c40019d03 100644
|
| --- a/pkg/analyzer/lib/src/context/cache.dart
|
| +++ b/pkg/analyzer/lib/src/context/cache.dart
|
| @@ -413,9 +413,7 @@ class CacheEntry {
|
| }
|
| this._exception = exception;
|
| for (ResultDescriptor descriptor in descriptors) {
|
| - ResultData data = _getResultData(descriptor);
|
| - TargetedResult thisResult = new TargetedResult(_target, descriptor);
|
| - data.invalidate(_cache, thisResult, CacheState.ERROR);
|
| + _invalidate(descriptor, exception);
|
| }
|
| }
|
|
|
| @@ -432,11 +430,7 @@ class CacheEntry {
|
| }
|
| _validateStateChange(descriptor, state);
|
| if (state == CacheState.INVALID) {
|
| - ResultData data = _resultMap[descriptor];
|
| - if (data != null) {
|
| - TargetedResult thisResult = new TargetedResult(_target, descriptor);
|
| - data.invalidate(_cache, thisResult, CacheState.INVALID);
|
| - }
|
| + _invalidate(descriptor, null);
|
| } else {
|
| ResultData data = _getResultData(descriptor);
|
| data.state = state;
|
| @@ -458,10 +452,10 @@ class CacheEntry {
|
| /*<V>*/ void setValue(ResultDescriptor /*<V>*/ descriptor, dynamic /*V*/
|
| value, List<TargetedResult> dependedOn, Object memento) {
|
| _validateStateChange(descriptor, CacheState.VALID);
|
| + _invalidate(descriptor, null);
|
| ResultData data = _getResultData(descriptor);
|
| {
|
| TargetedResult thisResult = new TargetedResult(_target, descriptor);
|
| - data.invalidate(_cache, thisResult, CacheState.INVALID);
|
| data.setDependedOnResults(_cache, thisResult, dependedOn);
|
| }
|
| data.state = CacheState.VALID;
|
| @@ -490,6 +484,37 @@ class CacheEntry {
|
| }
|
|
|
| /**
|
| + * Invalidate the result represented by the given [descriptor].
|
| + * Propagate invalidation to other results that depend on it.
|
| + */
|
| + void _invalidate(ResultDescriptor descriptor, CaughtException exception) {
|
| + ResultData data = _getResultData(descriptor);
|
| + // Invalidate this result.
|
| + if (exception == null) {
|
| + data.state = CacheState.INVALID;
|
| + } else {
|
| + data.state = CacheState.ERROR;
|
| + _exception = exception;
|
| + }
|
| + data.value = descriptor.defaultValue;
|
| + // Stop depending on other results.
|
| + TargetedResult thisResult = new TargetedResult(_target, descriptor);
|
| + List<TargetedResult> dependedOnResults = data.dependedOnResults;
|
| + data.dependedOnResults = <TargetedResult>[];
|
| + dependedOnResults.forEach((TargetedResult dependedOnResult) {
|
| + ResultData data = _cache._getDataFor(dependedOnResult);
|
| + data.removeDependentResult(thisResult);
|
| + });
|
| + // Invalidate results that depend on this result.
|
| + List<TargetedResult> dependentResults = data.dependentResults;
|
| + data.dependentResults = <TargetedResult>[];
|
| + dependentResults.forEach((TargetedResult dependentResult) {
|
| + CacheEntry entry = _cache.get(dependentResult.target);
|
| + entry._invalidate(dependentResult.result, exception);
|
| + });
|
| + }
|
| +
|
| + /**
|
| * Set the value of the flag with the given [index] to the given [value].
|
| */
|
| void _setFlag(int index, bool value) {
|
| @@ -866,31 +891,6 @@ class ResultData {
|
| }
|
|
|
| /**
|
| - * Invalidate this [ResultData] that corresponds to [thisResult] and
|
| - * propagate invalidation to the results that depend on this one.
|
| - */
|
| - void invalidate(
|
| - AnalysisCache cache, TargetedResult thisResult, CacheState newState) {
|
| - // Invalidate this result.
|
| - state = newState;
|
| - value = descriptor.defaultValue;
|
| - // Stop depending on other results.
|
| - List<TargetedResult> dependedOnResults = this.dependedOnResults;
|
| - this.dependedOnResults = <TargetedResult>[];
|
| - dependedOnResults.forEach((TargetedResult dependedOnResult) {
|
| - ResultData data = cache._getDataFor(dependedOnResult);
|
| - data.removeDependentResult(thisResult);
|
| - });
|
| - // Invalidate results that depend on this result.
|
| - List<TargetedResult> dependentResults = this.dependentResults;
|
| - this.dependentResults = <TargetedResult>[];
|
| - dependentResults.forEach((TargetedResult dependentResult) {
|
| - ResultData data = cache._getDataFor(dependentResult);
|
| - data.invalidate(cache, dependentResult, newState);
|
| - });
|
| - }
|
| -
|
| - /**
|
| * Remove the given [result] from the list of dependent results.
|
| */
|
| void removeDependentResult(TargetedResult result) {
|
|
|