Index: pkg/analyzer/test/src/context/context_test.dart |
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart |
index ab34174b595213b47f9da5e80d3f79bd1347dbfe..f5b695f5b5c4128002d38fb3e84f5cf7bbddbd46 100644 |
--- a/pkg/analyzer/test/src/context/context_test.dart |
+++ b/pkg/analyzer/test/src/context/context_test.dart |
@@ -455,8 +455,79 @@ import 'libB.dart';'''; |
}); |
} |
- void test_cacheConsistencyValidator_computed() { |
+ void test_applyChanges_removeUsedLibrary_addAgain() { |
+ String codeA = r''' |
+import 'b.dart'; |
+B b = null; |
+'''; |
+ String codeB = r''' |
+class B {} |
+'''; |
+ Source a = addSource('/a.dart', codeA); |
+ Source b = addSource('/b.dart', codeB); |
+ CacheState getErrorsState(Source source) => |
+ context.analysisCache.getState(source, LIBRARY_ERRORS_READY); |
+ _performPendingAnalysisTasks(); |
+ expect(context.getErrors(a).errors, hasLength(0)); |
+ // Remove b.dart - errors in a.dart are invalidated and recomputed. |
+ // Now a.dart has an error. |
+ _removeSource(b); |
+ expect(getErrorsState(a), CacheState.INVALID); |
+ _performPendingAnalysisTasks(); |
+ expect(getErrorsState(a), CacheState.VALID); |
+ expect(context.getErrors(a).errors, hasLength(isPositive)); |
+ // Add b.dart - errors in a.dart are invalidated and recomputed. |
+ // The reason is that a.dart adds dependencies on (not existing) b.dart |
+ // results in cache. |
+ // Now a.dart does not have errors. |
+ addSource('/b.dart', codeB); |
+ expect(getErrorsState(a), CacheState.INVALID); |
+ _performPendingAnalysisTasks(); |
+ expect(getErrorsState(a), CacheState.VALID); |
+ expect(context.getErrors(a).errors, hasLength(0)); |
+ } |
+ |
+ void test_cacheConsistencyValidator_computed_deleted() { |
+ CacheConsistencyValidator validator = context.cacheConsistencyValidator; |
+ var stat = PerformanceStatistics.cacheConsistencyValidationStatistics; |
+ stat.reset(); |
+ // Add sources. |
+ MemoryResourceProvider resourceProvider = new MemoryResourceProvider(); |
+ String path1 = '/test1.dart'; |
+ String path2 = '/test2.dart'; |
+ Source source1 = resourceProvider.newFile(path1, '// 1-1').createSource(); |
+ Source source2 = resourceProvider.newFile(path2, '// 2-1').createSource(); |
+ context.applyChanges( |
+ new ChangeSet()..addedSource(source1)..addedSource(source2)); |
+ // Same modification times. |
+ expect( |
+ validator.sourceModificationTimesComputed([source1, source2], |
+ [source1.modificationStamp, source2.modificationStamp]), |
+ isFalse); |
+ expect(stat.numOfChanged, 0); |
+ expect(stat.numOfRemoved, 0); |
+ // Add overlay |
+ context.setContents(source1, '// 1-2'); |
+ expect( |
+ validator.sourceModificationTimesComputed( |
+ [source1, source2], [-1, source2.modificationStamp]), |
+ isFalse); |
+ context.setContents(source1, null); |
+ expect(stat.numOfChanged, 0); |
+ expect(stat.numOfRemoved, 0); |
+ // Different modification times. |
+ expect( |
+ validator.sourceModificationTimesComputed( |
+ [source1, source2], [-1, source2.modificationStamp]), |
+ isTrue); |
+ expect(stat.numOfChanged, 0); |
+ expect(stat.numOfRemoved, 1); |
+ } |
+ |
+ void test_cacheConsistencyValidator_computed_modified() { |
CacheConsistencyValidator validator = context.cacheConsistencyValidator; |
+ var stat = PerformanceStatistics.cacheConsistencyValidationStatistics; |
+ stat.reset(); |
// Add sources. |
MemoryResourceProvider resourceProvider = new MemoryResourceProvider(); |
String path1 = '/test1.dart'; |
@@ -470,6 +541,8 @@ import 'libB.dart';'''; |
validator.sourceModificationTimesComputed([source1, source2], |
[source1.modificationStamp, source2.modificationStamp]), |
isFalse); |
+ expect(stat.numOfChanged, 0); |
+ expect(stat.numOfRemoved, 0); |
// Add overlay |
context.setContents(source1, '// 1-2'); |
expect( |
@@ -477,11 +550,15 @@ import 'libB.dart';'''; |
[source1.modificationStamp + 1, source2.modificationStamp]), |
isFalse); |
context.setContents(source1, null); |
+ expect(stat.numOfChanged, 0); |
+ expect(stat.numOfRemoved, 0); |
// Different modification times. |
expect( |
validator.sourceModificationTimesComputed([source1, source2], |
[source1.modificationStamp + 1, source2.modificationStamp]), |
isTrue); |
+ expect(stat.numOfChanged, 1); |
+ expect(stat.numOfRemoved, 0); |
} |
void test_cacheConsistencyValidator_getSources() { |
@@ -2821,9 +2898,8 @@ List<A> foo() => []; |
_performPendingAnalysisTasks(); |
expect(context.getErrors(b).errors, hasLength(0)); |
// Add @deprecated annotation. |
- // b.dart could have valid resolution, because A is still A, |
- // but deprecated hints are reported in resolved. So, everything in b.dart |
- // is invalid. |
+ // b.dart has valid resolution, because A is still A, so only errors are |
+ // invalidated. |
context.setContents( |
a, |
r''' |
@@ -2860,9 +2936,8 @@ List<A> foo() => []; |
_performPendingAnalysisTasks(); |
expect(context.getErrors(b).errors, hasLength(1)); |
// Add @deprecated annotation. |
- // b.dart could have valid resolution, because A is still A, |
- // but deprecated hints are reported in resolved. So, everything in b.dart |
- // is invalid. |
+ // b.dart has valid resolution, because A is still A, so only errors are |
+ // invalidated. |
context.setContents( |
a, |
r''' |