Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/TypeResolverVisitor.java |
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/TypeResolverVisitor.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/TypeResolverVisitor.java |
index b9bd7f5dc24eb94b138085e06e2a00483b123dd8..de06cab7ca979d5d849a46856dd7eb20ee358bd0 100644 |
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/TypeResolverVisitor.java |
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/resolver/TypeResolverVisitor.java |
@@ -37,11 +37,13 @@ import com.google.dart.engine.ast.NodeList; |
import com.google.dart.engine.ast.PrefixedIdentifier; |
import com.google.dart.engine.ast.SimpleFormalParameter; |
import com.google.dart.engine.ast.SimpleIdentifier; |
+import com.google.dart.engine.ast.SuperExpression; |
import com.google.dart.engine.ast.TypeArgumentList; |
import com.google.dart.engine.ast.TypeName; |
import com.google.dart.engine.ast.VariableDeclaration; |
import com.google.dart.engine.ast.VariableDeclarationList; |
import com.google.dart.engine.ast.WithClause; |
+import com.google.dart.engine.ast.visitor.RecursiveASTVisitor; |
import com.google.dart.engine.element.ClassElement; |
import com.google.dart.engine.element.Element; |
import com.google.dart.engine.element.ExecutableElement; |
@@ -174,6 +176,7 @@ public class TypeResolverVisitor extends ScopedVisitor { |
} |
} |
classElement.setSupertype(superclassType); |
+ classElement.setReferencesSuper(isReferencesSuper(node)); |
} |
resolve(classElement, node.getWithClause(), node.getImplementsClause()); |
return null; |
@@ -222,16 +225,6 @@ public class TypeResolverVisitor extends ScopedVisitor { |
return null; |
} |
-// @Override |
-// public Void visitFunctionExpression(FunctionExpression node) { |
-// super.visitFunctionExpression(node); |
-// ExecutableElementImpl element = (ExecutableElementImpl) node.getElement(); |
-// FunctionTypeImpl type = new FunctionTypeImpl(element); |
-// setTypeInformation(type, null, element.getParameters()); |
-// element.setType(type); |
-// return null; |
-// } |
- |
@Override |
public Void visitDefaultFormalParameter(DefaultFormalParameter node) { |
super.visitDefaultFormalParameter(node); |
@@ -249,6 +242,16 @@ public class TypeResolverVisitor extends ScopedVisitor { |
return null; |
} |
+// @Override |
+// public Void visitFunctionExpression(FunctionExpression node) { |
+// super.visitFunctionExpression(node); |
+// ExecutableElementImpl element = (ExecutableElementImpl) node.getElement(); |
+// FunctionTypeImpl type = new FunctionTypeImpl(element); |
+// setTypeInformation(type, null, element.getParameters()); |
+// element.setType(type); |
+// return null; |
+// } |
+ |
@Override |
public Void visitFieldFormalParameter(FieldFormalParameter node) { |
super.visitFieldFormalParameter(node); |
@@ -662,6 +665,21 @@ public class TypeResolverVisitor extends ScopedVisitor { |
} |
/** |
+ * @return {@code true} if the given class declaration references 'super' |
+ */ |
+ private boolean isReferencesSuper(ClassDeclaration node) { |
Brian Wilkerson
2013/05/09 20:41:37
I suspect that it would be more efficient to set a
scheglov
2013/05/09 21:23:50
Done.
|
+ final boolean result[] = {false}; |
+ node.accept(new RecursiveASTVisitor<Void>() { |
+ @Override |
+ public Void visitSuperExpression(SuperExpression node) { |
+ result[0] = true; |
+ return null; |
+ } |
+ }); |
+ return result[0]; |
+ } |
+ |
+ /** |
* Record that the static type of the given node is the given type. |
* |
* @param expression the node whose type is to be recorded |