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

Unified Diff: pkg/analyzer/lib/src/generated/error_verifier.dart

Issue 705553003: Avoid traversing classes when looking for circular references in typedefs. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 1 month 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 | « no previous file | pkg/analyzer/test/generated/compile_time_error_code_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/error_verifier.dart
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index b18332982d33b5c00b25beaad57d2a29e9e0cc22..374e6a3c6f7375b6ad3fe474b075ac5e567c3d54 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -5188,6 +5188,8 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> {
bool _hasTypedefSelfReference(Element target) {
Set<Element> checked = new HashSet<Element>();
List<Element> toCheck = new List<Element>();
+ GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference elementVisitor =
+ new GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(toCheck);
toCheck.add(target);
bool firstIteration = true;
while (true) {
@@ -5213,7 +5215,7 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> {
}
}
// check current element
- current.accept(new GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(target, toCheck));
+ current.accept(elementVisitor);
checked.add(current);
}
}
@@ -5428,35 +5430,15 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> {
}
class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference extends GeneralizingElementVisitor<Object> {
- Element target;
-
List<Element> toCheck;
- GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(this.target, this.toCheck) : super();
-
- bool _inClass = false;
+ GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference(
+ this.toCheck) : super();
@override
Object visitClassElement(ClassElement element) {
- _addTypeToCheck(element.supertype);
- for (InterfaceType mixin in element.mixins) {
- _addTypeToCheck(mixin);
- }
- _inClass = !element.isTypedef;
- try {
- return super.visitClassElement(element);
- } finally {
- _inClass = false;
- }
- }
-
- @override
- Object visitExecutableElement(ExecutableElement element) {
- if (element.isSynthetic) {
- return null;
- }
- _addTypeToCheck(element.returnType);
- return super.visitExecutableElement(element);
+ // Typedefs are allowed to reference themselves via classes.
+ return null;
}
@override
@@ -5477,23 +5459,12 @@ class GeneralizingElementVisitor_ErrorVerifier_hasTypedefSelfReference extends G
return super.visitTypeParameterElement(element);
}
- @override
- Object visitVariableElement(VariableElement element) {
- _addTypeToCheck(element.type);
- return super.visitVariableElement(element);
- }
-
void _addTypeToCheck(DartType type) {
if (type == null) {
return;
}
- Element element = type.element;
- // it is OK to reference target from class
- if (_inClass && target == element) {
- return;
- }
// schedule for checking
- toCheck.add(element);
+ toCheck.add(type.element);
// type arguments
if (type is InterfaceType) {
InterfaceType interfaceType = type;
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/compile_time_error_code_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698