org.codehaus.groovy.transform.stc
Class StaticTypeCheckingVisitor
java.lang.Object
org.codehaus.groovy.ast.CodeVisitorSupport
org.codehaus.groovy.ast.ClassCodeVisitorSupport
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor
- All Implemented Interfaces:
- GroovyClassVisitor, GroovyCodeVisitor
- Direct Known Subclasses:
- StaticCompilationVisitor
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.
|
Method Summary |
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)
Checks whether a property exists on the receiver, or on any of the possible receiver classes (found in the
temporary type information table) |
protected MethodNode |
findMethodOrFail(Expression expr,
ClassNode receiver,
java.lang.String name,
ClassNode... args)
|
protected SourceUnit |
getSourceUnit()
|
protected ClassNode |
getType(ASTNode exp)
|
protected ClassNode[] |
getTypeCheckingAnnotations()
Returns the list of type checking annotations class nodes. |
protected boolean |
hasSetter(PropertyExpression pexp)
|
protected ClassNode |
inferComponentType(ClassNode containerType,
ClassNode indexType)
|
static ClassNode |
inferLoopElementType(ClassNode collectionType)
Given a loop collection type, returns the inferred type of the loop element. |
boolean |
isSkipMode(AnnotatedNode node)
|
void |
performSecondPass()
|
void |
setErrorCollector(ErrorCollector errorCollector)
Sets an alternative error collector. |
void |
setMethodsToBeVisited(java.util.Set<MethodNode> methodsToBeVisited)
|
protected boolean |
shouldSkipClassNode(ClassNode node)
|
protected boolean |
shouldSkipMethodNode(MethodNode node)
|
void |
visitAttributeExpression(AttributeExpression expression)
|
void |
visitBinaryExpression(BinaryExpression expression)
|
void |
visitBitwiseNegationExpression(BitwiseNegationExpression expression)
|
void |
visitCastExpression(CastExpression expression)
|
void |
visitClass(ClassNode node)
Visit a ClassNode. |
void |
visitClassExpression(ClassExpression expression)
|
void |
visitClosureExpression(ClosureExpression expression)
|
void |
visitConstructorCallExpression(ConstructorCallExpression call)
|
protected void |
visitConstructorOrMethod(MethodNode node,
boolean isConstructor)
|
void |
visitField(FieldNode node)
Visit a FieldNode. |
void |
visitForLoop(ForStatement forLoop)
|
void |
visitIfElse(IfStatement ifElse)
|
void |
visitMethod(MethodNode node)
Visit a MethodNode. |
void |
visitMethodCallExpression(MethodCallExpression call)
|
void |
visitPostfixExpression(PostfixExpression expression)
|
void |
visitPrefixExpression(PrefixExpression expression)
|
void |
visitPropertyExpression(PropertyExpression pexp)
|
void |
visitRangeExpression(RangeExpression expression)
|
void |
visitReturnStatement(ReturnStatement statement)
|
void |
visitStaticMethodCallExpression(StaticMethodCallExpression call)
|
void |
visitTernaryExpression(TernaryExpression expression)
|
void |
visitTryCatchFinally(TryCatchStatement statement)
|
void |
visitUnaryMinusExpression(UnaryMinusExpression expression)
|
void |
visitUnaryPlusExpression(UnaryPlusExpression expression)
|
void |
visitVariableExpression(VariableExpression vexp)
|
void |
visitWhileLoop(WhileStatement loop)
|
| Methods inherited from class org.codehaus.groovy.ast.ClassCodeVisitorSupport |
visitAnnotations, visitAssertStatement, visitBlockStatement, visitBreakStatement, visitCaseStatement, visitCatchStatement, visitClassCodeContainer, visitConstructor, visitContinueStatement, visitDeclarationExpression, visitDoWhileLoop, visitExpressionStatement, visitImports, visitObjectInitializerStatements, visitPackage, visitProperty, visitStatement, visitSwitch, visitSynchronizedStatement, visitThrowStatement |
| Methods inherited from class org.codehaus.groovy.ast.CodeVisitorSupport |
visitArgumentlistExpression, visitArrayExpression, visitBooleanExpression, visitBytecodeExpression, visitClosureListExpression, visitConstantExpression, visitEmptyStatement, visitFieldExpression, visitGStringExpression, visitListExpression, visitListOfExpressions, visitMapEntryExpression, visitMapExpression, visitMethodPointerExpression, visitNotExpression, visitShortTernaryExpression, visitSpreadExpression, visitSpreadMapExpression, visitTupleExpression |
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
CLOSURE_CALL_NO_ARG
public static final MethodNode CLOSURE_CALL_NO_ARG
CLOSURE_CALL_ONE_ARG
public static final MethodNode CLOSURE_CALL_ONE_ARG
CLOSURE_CALL_VARGS
public static final MethodNode CLOSURE_CALL_VARGS
StaticTypeCheckingVisitor
public StaticTypeCheckingVisitor(SourceUnit source,
ClassNode cn,
TypeCheckerPluginFactory pluginFactory)
getSourceUnit
protected SourceUnit getSourceUnit()
- Specified by:
getSourceUnit in class ClassCodeVisitorSupport
setErrorCollector
public void setErrorCollector(ErrorCollector errorCollector)
- Sets an alternative error collector. This can be useful when you want to run static
type checking "silently", for example, without failing if errors are found.
- Parameters:
errorCollector - an error collector
visitClass
public void visitClass(ClassNode node)
- Description copied from interface:
GroovyClassVisitor
- Visit a ClassNode.
- Specified by:
visitClass in interface GroovyClassVisitor- Overrides:
visitClass in class ClassCodeVisitorSupport
shouldSkipClassNode
protected boolean shouldSkipClassNode(ClassNode node)
getTypeCheckingAnnotations
protected ClassNode[] getTypeCheckingAnnotations()
- Returns the list of type checking annotations class nodes. Subclasses may override this method
in order to provide additional classes which must be looked up when checking if a method or
a class node should be skipped.
The default implementation returns
TypeChecked.
- Returns:
- array of class nodes
isSkipMode
public boolean isSkipMode(AnnotatedNode node)
visitClassExpression
public void visitClassExpression(ClassExpression expression)
- Specified by:
visitClassExpression in interface GroovyCodeVisitor- Overrides:
visitClassExpression in class CodeVisitorSupport
visitVariableExpression
public void visitVariableExpression(VariableExpression vexp)
- Specified by:
visitVariableExpression in interface GroovyCodeVisitor- Overrides:
visitVariableExpression in class CodeVisitorSupport
visitPropertyExpression
public void visitPropertyExpression(PropertyExpression pexp)
- Specified by:
visitPropertyExpression in interface GroovyCodeVisitor- Overrides:
visitPropertyExpression in class CodeVisitorSupport
visitAttributeExpression
public void visitAttributeExpression(AttributeExpression expression)
- Specified by:
visitAttributeExpression in interface GroovyCodeVisitor- Overrides:
visitAttributeExpression in class CodeVisitorSupport
visitRangeExpression
public void visitRangeExpression(RangeExpression expression)
- Specified by:
visitRangeExpression in interface GroovyCodeVisitor- Overrides:
visitRangeExpression in class CodeVisitorSupport
visitBinaryExpression
public void visitBinaryExpression(BinaryExpression expression)
- Specified by:
visitBinaryExpression in interface GroovyCodeVisitor- Overrides:
visitBinaryExpression in class CodeVisitorSupport
existsProperty
protected boolean existsProperty(PropertyExpression pexp,
boolean checkForReadOnly,
ClassCodeVisitorSupport visitor)
- Checks whether a property exists on the receiver, or on any of the possible receiver classes (found in the
temporary type information table)
- Parameters:
pexp - a property expressioncheckForReadOnly - also lookup for read only propertiesvisitor - if not null, when the property node is found, visit it with the provided visitor
- Returns:
- true if the property is defined in any of the possible receiver classes
hasSetter
protected boolean hasSetter(PropertyExpression pexp)
visitField
public void visitField(FieldNode node)
- Description copied from interface:
GroovyClassVisitor
- Visit a FieldNode.
- Specified by:
visitField in interface GroovyClassVisitor- Overrides:
visitField in class ClassCodeVisitorSupport
visitForLoop
public void visitForLoop(ForStatement forLoop)
- Specified by:
visitForLoop in interface GroovyCodeVisitor- Overrides:
visitForLoop in class ClassCodeVisitorSupport
inferLoopElementType
public static ClassNode inferLoopElementType(ClassNode collectionType)
- Given a loop collection type, returns the inferred type of the loop element. Used, for
example, to infer the element type of a (for e in list) loop.
- Parameters:
collectionType - the type of the collection
- Returns:
- the inferred component type
visitWhileLoop
public void visitWhileLoop(WhileStatement loop)
- Specified by:
visitWhileLoop in interface GroovyCodeVisitor- Overrides:
visitWhileLoop in class ClassCodeVisitorSupport
visitBitwiseNegationExpression
public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)
- Specified by:
visitBitwiseNegationExpression in interface GroovyCodeVisitor- Overrides:
visitBitwiseNegationExpression in class CodeVisitorSupport
visitUnaryPlusExpression
public void visitUnaryPlusExpression(UnaryPlusExpression expression)
- Specified by:
visitUnaryPlusExpression in interface GroovyCodeVisitor- Overrides:
visitUnaryPlusExpression in class CodeVisitorSupport
visitUnaryMinusExpression
public void visitUnaryMinusExpression(UnaryMinusExpression expression)
- Specified by:
visitUnaryMinusExpression in interface GroovyCodeVisitor- Overrides:
visitUnaryMinusExpression in class CodeVisitorSupport
visitPostfixExpression
public void visitPostfixExpression(PostfixExpression expression)
- Specified by:
visitPostfixExpression in interface GroovyCodeVisitor- Overrides:
visitPostfixExpression in class CodeVisitorSupport
visitPrefixExpression
public void visitPrefixExpression(PrefixExpression expression)
- Specified by:
visitPrefixExpression in interface GroovyCodeVisitor- Overrides:
visitPrefixExpression in class CodeVisitorSupport
visitConstructorOrMethod
protected void visitConstructorOrMethod(MethodNode node,
boolean isConstructor)
- Overrides:
visitConstructorOrMethod in class ClassCodeVisitorSupport
visitReturnStatement
public void visitReturnStatement(ReturnStatement statement)
- Specified by:
visitReturnStatement in interface GroovyCodeVisitor- Overrides:
visitReturnStatement in class ClassCodeVisitorSupport
visitConstructorCallExpression
public void visitConstructorCallExpression(ConstructorCallExpression call)
- Specified by:
visitConstructorCallExpression in interface GroovyCodeVisitor- Overrides:
visitConstructorCallExpression in class CodeVisitorSupport
visitClosureExpression
public void visitClosureExpression(ClosureExpression expression)
- Specified by:
visitClosureExpression in interface GroovyCodeVisitor- Overrides:
visitClosureExpression in class CodeVisitorSupport
shouldSkipMethodNode
protected boolean shouldSkipMethodNode(MethodNode node)
visitMethod
public void visitMethod(MethodNode node)
- Description copied from interface:
GroovyClassVisitor
- Visit a MethodNode.
- Specified by:
visitMethod in interface GroovyClassVisitor- Overrides:
visitMethod in class ClassCodeVisitorSupport
addTypeCheckingInfoAnnotation
protected void addTypeCheckingInfoAnnotation(MethodNode node)
visitStaticMethodCallExpression
public void visitStaticMethodCallExpression(StaticMethodCallExpression call)
- Specified by:
visitStaticMethodCallExpression in interface GroovyCodeVisitor- Overrides:
visitStaticMethodCallExpression in class CodeVisitorSupport
visitMethodCallExpression
public void visitMethodCallExpression(MethodCallExpression call)
- Specified by:
visitMethodCallExpression in interface GroovyCodeVisitor- Overrides:
visitMethodCallExpression in class CodeVisitorSupport
visitIfElse
public void visitIfElse(IfStatement ifElse)
- Specified by:
visitIfElse in interface GroovyCodeVisitor- Overrides:
visitIfElse in class ClassCodeVisitorSupport
visitCastExpression
public void visitCastExpression(CastExpression expression)
- Specified by:
visitCastExpression in interface GroovyCodeVisitor- Overrides:
visitCastExpression in class CodeVisitorSupport
visitTernaryExpression
public void visitTernaryExpression(TernaryExpression expression)
- Specified by:
visitTernaryExpression in interface GroovyCodeVisitor- Overrides:
visitTernaryExpression in class CodeVisitorSupport
visitTryCatchFinally
public void visitTryCatchFinally(TryCatchStatement statement)
- Specified by:
visitTryCatchFinally in interface GroovyCodeVisitor- Overrides:
visitTryCatchFinally in class ClassCodeVisitorSupport
inferComponentType
protected ClassNode inferComponentType(ClassNode containerType,
ClassNode indexType)
findMethodOrFail
protected MethodNode findMethodOrFail(Expression expr,
ClassNode receiver,
java.lang.String name,
ClassNode... args)
getType
protected ClassNode getType(ASTNode exp)
addError
protected void addError(java.lang.String msg,
ASTNode expr)
- Overrides:
addError in class ClassCodeVisitorSupport
addStaticTypeError
protected void addStaticTypeError(java.lang.String msg,
ASTNode expr)
setMethodsToBeVisited
public void setMethodsToBeVisited(java.util.Set<MethodNode> methodsToBeVisited)
performSecondPass
public void performSecondPass()