Groovy 2.0.0-rc-2

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(String msg, ASTNode expr)

protected void addStaticTypeError(String msg, ASTNode expr)

protected void addTypeCheckingInfoAnnotation(MethodNode node)

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

protected SourceUnit getSourceUnit()

protected ClassNode getType(ASTNode exp)

protected ClassNode[] getTypeCheckingAnnotations()

Returns the list of type checking annotations class nodes.

static ClassNode inferLoopElementType(ClassNode collectionType)

boolean isSkipMode(AnnotatedNode node)

void performSecondPass()

void setErrorCollector(ErrorCollector errorCollector)

void setMethodsToBeVisited(Set methodsToBeVisited)

protected boolean shouldSkipClassNode(ClassNode 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 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 Object
wait, wait, wait, equals, toString, hashCode, getClass, notify, 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

} else {
protected void addError(String msg, ASTNode expr)


addStaticTypeError

protected void addStaticTypeError(String msg, ASTNode expr)


addTypeCheckingInfoAnnotation

protected void addTypeCheckingInfoAnnotation(MethodNode node)


findMethodOrFail

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


getSourceUnit

protected SourceUnit getSourceUnit()


getType

protected ClassNode getType(ASTNode exp)


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


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(Set methodsToBeVisited)


shouldSkipClassNode

protected boolean shouldSkipClassNode(ClassNode node)


visitAttributeExpression

if (Integer_TYPE.equals(fromType) && Integer_TYPE.equals(toType)) {
public void visitAttributeExpression(AttributeExpression expression)


visitBinaryExpression

}
public void visitBinaryExpression(BinaryExpression expression)


visitBitwiseNegationExpression

storeTargetMethod(expression, node);
public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)


visitCastExpression

// is an empty list expression ([]). In that case and only in that case, the inferred type
public void visitCastExpression(CastExpression expression)


visitClass

Iterator innerClasses = classNode.getInnerClasses();
public void visitClass(ClassNode node)


visitClassExpression

public void visitVariableExpression(VariableExpression vexp) {
public void visitClassExpression(ClassExpression expression)


visitClosureExpression

private void saveVariableExpressionMetadata(final Set closureSharedExpressions, final Map typesBeforeVisit) {
public void visitClosureExpression(ClosureExpression expression)


visitConstructorCallExpression

@Override
public void visitConstructorCallExpression(ConstructorCallExpression call)


visitConstructorOrMethod

if (node != null) {
protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)


visitField

super.visitForLoop(forLoop);
public void visitField(FieldNode node)


visitForLoop

componentType = genericsTypes[0].getType();
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

storeType(exp, getOriginalDeclarationType(exp));
public void visitIfElse(IfStatement ifElse)


visitMethod

}
public void visitMethod(MethodNode node)


visitMethodCallExpression

public void visitMethodCallExpression(MethodCallExpression call)


visitPostfixExpression

} else if (typeRe == ArrayList_TYPE) {
public void visitPostfixExpression(PostfixExpression expression)


visitPrefixExpression

@Override
public void visitPrefixExpression(PrefixExpression expression)


visitPropertyExpression

addStaticTypeError("No such property: " + expression.getPropertyAsString() +
public void visitPropertyExpression(PropertyExpression pexp)


visitRangeExpression

final Expression leftExpression = expression.getLeftExpression();
public void visitRangeExpression(RangeExpression expression)


visitReturnStatement

node.setDeclaringClass(receiver);
public void visitReturnStatement(ReturnStatement statement)


visitStaticMethodCallExpression

addStaticTypeError("Cannot find matching method " + receiver.getText() + "#" + toMethodParametersString(name, args), call);
public void visitStaticMethodCallExpression(StaticMethodCallExpression call)


visitTernaryExpression

if (isDouble(leftRedirect) && isDouble(rightRedirect)) return double_TYPE;
public void visitTernaryExpression(TernaryExpression expression)


visitUnaryMinusExpression

private void negativeOrPositiveUnary(Expression expression, String name) {
public void visitUnaryMinusExpression(UnaryMinusExpression expression)


visitUnaryPlusExpression

MethodNode node = findMethodOrFail(inner, exprType, name);
public void visitUnaryPlusExpression(UnaryPlusExpression expression)


visitVariableExpression

// or a member of a class used in a 'with'
public void visitVariableExpression(VariableExpression vexp)


visitWhileLoop

String name = type == PLUS_PLUS ? "next" : type == MINUS_MINUS ? "previous" : null;
public void visitWhileLoop(WhileStatement loop)


 

Copyright © 2003-2012 The Codehaus. All rights reserved.