| 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;
|
|
|