public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport
Modifier and Type | Class and Description |
---|---|
static class |
StaticTypeCheckingVisitor.SignatureCodecFactory |
protected class |
StaticTypeCheckingVisitor.VariableExpressionTypeMemoizer |
Constructor and Description |
---|
StaticTypeCheckingVisitor(SourceUnit source,
ClassNode cn) |
Modifier and Type | Method and Description |
---|---|
protected void |
addAmbiguousErrorMessage(List<MethodNode> 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) |
void |
addError(String msg,
ASTNode expr) |
protected void |
addNoMatchingMethodError(ClassNode receiver,
String name,
ClassNode[] args,
Expression call) |
protected void |
addReceivers(List<Receiver<String>> receivers,
Collection<Receiver<String>> owners,
boolean implicitThis) |
protected void |
addStaticTypeError(String msg,
ASTNode expr) |
void |
addTypeCheckingExtension(TypeCheckingExtension extension) |
protected void |
addTypeCheckingInfoAnnotation(MethodNode node) |
protected void |
addUnsupportedPreOrPostfixExpressionError(Expression expression) |
protected void |
afterSwitchConditionExpressionVisited(SwitchStatement statement) |
protected boolean |
areCategoryMethodCalls(List<MethodNode> foundMethods,
String name,
ClassNode[] args) |
protected boolean |
checkCast(ClassNode targetType,
Expression source) |
protected void |
checkClosureParameters(Expression callArguments,
ClassNode receiver)
Deprecated.
this method is unused, replaced with
DelegatesTo inference. |
protected void |
checkForbiddenSpreadArgument(ArgumentListExpression argumentList) |
protected void |
checkGroovyConstructorMap(Expression receiver,
ClassNode receiverType,
MapExpression mapExpression) |
protected void |
checkGroovyStyleConstructor(ClassNode node,
ClassNode[] arguments)
|
protected MethodNode |
checkGroovyStyleConstructor(ClassNode node,
ClassNode[] arguments,
ASTNode source)
Checks that a constructor style expression is valid regarding the number
of arguments and the argument types.
|
protected ClassNode |
checkReturnType(ReturnStatement statement) |
protected void |
collectAllInterfaceMethodsByName(ClassNode receiver,
String name,
List<MethodNode> methods) |
protected boolean |
existsProperty(PropertyExpression pexp,
boolean checkForReadOnly) |
protected boolean |
existsProperty(PropertyExpression pexp,
boolean readMode,
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)
|
static String |
extractPropertyNameFromMethodName(String prefix,
String methodName)
Given a method name and a prefix, returns the name of the property that should be looked up,
following the java beans rules.
|
protected Object |
extractTemporaryTypeInfoKey(Expression expression)
When instanceof checks are found in the code, we store temporary type
information data in the
TypeCheckingContext.temporaryIfBranchTypeInformation
table. |
protected static ClassNode[] |
extractTypesFromParameters(Parameter[] parameters) |
protected ClassNode |
findCurrentInstanceOfClass(Expression expr,
ClassNode type)
A helper method which determines which receiver class should be used in error messages when a field or attribute
is not found.
|
protected BinaryExpression |
findInstanceOfNotReturnExpression(IfStatement ifElse)
Check IfStatement matched pattern :
Object var1;
if (!(var1 instanceOf Runnable)) {
return
}
// Here var1 instance of Runnable
|
protected List<MethodNode> |
findMethod(ClassNode receiver,
String name,
ClassNode... args) |
protected MethodNode |
findMethodOrFail(Expression expr,
ClassNode receiver,
String name,
ClassNode... args) |
protected List<MethodNode> |
findMethodsWithGenerated(ClassNode receiver,
String name)
This method returns the list of methods named against the supplied parameter that
are defined on the specified receiver, but it will also add "non existing" methods
that will be generated afterwards by the compiler, for example if a method is using
default values and that the specified class node isn't compiled yet.
|
protected BinaryExpression |
findNotInstanceOfReturnExpression(IfStatement ifElse)
Check IfStatement matched pattern :
Object var1;
if (var1 !instanceOf Runnable) {
return
}
// Here var1 instance of Runnable
|
protected static String |
formatArgumentList(ClassNode[] nodes) |
protected ClassNode[] |
getArgumentTypes(ArgumentListExpression args) |
protected org.codehaus.groovy.transform.stc.DelegationMetadata |
getDelegationMetadata(ClosureExpression expression) |
protected static ClassNode |
getGroupOperationResultType(ClassNode a,
ClassNode b) |
protected ClassNode |
getInferredReturnType(ASTNode exp)
Returns the inferred return type of a closure or a method, if stored on the AST node.
|
protected ClassNode |
getInferredReturnTypeFromWithClosureArgument(Expression callArguments)
In the case of a Object.with { ...
|
protected ClassNode |
getOriginalDeclarationType(Expression lhs) |
protected ClassNode |
getResultType(ClassNode left,
int op,
ClassNode right,
BinaryExpression expr) |
protected SourceUnit |
getSourceUnit() |
protected List<ClassNode> |
getTemporaryTypesForExpression(Expression objectExpression) |
protected ClassNode |
getType(ASTNode exp) |
protected ClassNode[] |
getTypeCheckingAnnotations()
Returns array of type checking annotations.
|
TypeCheckingContext |
getTypeCheckingContext()
Returns the current type checking context.
|
protected static boolean |
hasRHSIncompleteGenericTypeInfo(ClassNode inferredRightExpressionType) |
protected void |
inferClosureParameterTypes(ClassNode receiver,
Expression arguments,
ClosureExpression expression,
Parameter param,
MethodNode selectedMethod)
This method is responsible for performing type inference on closure argument types whenever code like this is
found:
foo.collect { it.toUpperCase() } . |
protected ClassNode |
inferComponentType(ClassNode containerType,
ClassNode indexType) |
protected void |
inferDiamondType(ConstructorCallExpression cce,
ClassNode lType) |
protected ClassNode |
inferListExpressionType(ListExpression list) |
static ClassNode |
inferLoopElementType(ClassNode collectionType)
Given a loop collection type, returns the inferred type of the loop element.
|
protected ClassNode |
inferMapExpressionType(MapExpression map) |
protected ClassNode |
inferReturnTypeGenerics(ClassNode receiver,
MethodNode method,
Expression arguments)
If a method call returns a parameterized type, then we can perform additional inference on the
return type, so that the type gets actual type parameters.
|
protected ClassNode |
inferReturnTypeGenerics(ClassNode receiver,
MethodNode method,
Expression arguments,
GenericsType[] explicitTypeHints)
If a method call returns a parameterized type, then we can perform additional inference on the
return type, so that the type gets actual type parameters.
|
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<VariableExpression,ClassNode> varOrigType,
Map<VariableExpression,List<ClassNode>> oldTracker) |
boolean |
isSkipMode(AnnotatedNode node) |
protected boolean |
isSkippedInnerClass(AnnotatedNode node)
Tests if a node is an inner class node, and if it is, then checks if the enclosing method is skipped.
|
protected static boolean |
isSuperExpression(Expression expression) |
protected static boolean |
isThisExpression(Expression expression) |
protected List<Receiver<String>> |
makeOwnerList(Expression objectExpression)
Given an object expression (a receiver expression), generate the list of potential receiver types.
|
void |
performSecondPass() |
protected Map<VariableExpression,ClassNode> |
popAssignmentTracking(Map<VariableExpression,List<ClassNode>> oldTracker) |
protected static String |
prettyPrintMethodList(List<MethodNode> nodes) |
protected Map<VariableExpression,List<ClassNode>> |
pushAssignmentTracking() |
protected void |
pushInstanceOfTypeInfo(Expression objectOfInstanceOf,
Expression typeExpression)
Stores information about types when [objectOfInstanceof instanceof typeExpression] is visited.
|
protected void |
restoreVariableExpressionMetadata(Map<VariableExpression,Map<StaticTypesMarker,Object>> typesBeforeVisit) |
protected void |
saveVariableExpressionMetadata(Set<VariableExpression> closureSharedExpressions,
Map<VariableExpression,Map<StaticTypesMarker,Object>> typesBeforeVisit) |
void |
setCompilationUnit(CompilationUnit compilationUnit) |
void |
setMethodsToBeVisited(Set<MethodNode> methodsToBeVisited) |
protected boolean |
shouldSkipClassNode(ClassNode node) |
protected boolean |
shouldSkipMethodNode(MethodNode node) |
protected void |
silentlyVisitMethodNode(MethodNode directMethodCallCandidate)
Visits a method call target, to infer the type.
|
protected void |
startMethodInference(MethodNode node,
ErrorCollector collector) |
protected ClassNode |
storeInferredReturnType(ASTNode node,
ClassNode type)
Stores the inferred return type of a closure or a method.
|
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 inferredRightExpressionTypeOrig) |
protected void |
typeCheckClosureCall(Expression callArguments,
ClassNode[] args,
Parameter[] parameters) |
protected MethodNode |
typeCheckMapConstructor(ConstructorCallExpression call,
ClassNode receiver,
Expression arguments) |
protected boolean |
typeCheckMethodsWithGenericsOrFail(ClassNode receiver,
ClassNode[] arguments,
MethodNode candidateMethod,
Expression location) |
void |
visitAttributeExpression(AttributeExpression expression) |
void |
visitBinaryExpression(BinaryExpression expression) |
void |
visitBitwiseNegationExpression(BitwiseNegationExpression expression) |
void |
visitBlockStatement(BlockStatement block) |
void |
visitCaseStatement(CaseStatement statement) |
void |
visitCastExpression(CastExpression expression) |
void |
visitClass(ClassNode node)
Visit a ClassNode.
|
void |
visitClassExpression(ClassExpression expression) |
void |
visitClosingBlock(BlockStatement block) |
void |
visitClosureExpression(ClosureExpression expression) |
void |
visitConstructor(ConstructorNode node)
Visit a ConstructorNode.
|
void |
visitConstructorCallExpression(ConstructorCallExpression call) |
protected void |
visitConstructorOrMethod(MethodNode node,
boolean isConstructor) |
void |
visitExpressionStatement(ExpressionStatement statement) |
void |
visitField(FieldNode node)
Visit a FieldNode.
|
void |
visitForLoop(ForStatement forLoop) |
void |
visitIfElse(IfStatement ifElse) |
protected void |
visitInstanceofNot(BinaryExpression be) |
void |
visitMethod(MethodNode node)
Visit a MethodNode.
|
protected void |
visitMethodCallArguments(ClassNode receiver,
ArgumentListExpression arguments,
boolean visitClosures,
MethodNode selectedMethod) |
void |
visitMethodCallExpression(MethodCallExpression call) |
void |
visitPostfixExpression(PostfixExpression expression) |
void |
visitPrefixExpression(PrefixExpression expression) |
void |
visitProperty(PropertyNode node)
Visit a PropertyNode.
|
void |
visitPropertyExpression(PropertyExpression pexp) |
void |
visitRangeExpression(RangeExpression expression) |
void |
visitReturnStatement(ReturnStatement statement) |
void |
visitStaticMethodCallExpression(StaticMethodCallExpression call) |
void |
visitSwitch(SwitchStatement statement) |
void |
visitTernaryExpression(TernaryExpression expression) |
void |
visitTryCatchFinally(TryCatchStatement statement) |
void |
visitUnaryMinusExpression(UnaryMinusExpression expression) |
void |
visitUnaryPlusExpression(UnaryPlusExpression expression) |
void |
visitVariableExpression(VariableExpression vexp) |
void |
visitWhileLoop(WhileStatement loop) |
protected static ClassNode |
wrapTypeIfNecessary(ClassNode type)
Returns a wrapped type if, and only if, the provided class node is a primitive type.
|
visitAnnotation, visitAnnotations, visitAssertStatement, visitBreakStatement, visitCatchStatement, visitClassCodeContainer, visitContinueStatement, visitDeclarationExpression, visitDoWhileLoop, visitImports, visitObjectInitializerStatements, visitPackage, visitStatement, visitSynchronizedStatement, visitThrowStatement
visitArgumentlistExpression, visitArrayExpression, visitBooleanExpression, visitBytecodeExpression, visitClosureListExpression, visitConstantExpression, visitEmptyStatement, visitFieldExpression, visitGStringExpression, visitLambdaExpression, visitListExpression, visitMapEntryExpression, visitMapExpression, visitMethodPointerExpression, visitMethodReferenceExpression, visitNotExpression, visitShortTernaryExpression, visitSpreadExpression, visitSpreadMapExpression, visitTupleExpression
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
visitEmptyExpression, visitListOfExpressions
protected static final Object ERROR_COLLECTOR
protected static final ClassNode ITERABLE_TYPE
protected static final List<MethodNode> EMPTY_METHODNODE_LIST
protected static final ClassNode TYPECHECKED_CLASSNODE
protected static final ClassNode[] TYPECHECKING_ANNOTATIONS
protected static final ClassNode TYPECHECKING_INFO_NODE
protected static final ClassNode DGM_CLASSNODE
protected static final int CURRENT_SIGNATURE_PROTOCOL_VERSION
protected static final Expression CURRENT_SIGNATURE_PROTOCOL
protected static final MethodNode GET_DELEGATE
protected static final MethodNode GET_OWNER
protected static final MethodNode GET_THISOBJECT
protected static final ClassNode DELEGATES_TO
protected static final ClassNode DELEGATES_TO_TARGET
protected static final ClassNode LINKEDHASHMAP_CLASSNODE
protected static final ClassNode CLOSUREPARAMS_CLASSNODE
protected static final ClassNode NAMED_PARAMS_CLASSNODE
protected static final ClassNode MAP_ENTRY_TYPE
protected static final ClassNode ENUMERATION_TYPE
public static final Statement GENERATED_EMPTY_STATEMENT
public static final MethodNode CLOSURE_CALL_NO_ARG
public static final MethodNode CLOSURE_CALL_ONE_ARG
public static final MethodNode CLOSURE_CALL_VARGS
protected final ReturnAdder.ReturnStatementListener returnListener
protected final ReturnAdder returnAdder
protected TypeCheckingContext typeCheckingContext
protected DefaultTypeCheckingExtension extension
protected FieldNode currentField
protected PropertyNode currentProperty
public StaticTypeCheckingVisitor(SourceUnit source, ClassNode cn)
protected SourceUnit getSourceUnit()
getSourceUnit
in class ClassCodeVisitorSupport
public void initialize()
public TypeCheckingContext getTypeCheckingContext()
public void addTypeCheckingExtension(TypeCheckingExtension extension)
public void setCompilationUnit(CompilationUnit compilationUnit)
public void visitClass(ClassNode node)
GroovyClassVisitor
visitClass
in interface GroovyClassVisitor
visitClass
in class ClassCodeVisitorSupport
protected ClassNode[] getTypeCheckingAnnotations()
The default implementation returns TypeChecked
.
protected boolean shouldSkipClassNode(ClassNode node)
public boolean isSkipMode(AnnotatedNode node)
protected boolean isSkippedInnerClass(AnnotatedNode node)
public void visitClassExpression(ClassExpression expression)
visitClassExpression
in interface GroovyCodeVisitor
visitClassExpression
in class CodeVisitorSupport
public void visitVariableExpression(VariableExpression vexp)
visitVariableExpression
in interface GroovyCodeVisitor
visitVariableExpression
in class CodeVisitorSupport
public void visitPropertyExpression(PropertyExpression pexp)
visitPropertyExpression
in interface GroovyCodeVisitor
visitPropertyExpression
in class CodeVisitorSupport
public void visitAttributeExpression(AttributeExpression expression)
visitAttributeExpression
in interface GroovyCodeVisitor
visitAttributeExpression
in class CodeVisitorSupport
public void visitRangeExpression(RangeExpression expression)
visitRangeExpression
in interface GroovyCodeVisitor
visitRangeExpression
in class CodeVisitorSupport
public void visitBinaryExpression(BinaryExpression expression)
visitBinaryExpression
in interface GroovyCodeVisitor
visitBinaryExpression
in class CodeVisitorSupport
protected ClassNode getOriginalDeclarationType(Expression lhs)
protected void inferDiamondType(ConstructorCallExpression cce, ClassNode lType)
protected void pushInstanceOfTypeInfo(Expression objectOfInstanceOf, Expression typeExpression)
objectOfInstanceOf
- the expression which must be checked against instanceoftypeExpression
- the expression which represents the target typeprotected void typeCheckAssignment(BinaryExpression assignmentExpression, Expression leftExpression, ClassNode leftExpressionType, Expression rightExpression, ClassNode inferredRightExpressionTypeOrig)
protected void checkGroovyConstructorMap(Expression receiver, ClassNode receiverType, MapExpression mapExpression)
protected static boolean hasRHSIncompleteGenericTypeInfo(ClassNode inferredRightExpressionType)
@Deprecated protected void checkGroovyStyleConstructor(ClassNode node, ClassNode[] arguments)
checkGroovyStyleConstructor(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.ClassNode[], org.codehaus.groovy.ast.ASTNode)
)}node
- the class node for which we will try to find a matching constructorarguments
- the constructor argumentsprotected MethodNode checkGroovyStyleConstructor(ClassNode node, ClassNode[] arguments, ASTNode source)
node
- the class node for which we will try to find a matching constructorarguments
- the constructor argumentsprotected Object extractTemporaryTypeInfoKey(Expression expression)
TypeCheckingContext.temporaryIfBranchTypeInformation
table. This method computes the key which must be used to store this type
info.expression
- the expression for which to compute the keyTypeCheckingContext.temporaryIfBranchTypeInformation
protected ClassNode findCurrentInstanceOfClass(Expression expr, ClassNode type)
expr
- the expression for which an unknown field has been foundtype
- the type of the expression (used as fallback type)protected boolean existsProperty(PropertyExpression pexp, boolean checkForReadOnly)
protected boolean existsProperty(PropertyExpression pexp, boolean readMode, ClassCodeVisitorSupport visitor)
pexp
- a property expressionreadMode
- if true, look for property read, else for property setvisitor
- if not null, when the property node is found, visit it with the provided visitorprotected void storeInferredTypeForPropertyExpression(PropertyExpression pexp, ClassNode flatInferredType)
public void visitProperty(PropertyNode node)
GroovyClassVisitor
visitProperty
in interface GroovyClassVisitor
visitProperty
in class ClassCodeVisitorSupport
public void visitField(FieldNode node)
GroovyClassVisitor
visitField
in interface GroovyClassVisitor
visitField
in class ClassCodeVisitorSupport
public void visitForLoop(ForStatement forLoop)
visitForLoop
in interface GroovyCodeVisitor
visitForLoop
in class ClassCodeVisitorSupport
public static ClassNode inferLoopElementType(ClassNode collectionType)
collectionType
- the type of the collectionprotected boolean isSecondPassNeededForControlStructure(Map<VariableExpression,ClassNode> varOrigType, Map<VariableExpression,List<ClassNode>> oldTracker)
public void visitWhileLoop(WhileStatement loop)
visitWhileLoop
in interface GroovyCodeVisitor
visitWhileLoop
in class ClassCodeVisitorSupport
public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)
visitBitwiseNegationExpression
in interface GroovyCodeVisitor
visitBitwiseNegationExpression
in class CodeVisitorSupport
public void visitUnaryPlusExpression(UnaryPlusExpression expression)
visitUnaryPlusExpression
in interface GroovyCodeVisitor
visitUnaryPlusExpression
in class CodeVisitorSupport
public void visitUnaryMinusExpression(UnaryMinusExpression expression)
visitUnaryMinusExpression
in interface GroovyCodeVisitor
visitUnaryMinusExpression
in class CodeVisitorSupport
public void visitPostfixExpression(PostfixExpression expression)
visitPostfixExpression
in interface GroovyCodeVisitor
visitPostfixExpression
in class CodeVisitorSupport
public void visitPrefixExpression(PrefixExpression expression)
visitPrefixExpression
in interface GroovyCodeVisitor
visitPrefixExpression
in class CodeVisitorSupport
protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)
visitConstructorOrMethod
in class ClassCodeVisitorSupport
public void visitExpressionStatement(ExpressionStatement statement)
visitExpressionStatement
in interface GroovyCodeVisitor
visitExpressionStatement
in class ClassCodeVisitorSupport
public void visitReturnStatement(ReturnStatement statement)
visitReturnStatement
in interface GroovyCodeVisitor
visitReturnStatement
in class ClassCodeVisitorSupport
protected ClassNode checkReturnType(ReturnStatement statement)
protected void addClosureReturnType(ClassNode returnType)
public void visitConstructorCallExpression(ConstructorCallExpression call)
visitConstructorCallExpression
in interface GroovyCodeVisitor
visitConstructorCallExpression
in class CodeVisitorSupport
protected MethodNode typeCheckMapConstructor(ConstructorCallExpression call, ClassNode receiver, Expression arguments)
protected ClassNode[] getArgumentTypes(ArgumentListExpression args)
public void visitClosureExpression(ClosureExpression expression)
visitClosureExpression
in interface GroovyCodeVisitor
visitClosureExpression
in class CodeVisitorSupport
protected org.codehaus.groovy.transform.stc.DelegationMetadata getDelegationMetadata(ClosureExpression expression)
protected void restoreVariableExpressionMetadata(Map<VariableExpression,Map<StaticTypesMarker,Object>> typesBeforeVisit)
protected void saveVariableExpressionMetadata(Set<VariableExpression> closureSharedExpressions, Map<VariableExpression,Map<StaticTypesMarker,Object>> typesBeforeVisit)
protected boolean shouldSkipMethodNode(MethodNode node)
public void visitMethod(MethodNode node)
GroovyClassVisitor
visitMethod
in interface GroovyClassVisitor
visitMethod
in class ClassCodeVisitorSupport
public void visitConstructor(ConstructorNode node)
GroovyClassVisitor
visitConstructor
in interface GroovyClassVisitor
visitConstructor
in class ClassCodeVisitorSupport
protected void startMethodInference(MethodNode node, ErrorCollector collector)
protected void addTypeCheckingInfoAnnotation(MethodNode node)
public void visitStaticMethodCallExpression(StaticMethodCallExpression call)
visitStaticMethodCallExpression
in interface GroovyCodeVisitor
visitStaticMethodCallExpression
in class CodeVisitorSupport
@Deprecated protected void checkClosureParameters(Expression callArguments, ClassNode receiver)
DelegatesTo
inference.protected void silentlyVisitMethodNode(MethodNode directMethodCallCandidate)
protected void visitMethodCallArguments(ClassNode receiver, ArgumentListExpression arguments, boolean visitClosures, MethodNode selectedMethod)
protected void inferClosureParameterTypes(ClassNode receiver, Expression arguments, ClosureExpression expression, Parameter param, MethodNode selectedMethod)
foo.collect { it.toUpperCase() }
.
In this case, the type checker tries to find if the collect
method has its Closure
argument
annotated with ClosureParams
. If yes, then additional type inference can be performed
and the type of it
may be inferred.receiver
- arguments
- expression
- a closure expression for which the argument types should be inferredparam
- the parameter where to look for a ClosureParams
annotation.selectedMethod
- the method accepting a closureprotected void addReceivers(List<Receiver<String>> receivers, Collection<Receiver<String>> owners, boolean implicitThis)
public void visitMethodCallExpression(MethodCallExpression call)
visitMethodCallExpression
in interface GroovyCodeVisitor
visitMethodCallExpression
in class CodeVisitorSupport
protected ClassNode getInferredReturnTypeFromWithClosureArgument(Expression callArguments)
callArguments
- the argument list from the Object#with(Closure) call, ie. a single closure expressionprotected List<Receiver<String>> makeOwnerList(Expression objectExpression)
objectExpression
- the receiver expressionprotected void checkForbiddenSpreadArgument(ArgumentListExpression argumentList)
protected List<ClassNode> getTemporaryTypesForExpression(Expression objectExpression)
protected void storeTargetMethod(Expression call, MethodNode directMethodCallCandidate)
protected boolean isClosureCall(String name, Expression objectExpression, Expression arguments)
protected void typeCheckClosureCall(Expression callArguments, ClassNode[] args, Parameter[] parameters)
public void visitIfElse(IfStatement ifElse)
visitIfElse
in interface GroovyCodeVisitor
visitIfElse
in class ClassCodeVisitorSupport
protected void visitInstanceofNot(BinaryExpression be)
public void visitBlockStatement(BlockStatement block)
visitBlockStatement
in interface GroovyCodeVisitor
visitBlockStatement
in class ClassCodeVisitorSupport
public void visitClosingBlock(BlockStatement block)
protected BinaryExpression findInstanceOfNotReturnExpression(IfStatement ifElse)
Return expression , which contains instanceOf (without not) Return null, if not found
protected BinaryExpression findNotInstanceOfReturnExpression(IfStatement ifElse)
Return expression , which contains instanceOf (without not) Return null, if not found
public void visitSwitch(SwitchStatement statement)
visitSwitch
in interface GroovyCodeVisitor
visitSwitch
in class ClassCodeVisitorSupport
protected void afterSwitchConditionExpressionVisited(SwitchStatement statement)
afterSwitchConditionExpressionVisited
in class CodeVisitorSupport
public void visitCaseStatement(CaseStatement statement)
visitCaseStatement
in interface GroovyCodeVisitor
visitCaseStatement
in class ClassCodeVisitorSupport
protected Map<VariableExpression,ClassNode> popAssignmentTracking(Map<VariableExpression,List<ClassNode>> oldTracker)
protected Map<VariableExpression,List<ClassNode>> pushAssignmentTracking()
public void visitCastExpression(CastExpression expression)
visitCastExpression
in interface GroovyCodeVisitor
visitCastExpression
in class CodeVisitorSupport
protected boolean checkCast(ClassNode targetType, Expression source)
public void visitTernaryExpression(TernaryExpression expression)
visitTernaryExpression
in interface GroovyCodeVisitor
visitTernaryExpression
in class CodeVisitorSupport
public void visitTryCatchFinally(TryCatchStatement statement)
visitTryCatchFinally
in interface GroovyCodeVisitor
visitTryCatchFinally
in class ClassCodeVisitorSupport
protected void storeType(Expression exp, ClassNode cn)
protected ClassNode getResultType(ClassNode left, int op, ClassNode right, BinaryExpression expr)
protected static ClassNode getGroupOperationResultType(ClassNode a, ClassNode b)
protected ClassNode inferComponentType(ClassNode containerType, ClassNode indexType)
protected MethodNode findMethodOrFail(Expression expr, ClassNode receiver, String name, ClassNode... args)
protected static String prettyPrintMethodList(List<MethodNode> nodes)
protected boolean areCategoryMethodCalls(List<MethodNode> foundMethods, String name, ClassNode[] args)
protected List<MethodNode> findMethodsWithGenerated(ClassNode receiver, String name)
receiver
- the receiver where to find methodsname
- the name of the methods to returnprotected List<MethodNode> findMethod(ClassNode receiver, String name, ClassNode... args)
public static String extractPropertyNameFromMethodName(String prefix, String methodName)
prefix
- the method name prefix ("get", "is", "set", ...)methodName
- the method nameprotected void collectAllInterfaceMethodsByName(ClassNode receiver, String name, List<MethodNode> methods)
protected ClassNode storeInferredReturnType(ASTNode node, ClassNode type)
Closure
, which is different
from the inferred type of the code of the closure.node
- a ClosureExpression
or a MethodNode
type
- the inferred return type of the codeprotected ClassNode getInferredReturnType(ASTNode exp)
exp
- a ClosureExpression
or MethodNode
protected ClassNode inferListExpressionType(ListExpression list)
protected static boolean isNullConstant(Expression expression)
protected static boolean isThisExpression(Expression expression)
protected static boolean isSuperExpression(Expression expression)
protected ClassNode inferMapExpressionType(MapExpression map)
protected ClassNode inferReturnTypeGenerics(ClassNode receiver, MethodNode method, Expression arguments)
method
- the method nodearguments
- the method call argumentsprotected ClassNode inferReturnTypeGenerics(ClassNode receiver, MethodNode method, Expression arguments, GenericsType[] explicitTypeHints)
method
- the method nodearguments
- the method call argumentsexplicitTypeHints
- explicit type hints as found for example in Collections.<String>emptyList()protected boolean typeCheckMethodsWithGenericsOrFail(ClassNode receiver, ClassNode[] arguments, MethodNode candidateMethod, Expression location)
public void addError(String msg, ASTNode expr)
addError
in interface ErrorCollecting
addError
in class ClassCodeVisitorSupport
protected void addNoMatchingMethodError(ClassNode receiver, String name, ClassNode[] args, Expression call)
protected void addAmbiguousErrorMessage(List<MethodNode> foundMethods, String name, ClassNode[] args, Expression expr)
protected void addCategoryMethodCallError(Expression call)
protected void addAssignmentError(ClassNode leftType, ClassNode rightType, Expression assignmentExpression)
protected void addUnsupportedPreOrPostfixExpressionError(Expression expression)
public void setMethodsToBeVisited(Set<MethodNode> methodsToBeVisited)
public void performSecondPass()
protected static ClassNode[] extractTypesFromParameters(Parameter[] parameters)
protected static ClassNode wrapTypeIfNecessary(ClassNode type)
ClassHelper.getWrapper(org.codehaus.groovy.ast.ClassNode)
as it will
return the same instance if the provided type is not a generic type.