|
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 |
---|
return encoded; 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)
// unchecked assignment public void visitBinaryExpression(BinaryExpression expression)
} public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)
// is an empty list expression ([]). In that case and only in that case, the inferred type public void visitCastExpression(CastExpression expression)
classNode = node; public void visitClass(ClassNode node)
if (vexp.getName().equals("this")) storeType(vexp, classNode); public void visitClassExpression(ClassExpression expression)
return; public void visitClosureExpression(ClosureExpression expression)
Map> oldTracker = pushAssignmentTracking(); public void visitConstructorCallExpression(ConstructorCallExpression call)
} protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)
public static ClassNode inferLoopElementType(final ClassNode collectionType) { public void visitField(FieldNode node)
collectionType
- the type of the collection
} public void visitForLoop(ForStatement forLoop)
storeType(exp, getOriginalDeclarationType(exp)); public void visitIfElse(IfStatement ifElse)
public void visitMethod(MethodNode node)
typeCheckClosureCall(callArguments, args, parameters); public void visitMethodCallExpression(MethodCallExpression call)
} public void visitPostfixExpression(PostfixExpression expression)
&& !(isNullConstant(expression))) { public void visitPrefixExpression(PrefixExpression expression)
if (!existsProperty(expression, true)) { public void visitPropertyExpression(PropertyExpression pexp)
ClassNode rType = getType(rightExpression); public void visitRangeExpression(RangeExpression expression)
private MethodNode typeCheckMapConstructor(final ConstructorCallExpression call, final ClassNode receiver, final Expression arguments) { public void visitReturnStatement(ReturnStatement statement)
} else { public void visitStaticMethodCallExpression(StaticMethodCallExpression call)
if (isIntCategory(leftRedirect) && isIntCategory(rightRedirect)) return int_TYPE; public void visitTernaryExpression(TernaryExpression expression)
if (DIVIDE == op) { public void visitTryCatchFinally(TryCatchStatement statement)
MethodNode mn = findMethodOrFail(expression, type, name); public void visitUnaryMinusExpression(UnaryMinusExpression expression)
ClassNode resultType; public void visitUnaryPlusExpression(UnaryPlusExpression expression)
} public void visitVariableExpression(VariableExpression vexp)
String name = type == PLUS_PLUS ? "next" : type == MINUS_MINUS ? "previous" : null; public void visitWhileLoop(WhileStatement loop)
Groovy Documentation