|
Groovy Documentation | |||||||
FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.codehaus.groovy.ast.CodeVisitorSupport
org.codehaus.groovy.ast.ClassCodeVisitorSupport
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor
public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport
The main class code visitor responsible for static type checking. It will perform various inspections like checking assignment types, type inference, ... Eventually, class nodes may be annotated with inferred type information.
Nested Class Summary | |
---|---|
protected static interface |
StaticTypeCheckingVisitor.SignatureCodec
|
protected static class |
StaticTypeCheckingVisitor.SignatureCodecFactory
|
Field Summary | |
---|---|
static MethodNode |
CLOSURE_CALL_NO_ARG
|
static MethodNode |
CLOSURE_CALL_ONE_ARG
|
static MethodNode |
CLOSURE_CALL_VARGS
|
Constructor Summary | |
StaticTypeCheckingVisitor(SourceUnit source, ClassNode cn, TypeCheckerPluginFactory pluginFactory)
|
Methods inherited from class java.lang.Object | |
---|---|
java.lang.Object#wait(long), java.lang.Object#wait(long, int), java.lang.Object#wait(), java.lang.Object#equals(java.lang.Object), java.lang.Object#toString(), java.lang.Object#hashCode(), java.lang.Object#getClass(), java.lang.Object#notify(), java.lang.Object#notifyAll() |
Field Detail |
---|
public static final MethodNode CLOSURE_CALL_NO_ARG
public static final MethodNode CLOSURE_CALL_ONE_ARG
public static final MethodNode CLOSURE_CALL_VARGS
Constructor Detail |
---|
public StaticTypeCheckingVisitor(SourceUnit source, ClassNode cn, TypeCheckerPluginFactory pluginFactory)
Method Detail |
---|
doEncode(bound, dos); protected void addError(java.lang.String msg, ASTNode expr)
protected void addStaticTypeError(java.lang.String msg, ASTNode expr)
protected void addTypeCheckingInfoAnnotation(MethodNode node)
protected boolean existsProperty(PropertyExpression pexp, boolean checkForReadOnly, ClassCodeVisitorSupport visitor)
protected MethodNode findMethodOrFail(Expression expr, ClassNode receiver, java.lang.String name, ClassNode... args)
protected SourceUnit getSourceUnit()
errorCollector
- an error collector
protected ClassNode getType(ASTNode exp)
protected ClassNode[] getTypeCheckingAnnotations()
protected boolean hasSetter(PropertyExpression pexp)
protected ClassNode inferComponentType(ClassNode containerType, ClassNode indexType)
public static ClassNode inferLoopElementType(ClassNode collectionType)
public boolean isSkipMode(AnnotatedNode node)
public void performSecondPass()
public void setErrorCollector(ErrorCollector errorCollector)
public void setMethodsToBeVisited(java.util.Set methodsToBeVisited)
protected boolean shouldSkipClassNode(ClassNode node)
protected boolean shouldSkipMethodNode(MethodNode node)
public void visitAttributeExpression(AttributeExpression expression)
&& oldBinaryExpression.getLeftExpression()==expression public void visitBinaryExpression(BinaryExpression expression)
String name = type == PLUS_PLUS ? "next" : type == MINUS_MINUS ? "previous" : null; public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)
ClassNode leftRedirect = left.redirect(); public void visitCastExpression(CastExpression expression)
InnerClassNode innerClassNode = innerClasses.next(); public void visitClass(ClassNode node)
if (vexp.getName().equals("this")) storeType(vexp, classNode); public void visitClassExpression(ClassExpression expression)
protected boolean shouldSkipMethodNode(final MethodNode node) { public void visitClosureExpression(ClosureExpression expression)
// collect every variable expression used in the loop body public void visitConstructorCallExpression(ConstructorCallExpression call)
} protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)
} public void visitField(FieldNode node)
private boolean isSecondPassNeededForControlStructure(final MapvarOrigType, final Map > oldTracker) { public void visitForLoop(ForStatement forLoop)
collectionType
- the type of the collection
} public void visitIfElse(IfStatement ifElse)
public void visitMethod(MethodNode node)
if (data != null) { public void visitMethodCallExpression(MethodCallExpression call)
this.methodNode = node; public void visitPostfixExpression(PostfixExpression expression)
&& !checkCompatibleAssignmentTypes(methodNode.getReturnType(), type) public void visitPrefixExpression(PrefixExpression expression)
if (!existsProperty(expression, true)) { public void visitPropertyExpression(PropertyExpression pexp)
ClassNode rType = getType(rightExpression); public void visitRangeExpression(RangeExpression expression)
MapExpression argList = (MapExpression) expression; public void visitReturnStatement(ReturnStatement statement)
returnType = irtg!=null && implementsInterfaceOrIsSubclassOf(irtg, returnType)?irtg:returnType; public void visitStaticMethodCallExpression(StaticMethodCallExpression call)
} public void visitTernaryExpression(TernaryExpression expression)
if (!isPrimitiveType(leftRedirect) || !isPrimitiveType(rightRedirect)) { public void visitTryCatchFinally(TryCatchStatement statement)
storeType(expression, resultType); public void visitUnaryMinusExpression(UnaryMinusExpression expression)
if (mn != null) { public void visitUnaryPlusExpression(UnaryPlusExpression expression)
} public void visitVariableExpression(VariableExpression vexp)
int type = expression.getOperation().getType(); public void visitWhileLoop(WhileStatement loop)
Groovy Documentation