[Java] Class StaticTypeCheckingVisitor
- org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor
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
Modifiers | Name | Description |
---|---|---|
static class | StaticTypeCheckingVisitor.SignatureCodecFactory | |
protected class | StaticTypeCheckingVisitor.VariableExpressionTypeMemoizer |
Field Summary
Constructor Summary
Constructor and description |
---|
StaticTypeCheckingVisitor
(SourceUnit source, ClassNode cn) |
Methods Summary
Type Params | Return Type | Name 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) | |
protected 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 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) Checks that a constructor style expression is valid regarding the number of arguments and the argument types. | |
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 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 static String |
formatArgumentList(ClassNode[] nodes) | |
protected ClassNode[] |
getArgumentTypes(ArgumentListExpression args) | |
protected 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 { ... } call, this method is supposed to retrieve the inferred closure return type. | |
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 the list of type checking annotations class nodes. | |
TypeCheckingContext |
getTypeCheckingContext() Returns the current type checking context. | |
protected static boolean |
hasRHSIncompleteGenericTypeInfo(ClassNode inferredRightExpressionType) | |
protected StaticTypeCheckingVisitor.SetterInfo |
hasSetter(PropertyExpression pexp) | |
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) Test if a node is an inner class node, and if it is, then checks if the enclosing method is skipped. | |
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, ListHashMap> typesBeforeVisit) | |
protected void |
saveVariableExpressionMetadata(Set<VariableExpression> closureSharedExpressions, Map<VariableExpression, ListHashMap> typesBeforeVisit) | |
void |
setCompilationUnit(CompilationUnit cu) | |
void |
setMethodsToBeVisited(Set<MethodNode> methodsToBeVisited) | |
protected boolean |
shouldSkipClassNode(ClassNode node) | |
protected boolean |
shouldSkipMethodNode(MethodNode node) | |
protected void |
silentlyVisitMethodNode(MethodNode directMethodCallCandidate) visit 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 |
visitCaseStatement(CaseStatement statement) | |
void |
visitCastExpression(CastExpression expression) | |
void |
visitClass(ClassNode node) | |
void |
visitClassExpression(ClassExpression expression) | |
void |
visitClosureExpression(ClosureExpression expression) | |
void |
visitConstructor(ConstructorNode node) | |
void |
visitConstructorCallExpression(ConstructorCallExpression call) | |
protected void |
visitConstructorOrMethod(MethodNode node, boolean isConstructor) | |
void |
visitField(FieldNode node) | |
void |
visitForLoop(ForStatement forLoop) | |
void |
visitIfElse(IfStatement ifElse) | |
void |
visitMethod(MethodNode node) | |
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) | |
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. |
Inherited Methods Summary
Field Detail
protected static final ClassNode CLOSUREPARAMS_CLASSNODE
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<MethodNode> EMPTY_METHODNODE_LIST
protected static final ClassNode ENUMERATION_TYPE
protected static final Object ERROR_COLLECTOR
public static final Statement GENERATED_EMPTY_STATEMENT
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 LINKEDHASHMAP_CLASSNODE
protected static final ClassNode MAP_ENTRY_TYPE
protected static final ClassNode TYPECHECKED_CLASSNODE
protected static final ClassNode[] TYPECHECKING_ANNOTATIONS
protected static final ClassNode TYPECHECKING_INFO_NODE
protected FieldNode currentField
protected PropertyNode currentProperty
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<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)
@Override protected 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)
public void addTypeCheckingExtension(TypeCheckingExtension extension)
protected void addTypeCheckingInfoAnnotation(MethodNode node)
protected void addUnsupportedPreOrPostfixExpressionError(Expression expression)
protected boolean areCategoryMethodCalls(List<MethodNode> foundMethods, String name, ClassNode[] args)
protected boolean checkCast(ClassNode targetType, Expression source)
@Deprecated protected void checkClosureParameters(Expression callArguments, ClassNode receiver)
- deprecated:
- this method is unused, replaced with DelegatesTo inference.
- Parameters:
- callArguments
- receiver
protected void checkForbiddenSpreadArgument(ArgumentListExpression argumentList)
protected void checkGroovyConstructorMap(Expression receiver, ClassNode receiverType, MapExpression mapExpression)
@Deprecated protected void checkGroovyStyleConstructor(ClassNode node, ClassNode[] arguments)
Checks that a constructor style expression is valid regarding the number of arguments and the argument types.
- deprecated:
- use checkGroovyStyleConstructor(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.ClassNode[], org.codehaus.groovy.ast.ASTNode) )}
- Parameters:
-
node
- the class node for which we will try to find a matching constructor -
arguments
- the constructor 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.
- Parameters:
-
node
- the class node for which we will try to find a matching constructor -
arguments
- the constructor arguments
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)
- Parameters:
-
pexp
- a property expression -
readMode
- if true, look for property read, else for property set -
visitor
- 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
public 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. For example, "getName" would return "name", while "getFullName" would return "fullName". If the prefix is not found, returns null.
- Parameters:
-
prefix
- the method name prefix ("get", "is", "set", ...) -
methodName
- the method name
- Returns:
- a property name if the prefix is found and the method matches the java beans rules, null otherwise
protected Object extractTemporaryTypeInfoKey(Expression expression)
When instanceof checks are found in the code, we store temporary type information data in the TypeCheckingContext.temporaryIfBranchTypeInformation table. This method computes the key which must be used to store this type info.
- Parameters:
-
expression
- the expression for which to compute the key
- Returns:
- a key to be used for TypeCheckingContext.temporaryIfBranchTypeInformation
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. The returned type class depends on whether we have temporary type information available (due to instanceof checks) and whether there is a single candidate in that case.
- Parameters:
-
expr
- the expression for which an unknown field has been found -
type
- the type of the expression (used as fallback type)
- Returns:
- if temporary information is available and there's only one type, returns the temporary type class otherwise falls back to the provided type class.
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.
- Parameters:
-
receiver
- the receiver where to find methods -
name
- the name of the methods to return
- Returns:
- the methods that are defined on the receiver completed with stubs for future methods
protected static String formatArgumentList(ClassNode[] nodes)
protected ClassNode[] getArgumentTypes(ArgumentListExpression args)
protected 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. This method doesn't perform any type inference by itself.
- Parameters:
-
exp
- a ClosureExpression or MethodNode
- Returns:
- the inferred type, as stored on node metadata.
protected ClassNode getInferredReturnTypeFromWithClosureArgument(Expression callArguments)
In the case of a Object.with { ... } call, this method is supposed to retrieve the inferred closure return type.
- Parameters:
-
callArguments
- the argument list from the Object#with(Closure) call, ie. a single closure expression
- Returns:
- the inferred closure return type or null
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 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
public TypeCheckingContext getTypeCheckingContext()
Returns the current type checking context. The context is used internally by the type checker during type checking to store various state data.
- Returns:
- the type checking context
protected static boolean hasRHSIncompleteGenericTypeInfo(ClassNode inferredRightExpressionType)
@Deprecated protected StaticTypeCheckingVisitor.SetterInfo hasSetter(PropertyExpression pexp)
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() }
. 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.
- Parameters:
- receiver
- arguments
-
expression
- a closure expression for which the argument types should be inferred -
param
- the parameter where to look for a ClosureParams annotation. -
selectedMethod
- the method accepting a closure
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)
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
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. For example, the method Arrays.asList(T...) is generified with type T which can be deduced from actual type arguments.
- Parameters:
-
method
- the method node -
arguments
- the method call arguments
- Returns:
- parameterized, infered, class node
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. For example, the method Arrays.asList(T...) is generified with type T which can be deduced from actual type arguments.
- Parameters:
-
method
- the method node -
arguments
- the method call arguments -
explicitTypeHints
- explicit type hints as found for example in Collections.<String>emptyList()
- Returns:
- parameterized, infered, class node
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<VariableExpression, ClassNode> varOrigType, Map<VariableExpression, List<ClassNode>> oldTracker)
public boolean isSkipMode(AnnotatedNode node)
protected boolean isSkippedInnerClass(AnnotatedNode node)
Test if a node is an inner class node, and if it is, then checks if the enclosing method is skipped.
- Parameters:
- node
- Returns:
- true if the inner class node should be skipped
protected List<Receiver<String>> makeOwnerList(Expression objectExpression)
Given an object expression (a receiver expression), generate the list of potential receiver types.
- Parameters:
-
objectExpression
- the receiver expression
- Returns:
- the list of types the receiver may be
public 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
- Parameters:
-
objectOfInstanceOf
- the expression which must be checked against instanceof -
typeExpression
- the expression which represents the target type
protected void restoreVariableExpressionMetadata(Map<VariableExpression, ListHashMap> typesBeforeVisit)
protected void saveVariableExpressionMetadata(Set<VariableExpression> closureSharedExpressions, Map<VariableExpression, ListHashMap> typesBeforeVisit)
public void setCompilationUnit(CompilationUnit cu)
public void setMethodsToBeVisited(Set<MethodNode> methodsToBeVisited)
protected boolean shouldSkipClassNode(ClassNode node)
protected boolean shouldSkipMethodNode(MethodNode node)
protected void silentlyVisitMethodNode(MethodNode directMethodCallCandidate)
visit a method call target, to infer the type. Don't report errors right away, that will be done by a later visitMethod call
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. We are using a separate key to store inferred return type because the inferred type of a closure is Closure, which is different from the inferred type of the code of the closure.
- Parameters:
-
node
- a ClosureExpression or a MethodNode -
type
- the inferred return type of the code
- Returns:
- the old value of the inferred type
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)
@Override public void visitAttributeExpression(AttributeExpression expression)
@Override public void visitBinaryExpression(BinaryExpression expression)
@Override public void visitBitwiseNegationExpression(BitwiseNegationExpression expression)
@Override public void visitCaseStatement(CaseStatement statement)
@Override public void visitCastExpression(CastExpression expression)
@Override public void visitClass(ClassNode node)
@Override public void visitClassExpression(ClassExpression expression)
@Override public void visitClosureExpression(ClosureExpression expression)
@Override public void visitConstructor(ConstructorNode node)
@Override public void visitConstructorCallExpression(ConstructorCallExpression call)
@Override protected void visitConstructorOrMethod(MethodNode node, boolean isConstructor)
@Override public void visitField(FieldNode node)
@Override public void visitForLoop(ForStatement forLoop)
@Override public void visitIfElse(IfStatement ifElse)
@Override public void visitMethod(MethodNode node)
protected void visitMethodCallArguments(ClassNode receiver, ArgumentListExpression arguments, boolean visitClosures, MethodNode selectedMethod)
@Override public void visitMethodCallExpression(MethodCallExpression call)
@Override public void visitPostfixExpression(PostfixExpression expression)
@Override public void visitPrefixExpression(PrefixExpression expression)
@Override public void visitProperty(PropertyNode node)
@Override public void visitPropertyExpression(PropertyExpression pexp)
@Override public void visitRangeExpression(RangeExpression expression)
@Override public void visitReturnStatement(ReturnStatement statement)
@Override public void visitStaticMethodCallExpression(StaticMethodCallExpression call)
@Override public void visitSwitch(SwitchStatement statement)
@Override public void visitTernaryExpression(TernaryExpression expression)
@Override public void visitTryCatchFinally(TryCatchStatement statement)
@Override public void visitUnaryMinusExpression(UnaryMinusExpression expression)
@Override public void visitUnaryPlusExpression(UnaryPlusExpression expression)
@Override public void visitVariableExpression(VariableExpression vexp)
@Override public 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. This method differs from ClassHelper#getWrapper(org.codehaus.groovy.ast.ClassNode) as it will return the same instance if the provided type is not a generic type.
- Parameters:
- type
- Returns:
- the wrapped type
© 2003-2020 The Apache Software Foundation
Licensed under the Apache license.
https://docs.groovy-lang.org/2.4.21/html/gapi/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.html