|
Groovy 2.1.0-beta-1 | |||||||
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 | |
---|---|
static class |
StaticTypeCheckingVisitor.SignatureCodecFactory
|
protected class |
StaticTypeCheckingVisitor.VariableExpressionTypeMemoizer
|
Field Summary | |
---|---|
static MethodNode |
CLOSURE_CALL_NO_ARG
|
static MethodNode |
CLOSURE_CALL_ONE_ARG
|
static MethodNode |
CLOSURE_CALL_VARGS
|
protected static Expression |
CURRENT_SIGNATURE_PROTOCOL
|
protected static int |
CURRENT_SIGNATURE_PROTOCOL_VERSION
|
protected static ClassNode |
DELEGATES_TO
|
protected static ClassNode |
DELEGATES_TO_TARGET
|
protected static ClassNode |
DGM_CLASSNODE
|
protected static List |
EMPTY_METHODNODE_LIST
|
protected static Object |
ERROR_COLLECTOR
|
protected static MethodNode |
GET_DELEGATE
|
protected static MethodNode |
GET_OWNER
|
protected static MethodNode |
GET_THISOBJECT
|
protected static ClassNode |
ITERABLE_TYPE
|
protected static ClassNode |
TYPECHECKED_CLASSNODE
|
protected static ClassNode[] |
TYPECHECKING_ANNOTATIONS
|
protected static ClassNode |
TYPECHECKING_INFO_NODE
|
protected DefaultTypeCheckingExtension |
extension
|
protected ReturnAdder |
returnAdder
|
protected ReturnStatementListener |
returnListener
|
protected TypeCheckingContext |
typeCheckingContext
|
Constructor Summary | |
StaticTypeCheckingVisitor(SourceUnit source, ClassNode cn)
|
Methods inherited from class Object | |
---|---|
wait, wait, wait, equals, toString, hashCode, getClass, notify, 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
protected static final Expression CURRENT_SIGNATURE_PROTOCOL
protected static final int CURRENT_SIGNATURE_PROTOCOL_VERSION
protected static final ClassNode DELEGATES_TO
protected static final ClassNode DELEGATES_TO_TARGET
protected static final ClassNode DGM_CLASSNODE
protected static final List EMPTY_METHODNODE_LIST
protected static final Object ERROR_COLLECTOR
protected static final MethodNode GET_DELEGATE
protected static final MethodNode GET_OWNER
protected static final MethodNode GET_THISOBJECT
protected static final ClassNode ITERABLE_TYPE
protected static final ClassNode TYPECHECKED_CLASSNODE
protected static final ClassNode[] TYPECHECKING_ANNOTATIONS
protected static final ClassNode TYPECHECKING_INFO_NODE
protected DefaultTypeCheckingExtension extension
protected final ReturnAdder returnAdder
protected final ReturnStatementListener returnListener
protected TypeCheckingContext typeCheckingContext
Constructor Detail |
---|
public StaticTypeCheckingVisitor(SourceUnit source, ClassNode cn)
Method Detail |
---|
protected void addAmbiguousErrorMessage(List foundMethods, String name, ClassNode[] args, Expression expr)
protected void addAssignmentError(ClassNode leftType, ClassNode rightType, Expression assignmentExpression)
protected void addCategoryMethodCallError(Expression call)
protected void addClosureReturnType(ClassNode returnType)
protected void addError(String msg, ASTNode expr)
protected void addNoMatchingMethodError(ClassNode receiver, String name, ClassNode[] args, Expression call)
protected void addReceivers(List receivers, Collection owners, boolean implicitThis)
protected void addStaticTypeError(String msg, ASTNode expr)
public void addTypeCheckingExtension(TypeCheckingExtension extension)
protected void addTypeCheckingInfoAnnotation(MethodNode node)
protected void addUnsupportedPreOrPostfixExpressionError(Expression expression)
protected boolean areCategoryMethodCalls(List foundMethods, String name, ClassNode[] args)
protected boolean checkCast(ClassNode targetType, Expression source)
protected void checkClosureParameters(Expression callArguments, ClassNode receiver)
protected void checkForbiddenSpreadArgument(ArgumentListExpression argumentList)
protected void checkGroovyConstructorMap(Expression receiver, ClassNode receiverType, MapExpression mapExpression)
node
- the class node for which we will try to find a matching constructorarguments
- the constructor arguments
protected void checkGroovyStyleConstructor(ClassNode node, ClassNode[] arguments)
protected ClassNode checkReturnType(ReturnStatement statement)
protected void collectAllInterfaceMethodsByName(ClassNode receiver, String name, List methods)
protected boolean existsProperty(PropertyExpression pexp, boolean checkForReadOnly)
protected boolean existsProperty(PropertyExpression pexp, boolean checkForReadOnly, ClassCodeVisitorSupport visitor)
protected Object extractTemporaryTypeInfoKey(Expression expression)
protected static ClassNode[] extractTypesFromParameters(Parameter[] parameters)
protected ClassNode findCurrentInstanceOfClass(Expression expr, ClassNode type)
protected List findMethod(ClassNode receiver, String name, ClassNode... args)
protected MethodNode findMethodOrFail(Expression expr, ClassNode receiver, String name, ClassNode... args)
protected static String formatArgumentList(ClassNode[] nodes)
protected static GenericsType fullyResolve(GenericsType gt, Map placeholders)
protected static ClassNode fullyResolveType(ClassNode type, Map placeholders)
protected ClassNode[] getArgumentTypes(ArgumentListExpression args)
protected DelegationMetadata getDelegationMetadata(ClosureExpression expression)
protected static ClassNode getGroupOperationResultType(ClassNode a, ClassNode b)
protected ClassNode getOriginalDeclarationType(Expression lhs)
protected ClassNode getResultType(ClassNode left, int op, ClassNode right, BinaryExpression expr)
protected SourceUnit getSourceUnit()
protected List getTemporaryTypesForExpression(Expression objectExpression)
protected ClassNode getType(ASTNode exp)
protected ClassNode[] getTypeCheckingAnnotations()
public TypeCheckingContext getTypeCheckingContext()
protected static boolean hasRHSIncompleteGenericTypeInfo(ClassNode inferredRightExpressionType)
expression
- the expression for which to compute the key
protected boolean hasSetter(PropertyExpression pexp)
protected ClassNode inferComponentType(ClassNode containerType, ClassNode indexType)
protected void inferDiamondType(ConstructorCallExpression cce, ClassNode lType)
protected ClassNode inferListExpressionType(ListExpression list)
public static ClassNode inferLoopElementType(ClassNode collectionType)
protected ClassNode inferMapExpressionType(MapExpression map)
protected ClassNode inferReturnTypeGenerics(ClassNode receiver, MethodNode method, Expression arguments)
parameterType
- the parameter type of a methodargumentType
- the type of the argument passed to the method
public void initialize()
protected static boolean isClassInnerClassOrEqualTo(ClassNode toBeChecked, ClassNode start)
protected boolean isClosureCall(String name, Expression objectExpression, Expression arguments)
protected static boolean isNullConstant(Expression expression)
protected boolean isSecondPassNeededForControlStructure(Map varOrigType, Map oldTracker)
public boolean isSkipMode(AnnotatedNode node)
protected List makeOwnerList(Expression objectExpression)
objectExpression
- the receiver expression
public void performSecondPass()
protected void pickInferredTypeFromMethodAnnotation(MethodNode node)
protected Map popAssignmentTracking(Map oldTracker)
protected static String prettyPrintMethodList(List nodes)
protected Map pushAssignmentTracking()
protected void pushInstanceOfTypeInfo(Expression objectOfInstanceOf, Expression typeExpression)
objectOfInstanceOf
- the expression which must be checked against instanceoftypeExpression
- the expression which represents the target type
protected void restoreVariableExpressionMetadata(Map typesBeforeVisit)
protected void saveVariableExpressionMetadata(Set closureSharedExpressions, Map typesBeforeVisit)
public void setMethodsToBeVisited(Set methodsToBeVisited)
protected boolean shouldSkipClassNode(ClassNode node)
protected boolean shouldSkipMethodNode(MethodNode node)
protected void silentlyVisitMethodNode(MethodNode directMethodCallCandidate)
protected void startMethodInference(MethodNode node, ErrorCollector collector)
protected void storeInferredTypeForPropertyExpression(PropertyExpression pexp, ClassNode flatInferredType)
protected void storeTargetMethod(Expression call, MethodNode directMethodCallCandidate)
protected void storeType(Expression exp, ClassNode cn)
protected void typeCheckAssignment(BinaryExpression assignmentExpression, Expression leftExpression, ClassNode leftExpressionType, Expression rightExpression, ClassNode inferredRightExpressionType)
protected void typeCheckClosureCall(Expression callArguments, ClassNode[] args, Parameter[] parameters)
protected MethodNode typeCheckMapConstructor(ConstructorCallExpression call, ClassNode receiver, Expression arguments)
protected boolean typeCheckMethodArgumentWithGenerics(ClassNode parameterType, ClassNode argumentType, boolean lastArg)
protected void typeCheckMethodsWithGenerics(ClassNode receiver, ClassNode[] arguments, MethodNode candidateMethod, Expression location)
ClassNode toType = getWrapper(getType(expression.getTo())); public void visitAttributeExpression(AttributeExpression expression)
int op = expression.getOperation().getType(); public void visitBinaryExpression(BinaryExpression expression)
Expression inner = expression.getExpression(); public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)
protected ClassNode getResultType(ClassNode left, int op, ClassNode right, BinaryExpression expr) { public void visitCastExpression(CastExpression expression)
extension.afterVisitClass(node); public void visitClass(ClassNode node)
public void visitClassExpression(ClassExpression expression)
} public void visitClosureExpression(ClosureExpression expression)
} public void visitConstructorCallExpression(ConstructorCallExpression call)
if (args.length == 1 && implementsInterfaceOrIsSubclassOf(args[0], MAP_TYPE) && findMethod(receiver, "", ClassNode.EMPTY_ARRAY).size() == 1) { protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)
* public void visitField(FieldNode node)
ClassNode origType = varOrigType.get(key); public void visitForLoop(ForStatement forLoop)
public void visitIfElse(IfStatement ifElse)
return; public void visitMethod(MethodNode node)
protected void visitMethodCallArguments(ArgumentListExpression arguments, boolean visitClosures, MethodNode selectedMethod)
} public void visitMethodCallExpression(MethodCallExpression call)
resultType = mn.getReturnType(); public void visitPostfixExpression(PostfixExpression expression)
if (!enclosingMethod.isVoidMethod() public void visitPrefixExpression(PrefixExpression expression)
Expression objectExpression = pexp.getObjectExpression(); public void visitPropertyExpression(PropertyExpression pexp)
BinaryExpression enclosingBinaryExpression = typeCheckingContext.getEnclosingBinaryExpression(); public void visitRangeExpression(RangeExpression expression)
if (node != null) { public void visitReturnStatement(ReturnStatement statement)
} finally { public void visitStaticMethodCallExpression(StaticMethodCallExpression call)
} public void visitTernaryExpression(TernaryExpression expression)
} public void visitTryCatchFinally(TryCatchStatement statement)
resultType = type; public void visitUnaryMinusExpression(UnaryMinusExpression expression)
public void visitUnaryPlusExpression(UnaryPlusExpression expression)
if (vexp.getName().equals("owner") public void visitVariableExpression(VariableExpression vexp)
storeTargetMethod(expression, node); public void visitWhileLoop(WhileStatement loop)
protected static ClassNode wrapTypeIfNecessary(ClassNode type)
Copyright © 2003-2012 The Codehaus. All rights reserved.