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 69250b12de975dd38338e62da8aa07cda6a78ce4..dfe4880f444effa276b26b605fdf93e9582c799e 100644 |
--- a/pkg/analyzer/test/src/context/context_test.dart |
+++ b/pkg/analyzer/test/src/context/context_test.dart |
@@ -1581,28 +1581,48 @@ void g() { f(null); }'''); |
reason: "part resolved 1"); |
// update and analyze #1 |
context.setContents(partSource, "part of lib; // 1"); |
- expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull, |
- reason: "library changed 2"); |
- expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull, |
- reason: "part changed 2"); |
- _analyzeAll_assertFinished(); |
- expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, |
- reason: "library resolved 2"); |
- expect( |
- context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, |
- reason: "part resolved 2"); |
+ if (AnalysisEngine.instance.limitInvalidationInTaskModel) { |
+ expect( |
+ context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, |
+ reason: "library changed 2"); |
+ expect( |
+ context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, |
+ reason: "part changed 2"); |
+ } else { |
+ expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull, |
+ reason: "library changed 2"); |
+ expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull, |
+ reason: "part changed 2"); |
+ _analyzeAll_assertFinished(); |
+ expect( |
+ context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, |
+ reason: "library resolved 2"); |
+ expect( |
+ context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, |
+ reason: "part resolved 2"); |
+ } |
// update and analyze #2 |
context.setContents(partSource, "part of lib; // 12"); |
- expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull, |
- reason: "library changed 3"); |
- expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull, |
- reason: "part changed 3"); |
- _analyzeAll_assertFinished(); |
- expect(context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, |
- reason: "library resolved 3"); |
- expect( |
- context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, |
- reason: "part resolved 3"); |
+ if (AnalysisEngine.instance.limitInvalidationInTaskModel) { |
+ expect( |
+ context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, |
+ reason: "library changed 3"); |
+ expect( |
+ context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, |
+ reason: "part changed 3"); |
+ } else { |
+ expect(context.getResolvedCompilationUnit2(libSource, libSource), isNull, |
+ reason: "library changed 3"); |
+ expect(context.getResolvedCompilationUnit2(partSource, libSource), isNull, |
+ reason: "part changed 3"); |
+ _analyzeAll_assertFinished(); |
+ expect( |
+ context.getResolvedCompilationUnit2(libSource, libSource), isNotNull, |
+ reason: "library resolved 3"); |
+ expect( |
+ context.getResolvedCompilationUnit2(partSource, libSource), isNotNull, |
+ reason: "part resolved 3"); |
+ } |
} |
void test_performAnalysisTask_importedLibraryAdd() { |
@@ -2069,6 +2089,89 @@ class LimitedInvalidateTest extends AbstractContextTest { |
super.tearDown(); |
} |
+ void test_noChange_thenChange() { |
+ Source sourceA = addSource("/a.dart", r''' |
+library lib_a; |
+ |
+class A { |
+ A(); |
+} |
+class B { |
+ B(); |
+} |
+'''); |
+ Source sourceB = addSource("/b.dart", r''' |
+library lib_b; |
+import 'a.dart'; |
+main() { |
+ new A(); |
+} |
+'''); |
+ _performPendingAnalysisTasks(); |
+ expect(context.getErrors(sourceA).errors, hasLength(0)); |
+ expect(context.getErrors(sourceB).errors, hasLength(0)); |
+ var unitA = context.getResolvedCompilationUnit2(sourceA, sourceA); |
+ var unitElementA = unitA.element; |
+ var libraryElementA = unitElementA.library; |
+ // Update a.dart, no declaration changes. |
+ context.setContents(sourceA, r''' |
+library lib_a; |
+class A { |
+ A(); |
+} |
+class B { |
+ B(); |
+} |
+'''); |
+ _assertInvalid(sourceA, LIBRARY_ERRORS_READY); |
+ _assertValid(sourceB, LIBRARY_ERRORS_READY); |
+ // The a.dart's unit and element are updated incrementally. |
+ // They are the same instances as initially. |
+ // So, all the references from other units are still valid. |
+ { |
+ LibrarySpecificUnit target = new LibrarySpecificUnit(sourceA, sourceA); |
+ expect(analysisCache.getValue(target, RESOLVED_UNIT1), same(unitA)); |
+ expect(unitA.element, same(unitElementA)); |
+ expect(unitElementA.library, same(libraryElementA)); |
+ } |
+ // Analyze. |
+ _performPendingAnalysisTasks(); |
+ expect(context.getErrors(sourceA).errors, hasLength(0)); |
+ expect(context.getErrors(sourceB).errors, hasLength(0)); |
+ // The a.dart's unit and element are the same. |
+ { |
+ LibrarySpecificUnit target = new LibrarySpecificUnit(sourceA, sourceA); |
+ expect(analysisCache.getValue(target, RESOLVED_UNIT), same(unitA)); |
+ expect(unitA.element, same(unitElementA)); |
+ expect(unitElementA.library, same(libraryElementA)); |
+ } |
+ // Update a.dart, rename A to A2, invalidates b.dart, so |
+ // we know that the previous update did not damage dependencies. |
+ context.setContents(sourceA, r''' |
+library lib_a; |
+class A { |
+ A(); |
+ m() {} |
+} |
+class B { |
+ B(); |
+} |
+'''); |
+ _assertInvalid(sourceA, LIBRARY_ERRORS_READY); |
+ _assertInvalid(sourceB, LIBRARY_ERRORS_READY); |
+ // The a.dart's unit and element are the same. |
+ { |
+ LibrarySpecificUnit target = new LibrarySpecificUnit(sourceA, sourceA); |
+ expect(analysisCache.getValue(target, RESOLVED_UNIT1), same(unitA)); |
+ expect(unitA.element, same(unitElementA)); |
+ expect(unitElementA.library, same(libraryElementA)); |
+ } |
+ // Analyze. |
+ _performPendingAnalysisTasks(); |
+ expect(context.getErrors(sourceA).errors, hasLength(0)); |
+ expect(context.getErrors(sourceB).errors, hasLength(0)); |
+ } |
+ |
void test_unusedName() { |
Source sourceA = addSource("/a.dart", r''' |
library lib_a; |