Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(520)

Unified Diff: pkg/analyzer/test/src/context/context_test.dart

Issue 2138603002: Keep resolution results in more cases. Invalidate only errors. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/task/dart.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 24071a99c4737f0bf128ba8756f33279e25eb67c..252ed6268b8220d00f4ef3ad90e5b9e48d35d2a9 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -2892,64 +2892,56 @@ class B extends A {}
_assertInvalid(b, LIBRARY_ERRORS_READY);
}
- void test_class_private_member() {
+ void test_class_method_remove_notUsed_instantiated() {
Source a = addSource(
'/a.dart',
r'''
-class A {
- A();
- A._privateConstructor();
-
- foo() {}
-
- int _privateField;
- _privateMethod() {}
- int get _privateGetter => null;
- void set _privateSetter(_) {}
+abstract class I {
+ void foo();
+}
+class A implements I {
+ void foo() {}
}
''');
Source b = addSource(
'/b.dart',
r'''
import 'a.dart';
-main(A a) {
- a.foo();
+main() {
+ new A();
}
''');
_performPendingAnalysisTasks();
- // Update a.dart: rename private members of A
- // b.dart is valid, it cannot see these private members.
+ // Update a.dart: remove 'A.foo'.
+ // b.dart is valid because it does not reference 'foo'.
+ // The class 'A' has a warning, but it is still not abstract.
context.setContents(
a,
r'''
-class A {
- A();
- A._privateConstructor2();
-
- foo() {}
-
- int _privateField2;
- _privateMethod2() {}
- int get _privateGetter2 => null;
- void set _privateSetter2(_) {}
+abstract class I {
+ void fo();
+}
+class A implements I {
}
''');
_assertValidForChangedLibrary(a);
_assertInvalid(a, LIBRARY_ERRORS_READY);
+
_assertValidForDependentLibrary(b);
_assertValidAllLibraryUnitResults(b);
- _assertValid(b, LIBRARY_ERRORS_READY);
+ _assertValidAllResolution(b);
+ _assertValidAllErrors(b);
}
- void test_class_super_makeAbstract_instantiate() {
+ void test_class_method_remove_subclass() {
Source a = addSource(
'/a.dart',
r'''
abstract class I {
- void m();
+ void foo();
}
class A implements I {
- void m() {}
+ void foo() {}
}
''');
Source b = addSource(
@@ -2958,35 +2950,77 @@ class A implements I {
import 'a.dart';
class B extends A {}
''');
- Source c = addSource(
- '/c.dart',
- r'''
-import 'b.dart';
-main() {
- new B();
-}
-''');
_performPendingAnalysisTasks();
// Update a.dart: remove A.bar, add A.bar2.
- // b.dart is valid, because it doesn't references 'bar' or 'bar2'.
+ // b.dart
+ // Resolution is valid because 'foo' is not referenced.
+ // HINTS are invalid because 'B' might have invalid @override.
+ // VERIFY_ERRORS are invalid because 'B' might not implement something.
+ // Other errors are also invalid.
context.setContents(
a,
r'''
abstract class I {
- void m();
+ void foo();
}
class A implements I {
- void m2() {}
}
''');
_assertValidForChangedLibrary(a);
_assertInvalid(a, LIBRARY_ERRORS_READY);
_assertValidForDependentLibrary(b);
- _assertInvalid(b, LIBRARY_ERRORS_READY);
+ _assertValidAllResolution(b);
+ _assertInvalidHintsVerifyErrors(b);
+ }
- _assertValidForDependentLibrary(c);
- _assertInvalid(c, LIBRARY_ERRORS_READY);
+ void test_class_private_member() {
+ Source a = addSource(
+ '/a.dart',
+ r'''
+class A {
+ A();
+ A._privateConstructor();
+
+ foo() {}
+
+ int _privateField;
+ _privateMethod() {}
+ int get _privateGetter => null;
+ void set _privateSetter(_) {}
+}
+''');
+ Source b = addSource(
+ '/b.dart',
+ r'''
+import 'a.dart';
+main(A a) {
+ a.foo();
+}
+''');
+ _performPendingAnalysisTasks();
+ // Update a.dart: rename private members of A
+ // b.dart is valid, it cannot see these private members.
+ context.setContents(
+ a,
+ r'''
+class A {
+ A();
+ A._privateConstructor2();
+
+ foo() {}
+
+ int _privateField2;
+ _privateMethod2() {}
+ int get _privateGetter2 => null;
+ void set _privateSetter2(_) {}
+}
+''');
+ _assertValidForChangedLibrary(a);
+ _assertInvalid(a, LIBRARY_ERRORS_READY);
+ _assertValidForDependentLibrary(b);
+ _assertValidAllLibraryUnitResults(b);
+ _assertValid(b, LIBRARY_ERRORS_READY);
}
void test_private_class() {
@@ -3166,8 +3200,8 @@ class A {
_assertValidForChangedLibrary(a);
_assertInvalid(a, LIBRARY_ERRORS_READY);
_assertValidForDependentLibrary(b);
- _assertInvalid(b, LIBRARY_ERRORS_READY);
- _assertInvalidUnits(b, RESOLVED_UNIT4);
+ _assertValidAllResolution(b);
+ _assertInvalidHintsVerifyErrors(b);
_performPendingAnalysisTasks();
expect(context.getErrors(b).errors, hasLength(1));
@@ -3342,8 +3376,8 @@ class B {
_assertValidForChangedLibrary(a);
_assertInvalid(a, LIBRARY_ERRORS_READY);
_assertValidForDependentLibrary(b);
- _assertInvalid(b, LIBRARY_ERRORS_READY);
- _assertInvalidUnits(b, RESOLVED_UNIT4);
+ _assertValidAllResolution(b);
+ _assertValidAllErrors(b);
// The a.dart's unit and element are the same.
{
LibrarySpecificUnit target = new LibrarySpecificUnit(a, a);
@@ -3612,8 +3646,8 @@ main() {
''');
_performPendingAnalysisTasks();
// Update a.dart: remove A.m, add A.m2.
- // b.dart is invalid, because B extends A.
- // c.dart is invalid, because 'main' references B.
+ // b.dart has valid resolution, and invalid errors.
+ // c.dart is invalid, because 'main' references 'm'.
context.setContents(
a,
r'''
@@ -3625,9 +3659,8 @@ class A {
_assertInvalid(a, LIBRARY_ERRORS_READY);
_assertValidForDependentLibrary(b);
- _assertInvalidLibraryElements(b, LIBRARY_ELEMENT4);
- _assertInvalidUnits(b, RESOLVED_UNIT4);
- _assertInvalid(b, LIBRARY_ERRORS_READY);
+ _assertValidAllResolution(b);
+ _assertInvalidHintsVerifyErrors(b);
_assertValidForDependentLibrary(c);
_assertInvalidLibraryElements(c, LIBRARY_ELEMENT5);
@@ -3675,12 +3708,9 @@ class A {
''');
_assertInvalid(a, LIBRARY_ERRORS_READY);
- // TODO(scheglov) In theory b.dart is not affected, because it does not
- // call A.m, does not override it, etc.
_assertValidForDependentLibrary(b);
- _assertInvalidLibraryElements(b, LIBRARY_ELEMENT4);
- _assertInvalidUnits(b, RESOLVED_UNIT4);
- _assertInvalid(b, LIBRARY_ERRORS_READY);
+ _assertValidAllResolution(b);
+ _assertInvalidHintsVerifyErrors(b);
_assertValidForDependentLibrary(c);
_assertInvalidLibraryElements(c, LIBRARY_ELEMENT5);
@@ -3696,6 +3726,18 @@ class A {
}
/**
+ * Assert that [VERIFY_ERRORS] and other error results that include it,
+ * are invalid.
+ */
+ void _assertInvalidHintsVerifyErrors(Source unit) {
+ _assertUnitInvalid(unit, HINTS);
+ _assertUnitInvalid(unit, VERIFY_ERRORS);
+ _assertUnitInvalid(unit, LIBRARY_UNIT_ERRORS);
+ _assertInvalid(unit, DART_ERRORS);
+ _assertInvalid(unit, LIBRARY_ERRORS_READY);
+ }
+
+ /**
* Assert that [LIBRARY_ELEMENT_RESULTS] for [first] and after it are invalid.
*/
void _assertInvalidLibraryElements(
@@ -3749,6 +3791,18 @@ class A {
reason: '$descriptor in $target');
}
+ /**
+ * Assert that all error results for the given [unit] are valid.
+ */
+ void _assertValidAllErrors(Source unit) {
+ for (ListResultDescriptor<AnalysisError> result in ERROR_SOURCE_RESULTS) {
+ _assertValid(unit, result);
+ }
+ for (ListResultDescriptor<AnalysisError> result in ERROR_UNIT_RESULTS) {
+ _assertUnitValid(unit, result);
+ }
+ }
+
void _assertValidAllLibraryUnitResults(Source source, {Source library}) {
for (ResultDescriptor<LibraryElement> result in LIBRARY_ELEMENT_RESULTS) {
_assertValid(source, result);
@@ -3760,6 +3814,14 @@ class A {
}
}
+ void _assertValidAllResolution(Source unit) {
+ _assertValidUnits(unit, null);
+ _assertUnitValidTaskResults(unit, ResolveUnitTypeNamesTask.DESCRIPTOR);
+ _assertUnitValidTaskResults(unit, ResolveUnitTask.DESCRIPTOR);
+ _assertValidTaskResults(unit, ResolveLibraryReferencesTask.DESCRIPTOR);
+ _assertValidTaskResults(unit, ResolveLibraryTask.DESCRIPTOR);
+ }
+
void _assertValidForAnyLibrary(Source source) {
// Source results.
_assertValidTaskResults(source, ScanDartTask.DESCRIPTOR);
@@ -3793,6 +3855,18 @@ class A {
}
}
+ void _assertValidUnits(Source unit, ResultDescriptor<CompilationUnit> last,
+ {Source library}) {
+ var target = new LibrarySpecificUnit(library ?? unit, unit);
+ bool foundLast = false;
+ for (ResultDescriptor<CompilationUnit> result in RESOLVED_UNIT_RESULTS) {
+ if (!foundLast) {
+ _assertValid(target, result);
+ }
+ foundLast = foundLast || result == last;
+ }
+ }
+
void _performPendingAnalysisTasks([int maxTasks = 512]) {
for (int i = 0; context.performAnalysisTask().hasMoreWork; i++) {
if (i > maxTasks) {
« no previous file with comments | « pkg/analyzer/lib/src/task/dart.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698