Index: pkg/analyzer/lib/src/context/context.dart |
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart |
index b27fa19e584a61015a01e2805bb5705144285402..0be98105275b26dc5e265017e460cf346940617d 100644 |
--- a/pkg/analyzer/lib/src/context/context.dart |
+++ b/pkg/analyzer/lib/src/context/context.dart |
@@ -651,19 +651,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
!AnalysisEngine.isDartFileName(librarySource.shortName)) { |
return new CancelableFuture.error(new AnalysisNotScheduledError()); |
} |
- var unitTarget = new LibrarySpecificUnit(librarySource, unitSource); |
- return new _AnalysisFutureHelper<CompilationUnit>(this) |
- .computeAsync(unitTarget, (CacheEntry entry) { |
- CacheState state = entry.getState(RESOLVED_UNIT); |
- if (state == CacheState.ERROR) { |
- throw entry.exception; |
- } else if (state == CacheState.INVALID) { |
- return null; |
- } |
- return entry.getValue(RESOLVED_UNIT); |
- }, () { |
- dartWorkManager.addPriorityResult(unitTarget, RESOLVED_UNIT); |
- }); |
+ return new AnalysisFutureHelper<CompilationUnit>( |
+ this, |
+ new LibrarySpecificUnit(librarySource, unitSource), |
+ RESOLVED_UNIT).computeAsync(); |
} |
@override |
@@ -2078,44 +2069,43 @@ class SdkAnalysisContext extends AnalysisContextImpl { |
* A helper class used to create futures for [AnalysisContextImpl]. |
* Using a helper class allows us to preserve the generic parameter T. |
*/ |
-class _AnalysisFutureHelper<T> { |
+class AnalysisFutureHelper<T> { |
final AnalysisContextImpl _context; |
+ final AnalysisTarget _target; |
+ final ResultDescriptor<T> _descriptor; |
- _AnalysisFutureHelper(this._context); |
+ AnalysisFutureHelper(this._context, this._target, this._descriptor); |
/** |
- * Return a future that will be completed with the result of calling |
- * [computeValue]. If [computeValue] returns non-`null`, the future will be |
- * completed immediately with the resulting value. If it returns `null`, then |
- * [scheduleComputation] is invoked to schedule analysis that will produce |
- * the required result, and [computeValue] will be re-executed in the future, |
- * after the next time the cached information for [target] has changed. If |
- * [computeValue] throws an exception, the future will fail with that |
- * exception. |
- * |
- * If the [computeValue] still returns `null` after there is no further |
- * analysis to be done for [target], then the future will be completed with |
+ * Return a future that will be completed with the result specified |
+ * in the constructor. If the result is cached, the future will be |
+ * completed immediately with the resulting value. If not, then |
+ * analysis is scheduled that will produce the required result. |
+ * If the result cannot be generated, then the future will be completed with |
* the error AnalysisNotScheduledError. |
- * |
- * Since [computeValue] will be called while the state of analysis is being |
- * updated, it should be free of side effects so that it doesn't cause |
- * reentrant changes to the analysis state. |
*/ |
- CancelableFuture<T> computeAsync(AnalysisTarget target, |
- T computeValue(CacheEntry entry), void scheduleComputation()) { |
+ CancelableFuture<T> computeAsync() { |
if (_context.isDisposed) { |
// No further analysis is expected, so return a future that completes |
// immediately with AnalysisNotScheduledError. |
return new CancelableFuture.error(new AnalysisNotScheduledError()); |
} |
- CacheEntry entry = _context.getCacheEntry(target); |
+ CacheEntry entry = _context.getCacheEntry(_target); |
PendingFuture pendingFuture = |
- new PendingFuture<T>(_context, target, computeValue); |
+ new PendingFuture<T>(_context, _target, (CacheEntry entry) { |
+ CacheState state = entry.getState(_descriptor); |
+ if (state == CacheState.ERROR) { |
+ throw entry.exception; |
+ } else if (state == CacheState.INVALID) { |
+ return null; |
+ } |
+ return entry.getValue(_descriptor); |
+ }); |
if (!pendingFuture.evaluate(entry)) { |
_context._pendingFutureTargets |
- .putIfAbsent(target, () => <PendingFuture>[]) |
+ .putIfAbsent(_target, () => <PendingFuture>[]) |
.add(pendingFuture); |
- scheduleComputation(); |
+ _context.dartWorkManager.addPriorityResult(_target, _descriptor); |
} |
return pendingFuture.future; |
} |