Index: pkg/analyzer/lib/src/generated/engine.dart |
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart |
index 67a7a2309d2abe3fb053a2c1faf7df135e2b0609..454f07113111c750b3daa38b78e9038a9e33aec4 100644 |
--- a/pkg/analyzer/lib/src/generated/engine.dart |
+++ b/pkg/analyzer/lib/src/generated/engine.dart |
@@ -1537,11 +1537,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// |
// Then determine which cached results are no longer valid. |
// |
- bool addedDartSource = false; |
for (Source source in changeSet.addedSources) { |
- if (_sourceAvailable(source)) { |
- addedDartSource = true; |
- } |
+ _sourceAvailable(source); |
} |
for (Source source in changeSet.changedSources) { |
if (_contentCache.getContents(source) != null) { |
@@ -1570,36 +1567,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
for (Source source in removedSources) { |
_sourceRemoved(source); |
} |
- if (addedDartSource) { |
- // TODO(brianwilkerson) This is hugely inefficient, but we need to |
- // re-analyze any libraries that might have been referencing the |
- // not-yet-existing source that was just added. Longer term we need to |
- // keep track of which libraries are referencing non-existing sources and |
- // only re-analyze those libraries. |
-// logInformation("Added Dart sources, invalidating all resolution information"); |
- List<Source> sourcesToInvalidate = new List<Source>(); |
- MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
- while (iterator.moveNext()) { |
- Source source = iterator.key; |
- SourceEntry sourceEntry = iterator.value; |
- if (!source.isInSystemLibrary && |
- (sourceEntry is DartEntry || sourceEntry is HtmlEntry)) { |
- sourcesToInvalidate.add(source); |
- } |
- } |
- int count = sourcesToInvalidate.length; |
- for (int i = 0; i < count; i++) { |
- Source source = sourcesToInvalidate[i]; |
- SourceEntry entry = _getReadableSourceEntry(source); |
- if (entry is DartEntry) { |
- entry.invalidateParseInformation(); |
- _workManager.add(source, _computePriority(entry)); |
- } else if (entry is HtmlEntry) { |
- entry.invalidateParseInformation(); |
- _workManager.add(source, SourcePriority.HTML); |
- } |
- } |
- } |
_onSourcesChangedController.add(new SourcesChangedEvent(changeSet)); |
} |
@@ -4441,27 +4408,46 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
/** |
- * Record the results produced by performing a [task] and return the cache |
- * entry associated with the results. |
+ * Given that the given [source] (with the corresponding [sourceEntry]) has |
+ * been invalidated, invalidate all of the libraries that depend on it. |
*/ |
- DartEntry _recordBuildUnitElementTask(BuildUnitElementTask task) { |
- Source source = task.source; |
- Source library = task.library; |
- DartEntry dartEntry = _cache.get(source); |
- CaughtException thrownException = task.exception; |
- if (thrownException != null) { |
- dartEntry.recordBuildElementErrorInLibrary(library, thrownException); |
- throw new AnalysisException('<rethrow>', thrownException); |
+ void _propagateInvalidation(Source source, SourceEntry sourceEntry) { |
+ if (sourceEntry is HtmlEntry) { |
+ HtmlEntry htmlEntry = sourceEntry; |
+ htmlEntry.modificationTime = getModificationStamp(source); |
+ htmlEntry.invalidateAllInformation(); |
+ _cache.removedAst(source); |
+ _workManager.add(source, SourcePriority.HTML); |
+ } else if (sourceEntry is DartEntry) { |
+ List<Source> containingLibraries = getLibrariesContaining(source); |
+ List<Source> dependentLibraries = getLibrariesDependingOn(source); |
+ HashSet<Source> librariesToInvalidate = new HashSet<Source>(); |
+ for (Source containingLibrary in containingLibraries) { |
+ _computeAllLibrariesDependingOn( |
+ containingLibrary, |
+ librariesToInvalidate); |
+ } |
+ for (Source dependentLibrary in dependentLibraries) { |
+ _computeAllLibrariesDependingOn( |
+ dependentLibrary, |
+ librariesToInvalidate); |
+ } |
+ for (Source library in librariesToInvalidate) { |
+ _invalidateLibraryResolution(library); |
+ } |
+ DartEntry dartEntry = _cache.get(source); |
+ _removeFromParts(source, dartEntry); |
+ dartEntry.modificationTime = getModificationStamp(source); |
+ dartEntry.invalidateAllInformation(); |
+ _cache.removedAst(source); |
+ _workManager.add(source, SourcePriority.UNKNOWN); |
+ } |
+ // reset unit in the notification, it is out of date now |
+ ChangeNoticeImpl notice = _pendingNotices[source]; |
+ if (notice != null) { |
+ notice.resolvedDartUnit = null; |
+ notice.resolvedHtmlUnit = null; |
} |
- dartEntry.setValueInLibrary(DartEntry.BUILT_UNIT, library, task.unit); |
- dartEntry.setValueInLibrary( |
- DartEntry.BUILT_ELEMENT, |
- library, |
- task.unitElement); |
- ChangeNoticeImpl notice = _getNotice(source); |
- LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO); |
- notice.setErrors(dartEntry.allErrors, lineInfo); |
- return dartEntry; |
} |
// /** |
@@ -4543,6 +4529,30 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// } |
/** |
+ * Record the results produced by performing a [task] and return the cache |
+ * entry associated with the results. |
+ */ |
+ DartEntry _recordBuildUnitElementTask(BuildUnitElementTask task) { |
+ Source source = task.source; |
+ Source library = task.library; |
+ DartEntry dartEntry = _cache.get(source); |
+ CaughtException thrownException = task.exception; |
+ if (thrownException != null) { |
+ dartEntry.recordBuildElementErrorInLibrary(library, thrownException); |
+ throw new AnalysisException('<rethrow>', thrownException); |
+ } |
+ dartEntry.setValueInLibrary(DartEntry.BUILT_UNIT, library, task.unit); |
+ dartEntry.setValueInLibrary( |
+ DartEntry.BUILT_ELEMENT, |
+ library, |
+ task.unitElement); |
+ ChangeNoticeImpl notice = _getNotice(source); |
+ LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO); |
+ notice.setErrors(dartEntry.allErrors, lineInfo); |
+ return dartEntry; |
+ } |
+ |
+ /** |
* Given a cache entry and a library element, record the library element and other information |
* gleaned from the element in the cache entry. |
* |
@@ -4956,12 +4966,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param source the source that has been added |
* @return `true` if the new source is a Dart file |
*/ |
- bool _sourceAvailable(Source source) { |
+ void _sourceAvailable(Source source) { |
SourceEntry sourceEntry = _cache.get(source); |
if (sourceEntry == null) { |
sourceEntry = _createSourceEntry(source, true); |
} else { |
- _sourceChanged(source); |
+ _propagateInvalidation(source, sourceEntry); |
sourceEntry = _cache.get(source); |
} |
if (sourceEntry is HtmlEntry) { |
@@ -4969,7 +4979,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else if (sourceEntry is DartEntry) { |
_workManager.add(source, _computePriority(sourceEntry as DartEntry)); |
} |
- return sourceEntry is DartEntry; |
} |
/** |
@@ -4986,36 +4995,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// to invalidate it again. |
return; |
} |
- if (sourceEntry is HtmlEntry) { |
- HtmlEntry htmlEntry = sourceEntry; |
- htmlEntry.modificationTime = getModificationStamp(source); |
- htmlEntry.invalidateAllInformation(); |
- _cache.removedAst(source); |
- _workManager.add(source, SourcePriority.HTML); |
- } else if (sourceEntry is DartEntry) { |
- List<Source> containingLibraries = getLibrariesContaining(source); |
- HashSet<Source> librariesToInvalidate = new HashSet<Source>(); |
- for (Source containingLibrary in containingLibraries) { |
- _computeAllLibrariesDependingOn( |
- containingLibrary, |
- librariesToInvalidate); |
- } |
- for (Source library in librariesToInvalidate) { |
- _invalidateLibraryResolution(library); |
- } |
- DartEntry dartEntry = _cache.get(source); |
- _removeFromParts(source, dartEntry); |
- dartEntry.modificationTime = getModificationStamp(source); |
- dartEntry.invalidateAllInformation(); |
- _cache.removedAst(source); |
- _workManager.add(source, SourcePriority.UNKNOWN); |
- } |
- // reset unit in the notification, it is out of date now |
- ChangeNoticeImpl notice = _pendingNotices[source]; |
- if (notice != null) { |
- notice.resolvedDartUnit = null; |
- notice.resolvedHtmlUnit = null; |
- } |
+ _propagateInvalidation(source, sourceEntry); |
} |
/** |
@@ -11844,18 +11824,6 @@ abstract class SourceEntry { |
result.value = value == null ? descriptor.defaultValue : value; |
} |
- /** |
- * Increment the count of the number of times that data represented by the |
- * given [descriptor] was transitioned from the current state (as found in the |
- * given [result] to a valid state. |
- */ |
- static void countTransition(DataDescriptor descriptor, CachedResult result) { |
- Map<CacheState, int> countMap = |
- transitionMap.putIfAbsent(descriptor, () => new HashMap<CacheState, int>()); |
- int count = countMap[result.state]; |
- countMap[result.state] = count == null ? 1 : count + 1; |
- } |
- |
@override |
String toString() { |
StringBuffer buffer = new StringBuffer(); |
@@ -12006,6 +11974,18 @@ abstract class SourceEntry { |
buffer.write(" = "); |
buffer.write(result == null ? CacheState.INVALID : result.state); |
} |
+ |
+ /** |
+ * Increment the count of the number of times that data represented by the |
+ * given [descriptor] was transitioned from the current state (as found in the |
+ * given [result] to a valid state. |
+ */ |
+ static void countTransition(DataDescriptor descriptor, CachedResult result) { |
+ Map<CacheState, int> countMap = |
+ transitionMap.putIfAbsent(descriptor, () => new HashMap<CacheState, int>()); |
+ int count = countMap[result.state]; |
+ countMap[result.state] = count == null ? 1 : count + 1; |
+ } |
} |
/** |