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 9c0c9808356e71d72075280b178eba1551f8733c..3199f85bf1e32f9d9a3c0821b9964c06e54fa6c0 100644 |
--- a/pkg/analyzer/lib/src/context/context.dart |
+++ b/pkg/analyzer/lib/src/context/context.dart |
@@ -167,6 +167,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
StreamController<SourcesChangedEvent> _onSourcesChangedController; |
/** |
+ * A subscription for a stream of events indicating when files are (and are |
+ * not) being implicitly analyzed. |
+ */ |
+ StreamController<AnalyzedSourcesEvent> _analyzedSourcesController; |
Paul Berry
2015/07/15 19:50:01
How about naming this "_implicitlyAnalyzedSourcesC
|
+ |
+ /** |
* The listeners that are to be notified when various analysis results are |
* produced in this context. |
*/ |
@@ -220,6 +226,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
_taskManager, <WorkManager>[dartWorkManager, htmlWorkManager], this); |
_onSourcesChangedController = |
new StreamController<SourcesChangedEvent>.broadcast(); |
+ _analyzedSourcesController = |
+ new StreamController<AnalyzedSourcesEvent>.broadcast(); |
} |
@override |
@@ -281,6 +289,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
+ Stream<AnalyzedSourcesEvent> get analyzedSources => |
+ _analyzedSourcesController.stream; |
+ |
+ @override |
set contentCache(ContentCache value) { |
_contentCache = value; |
} |
@@ -728,6 +740,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
entry.modificationTime = getModificationStamp(target); |
} |
_cache.put(entry); |
+ if (target is Source) { |
+ _analyzedSourcesController.add(new AnalyzedSourcesEvent(target, true)); |
+ } |
} |
return entry; |
} |
@@ -1219,7 +1234,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
for (Source source in missingSources) { |
if (getLibrariesContaining(source).isEmpty && |
getLibrariesDependingOn(source).isEmpty) { |
- _cache.remove(source); |
+ _removeFromCache(source); |
removalCount++; |
} |
} |
@@ -1427,6 +1442,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
entry.modificationTime = getModificationStamp(source); |
entry.explicitlyAdded = explicitlyAdded; |
_cache.put(entry); |
+ if (!explicitlyAdded) { |
+ _analyzedSourcesController.add(new AnalyzedSourcesEvent(source, true)); |
+ } |
return entry; |
} |
@@ -1637,6 +1655,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
} |
+ void _removeFromCache(Source source) { |
+ CacheEntry entry = _cache.remove(source); |
+ if (entry != null && entry.explicitlyAdded) { |
+ _analyzedSourcesController.add(new AnalyzedSourcesEvent(source, false)); |
+ } |
+ } |
+ |
/** |
* Remove the given [source] from the priority order if it is in the list. |
*/ |
@@ -1769,7 +1794,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* Record that the given [source] has been removed. |
*/ |
void _sourceRemoved(Source source) { |
- _cache.remove(source); |
+ _removeFromCache(source); |
_removeFromPriorityOrder(source); |
} |