| Index: pkg/analyzer/lib/src/task/dart_work_manager.dart
|
| diff --git a/pkg/analyzer/lib/src/task/dart_work_manager.dart b/pkg/analyzer/lib/src/task/dart_work_manager.dart
|
| index 6df4c7e68ef7a15ca3213da1d03b320e6c31583d..6700e1f56d397f06e52d425280ccd9197a750521 100644
|
| --- a/pkg/analyzer/lib/src/task/dart_work_manager.dart
|
| +++ b/pkg/analyzer/lib/src/task/dart_work_manager.dart
|
| @@ -90,6 +90,13 @@ class DartWorkManager implements WorkManager {
|
| AnalysisCache get analysisCache => context.analysisCache;
|
|
|
| /**
|
| + * The partition that contains analysis results that are not shared with other
|
| + * contexts.
|
| + */
|
| + CachePartition get privateAnalysisCachePartition =>
|
| + context.privateAnalysisCachePartition;
|
| +
|
| + /**
|
| * Specifies that the client want the given [result] of the given [target]
|
| * to be computed with priority.
|
| */
|
| @@ -243,6 +250,20 @@ class DartWorkManager implements WorkManager {
|
| return WorkOrderPriority.NONE;
|
| }
|
|
|
| + /**
|
| + * Notifies the manager about analysis options changes.
|
| + */
|
| + void onAnalysisOptionsChanged() {
|
| + _invalidateAllLocalResolutionInformation(false);
|
| + }
|
| +
|
| + /**
|
| + * Notifies the manager about [SourceFactory] changes.
|
| + */
|
| + void onSourceFactoryChanged() {
|
| + _invalidateAllLocalResolutionInformation(true);
|
| + }
|
| +
|
| @override
|
| void resultsComputed(
|
| AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs) {
|
| @@ -311,6 +332,49 @@ class DartWorkManager implements WorkManager {
|
| }
|
|
|
| /**
|
| + * Invalidate all of the resolution results computed by this context. The flag
|
| + * [invalidateUris] should be `true` if the cached results of converting URIs
|
| + * to source files should also be invalidated.
|
| + */
|
| + void _invalidateAllLocalResolutionInformation(bool invalidateUris) {
|
| + CachePartition partition = privateAnalysisCachePartition;
|
| + // Prepare targets and values to invalidate.
|
| + List<Source> dartSources = <Source>[];
|
| + List<LibrarySpecificUnit> unitTargets = <LibrarySpecificUnit>[];
|
| + MapIterator<AnalysisTarget, CacheEntry> iterator = partition.iterator();
|
| + while (iterator.moveNext()) {
|
| + AnalysisTarget target = iterator.key;
|
| + // Optionally gather Dart sources to invalidate URIs resolution.
|
| + if (invalidateUris && _isDartSource(target)) {
|
| + dartSources.add(target);
|
| + }
|
| + // LibrarySpecificUnit(s) are roots of Dart resolution.
|
| + // When one is invalidated, invalidation is propagated to all resolution.
|
| + if (target is LibrarySpecificUnit) {
|
| + unitTargets.add(target);
|
| + Source library = target.library;
|
| + if (context.exists(library)) {
|
| + librarySourceQueue.add(library);
|
| + }
|
| + }
|
| + }
|
| + // Invalidate targets and values.
|
| + unitTargets.forEach(partition.remove);
|
| + for (Source dartSource in dartSources) {
|
| + CacheEntry entry = partition.get(dartSource);
|
| + if (dartSource != null) {
|
| + // TODO(scheglov) we invalidate too much.
|
| + // Would be nice to invalidate just URLs resolution.
|
| + entry.setState(PARSED_UNIT, CacheState.INVALID);
|
| + entry.setState(IMPORTED_LIBRARIES, CacheState.INVALID);
|
| + entry.setState(EXPLICITLY_IMPORTED_LIBRARIES, CacheState.INVALID);
|
| + entry.setState(EXPORTED_LIBRARIES, CacheState.INVALID);
|
| + entry.setState(INCLUDED_PARTS, CacheState.INVALID);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| * Invalidate [CONTAINING_LIBRARIES] for the given [source].
|
| * [CONTAINING_LIBRARIES] does not have dependencies, so we manage it here.
|
| * The [source] may be a part, or a library whose contents is updated so
|
|
|