|
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, int), java.lang.Object#wait(long), 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 |
|---|
} else if (WideningCategories.LowestUpperBoundClassNode.class.getSimpleName().equals(classNodeType)) {
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)
// so we use the reversedExpression and get the target method from it public void visitBinaryExpression(BinaryExpression expression)
MethodNode node = findMethodOrFail(inner, exprType, name); public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)
private ClassNode getResultType(ClassNode left, int op, ClassNode right, BinaryExpression expr) {
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)
if (collector != null) {
public void visitClosureExpression(ClosureExpression expression)
SharedVariableCollector collector = new SharedVariableCollector(getSourceUnit()); public void visitConstructorCallExpression(ConstructorCallExpression call)
node = findMethodOrFail(call, receiver, "", args); protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)
if (collectionType.implementsInterface(ITERABLE_TYPE)) {
public void visitField(FieldNode node)
collectionType - the type of the collection
return false; public void visitForLoop(ForStatement forLoop)
public void visitIfElse(IfStatement ifElse)
public void visitMethod(MethodNode node)
if (type == null) {
public void visitMethodCallExpression(MethodCallExpression call)
public void visitPostfixExpression(PostfixExpression expression)
ClassNode previousType = (ClassNode) methodNode.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE); public void visitPrefixExpression(PrefixExpression expression)
if (!existsProperty(expression, true)) {
public void visitPropertyExpression(PropertyExpression pexp)
ClassNode rType = getType(rightExpression); public void visitRangeExpression(RangeExpression expression)
if (arguments instanceof TupleExpression) {
public void visitReturnStatement(ReturnStatement statement)
} public void visitStaticMethodCallExpression(StaticMethodCallExpression call)
} public void visitTernaryExpression(TernaryExpression expression)
return BigDecimal_TYPE; public void visitTryCatchFinally(TryCatchStatement statement)
} else {
public void visitUnaryMinusExpression(UnaryMinusExpression expression)
} else if (typeRe == ArrayList_TYPE) {
public void visitUnaryPlusExpression(UnaryPlusExpression expression)
} public void visitVariableExpression(VariableExpression vexp)
Expression inner = expression.getExpression(); public void visitWhileLoop(WhileStatement loop)
Groovy Documentation