Groovy Documentation

## org.codehaus.groovy.transform.stc
[Java] Class StaticTypeCheckingVisitor

    java.lang.Object
      org.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.

Authors:
  Cedric Champeau
  Jochen Theodorou

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)`

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)`
`protected MethodNode` | `findMethodOrFail(Expression expr, ClassNode receiver, java.lang.String name, ClassNode... args)`
`protected SourceUnit` | `getSourceUnit()` Sets an alternative error collector.
`protected ClassNode` | `getType(ASTNode exp)`
`protected ClassNode[]` | `getTypeCheckingAnnotations()`
`protected boolean` | `hasSetter(PropertyExpression pexp)`
`protected ClassNode` | `inferComponentType(ClassNode containerType, ClassNode indexType)`
`static ClassNode` | `inferLoopElementType(ClassNode collectionType)`
`boolean` | `isSkipMode(AnnotatedNode node)`
`void` | `performSecondPass()`
`void` | `setErrorCollector(ErrorCollector errorCollector)`
`void` | `setMethodsToBeVisited(java.util.Set 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)`
`void` | `visitClassExpression(ClassExpression expression)`
`void` | `visitClosureExpression(ClosureExpression expression)`
`void` | `visitConstructorCallExpression(ConstructorCallExpression call)`
`protected void` | `visitConstructorOrMethod(MethodNode node, boolean isConstructor)`
`void` | `visitField(FieldNode node)`
`void` | `visitForLoop(ForStatement forLoop)` Given a loop collection type, returns the inferred type of the loop element.
`void` | `visitIfElse(IfStatement ifElse)`
`void` | `visitMethod(MethodNode node)`
`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 ClassCodeVisitorSupport

addError, getSourceUnit, visitAnnotations, visitAssertStatement, visitBlockStatement, visitBreakStatement, visitCaseStatement, visitCatchStatement, visitClass, visitClassCodeContainer, visitConstructor, visitConstructorOrMethod, visitContinueStatement, visitDeclarationExpression, visitDoWhileLoop, visitExpressionStatement, visitField, visitForLoop, visitIfElse, visitImports, visitMethod, visitObjectInitializerStatements, visitPackage, visitProperty, visitReturnStatement, visitStatement, visitSwitch, visitSynchronizedStatement, visitThrowStatement, visitTryCatchFinally, visitWhileLoop

Methods inherited from class CodeVisitorSupport

visitArgumentlistExpression, visitArrayExpression, visitAssertStatement, visitAttributeExpression, visitBinaryExpression, visitBitwiseNegationExpression, visitBlockStatement, visitBooleanExpression, visitBreakStatement, visitBytecodeExpression, visitCaseStatement, visitCastExpression, visitCatchStatement, visitClassExpression, visitClosureExpression, visitClosureListExpression, visitConstantExpression, visitConstructorCallExpression, visitContinueStatement, visitDeclarationExpression, visitDoWhileLoop, visitEmptyStatement, visitExpressionStatement, visitFieldExpression, visitForLoop, visitGStringExpression, visitIfElse, visitListExpression, visitListOfExpressions, visitMapEntryExpression, visitMapExpression, visitMethodCallExpression, visitMethodPointerExpression, visitNotExpression, visitPostfixExpression, visitPrefixExpression, visitPropertyExpression, visitRangeExpression, visitReturnStatement, visitShortTernaryExpression, visitSpreadExpression, visitSpreadMapExpression, visitStaticMethodCallExpression, visitSwitch, visitSynchronizedStatement, visitTernaryExpression, visitThrowStatement, visitTryCatchFinally, visitTupleExpression, visitUnaryMinusExpression, visitUnaryPlusExpression, visitVariableExpression, visitWhileLoop

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

### 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

Constructor Detail

### StaticTypeCheckingVisitor

    public StaticTypeCheckingVisitor(SourceUnit source, ClassNode cn, TypeCheckerPluginFactory pluginFactory)

Method Detail

### addError

    doEncode(bound, dos);
    protected void addError(java.lang.String msg, ASTNode expr)

### addStaticTypeError

    protected void addStaticTypeError(java.lang.String msg, ASTNode expr)

### addTypeCheckingInfoAnnotation

    protected void addTypeCheckingInfoAnnotation(MethodNode node)

### existsProperty

    protected boolean existsProperty(PropertyExpression pexp, boolean checkForReadOnly, ClassCodeVisitorSupport visitor)

### findMethodOrFail

    protected MethodNode findMethodOrFail(Expression expr, ClassNode receiver, java.lang.String name, ClassNode... args)

### getSourceUnit

    protected SourceUnit getSourceUnit()

  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

### getType

    protected ClassNode getType(ASTNode exp)

### getTypeCheckingAnnotations

    protected ClassNode[] getTypeCheckingAnnotations()

### hasSetter

    protected boolean hasSetter(PropertyExpression pexp)

### inferComponentType

    protected ClassNode inferComponentType(ClassNode containerType, ClassNode indexType)

### inferLoopElementType

    public static ClassNode inferLoopElementType(ClassNode collectionType)

### isSkipMode

    public boolean isSkipMode(AnnotatedNode node)

### performSecondPass

    public void performSecondPass()

### setErrorCollector

    public void setErrorCollector(ErrorCollector errorCollector)

### setMethodsToBeVisited

    public void setMethodsToBeVisited(java.util.Set methodsToBeVisited)

### shouldSkipClassNode

    protected boolean shouldSkipClassNode(ClassNode node)

### shouldSkipMethodNode

    protected boolean shouldSkipMethodNode(MethodNode node)

### visitAttributeExpression

    public void visitAttributeExpression(AttributeExpression expression)

### visitBinaryExpression

    && oldBinaryExpression.getLeftExpression()==expression
    public void visitBinaryExpression(BinaryExpression expression)

### visitBitwiseNegationExpression

    String name = type == PLUS_PLUS ? "next" : type == MINUS_MINUS ? "previous" : null;
    public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)

### visitCastExpression

    ClassNode leftRedirect = left.redirect();
    public void visitCastExpression(CastExpression expression)

### visitClass

    InnerClassNode innerClassNode = innerClasses.next();
    public void visitClass(ClassNode node)

### visitClassExpression

    if (vexp.getName().equals("this")) storeType(vexp, classNode);
    public void visitClassExpression(ClassExpression expression)

### visitClosureExpression

    protected boolean shouldSkipMethodNode(final MethodNode node) {
    public void visitClosureExpression(ClosureExpression expression)

### visitConstructorCallExpression

    // collect every variable expression used in the loop body
    public void visitConstructorCallExpression(ConstructorCallExpression call)

### visitConstructorOrMethod

    }
    protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)

### visitField

    }
    public void visitField(FieldNode node)

### visitForLoop

    private boolean isSecondPassNeededForControlStructure(final Map<VariableExpression, ClassNode> varOrigType, final Map<VariableExpression, List<ClassNode>> oldTracker) {
    public void visitForLoop(ForStatement forLoop)

  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

### visitIfElse

    }
    public void visitIfElse(IfStatement ifElse)

### visitMethod

    public void visitMethod(MethodNode node)

### visitMethodCallExpression

    if (data != null) {
    public void visitMethodCallExpression(MethodCallExpression call)

### visitPostfixExpression

    this.methodNode = node;
    public void visitPostfixExpression(PostfixExpression expression)

### visitPrefixExpression

    && !checkCompatibleAssignmentTypes(methodNode.getReturnType(), type)
    public void visitPrefixExpression(PrefixExpression expression)

### visitPropertyExpression

    if (!existsProperty(expression, true)) {
    public void visitPropertyExpression(PropertyExpression pexp)

### visitRangeExpression

    ClassNode rType = getType(rightExpression);
    public void visitRangeExpression(RangeExpression expression)

### visitReturnStatement

    MapExpression argList = (MapExpression) expression;
    public void visitReturnStatement(ReturnStatement statement)

### visitStaticMethodCallExpression

    returnType = irtg!=null && implementsInterfaceOrIsSubclassOf(irtg, returnType)?irtg:returnType;
    public void visitStaticMethodCallExpression(StaticMethodCallExpression call)

### visitTernaryExpression

    }
    public void visitTernaryExpression(TernaryExpression expression)

### visitTryCatchFinally

    if (!isPrimitiveType(leftRedirect) || !isPrimitiveType(rightRedirect)) {
    public void visitTryCatchFinally(TryCatchStatement statement)

### visitUnaryMinusExpression

    storeType(expression, resultType);
    public void visitUnaryMinusExpression(UnaryMinusExpression expression)

### visitUnaryPlusExpression

    if (mn != null) {
    public void visitUnaryPlusExpression(UnaryPlusExpression expression)

### visitVariableExpression

    }
    public void visitVariableExpression(VariableExpression vexp)

### visitWhileLoop

    int type = expression.getOperation().getType();
    public void visitWhileLoop(WhileStatement loop)

Groovy Documentation