Class GroovyTypeCheckingExtensionSupport
java.lang.Object
org.codehaus.groovy.transform.stc.TypeCheckingExtension
org.codehaus.groovy.transform.stc.AbstractTypeCheckingExtension
org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport
public class GroovyTypeCheckingExtensionSupport extends AbstractTypeCheckingExtension
Base class for type checking extensions written in Groovy. Compared to its superclass,
TypeCheckingExtension
,
this class adds a number of utility methods aimed at leveraging the syntax of the Groovy language to improve
expressivity and conciseness.- Since:
- 2.1.0
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
GroovyTypeCheckingExtensionSupport.TypeCheckingDSL
Event handler registration: setup Registers closure that runs after the type checker finishes initialization finish Registers closure that runs after the type checker completes type checking beforeVisitClass Registers closure that runs before type checking a class afterVisitClass Registers closure that runs after having finished the visit of a type checked class beforeVisitMethod Registers closure that runs before type checking a method body afterVisitMethod Registers closure that runs after type checking a method body beforeMethodCall Registers closure that runs before the type checker starts type checking a method call afterMethodCall Registers closure that runs once the type checker has finished type checking a method call methodNotFound Registers closure that runs when it fails to find an appropriate method for a method call ambiguousMethods Registers closure that runs when the type checker cannot choose between several candidate methods onMethodSelection Registers closure that runs when it finds a method appropriate for a method call unresolvedVariable Registers closure that runs when the type checker finds an unresolved variable unresolvedProperty Registers closure that runs when the type checker cannot find a property on the receiver unresolvedAttribute Registers closure that runs when the type checker cannot find an attribute on the receiver incompatibleAssignment Registers closure that runs when the type checker thinks that the right-hand side of an assignment is incompatible with the left-hand side incompatibleReturnType Registers closure that runs when the type checker thinks that a return value is incompatibe with the return type Expression categorization: isAnnotationConstantExpression Determines if argument is anAnnotationConstantExpression
isArgumentListExpression Determines if argument is anArgumentListExpression
isArrayExpression Determines if argument is anArrayExpression
isAttributeExpression Determines if argument is anAttributeExpression
isBinaryExpression Determines if argument is aBinaryExpression
isBitwiseNegationExpression Determines if argument is aBitwiseNegationExpression
isBooleanExpression Determines if argument is aBooleanExpression
isCastExpression Determines if argument is aCastExpression
isClassExpression Determines if argument is aClassExpression
isClosureExpression Determines if argument is aClosureExpression
isConstantExpression Determines if argument is aConstantExpression
isConstructorCallExpression Determines if argument is aConstructorCallExpression
isDeclarationExpression Determines if argument is aDeclarationExpression
isElvisOperatorExpression Determines if argument is anElvisOperatorExpression
isEmptyExpression Determines if argument is anEmptyExpression
isFieldExpression Determines if argument is aFieldExpression
isGStringExpression Determines if argument is aGStringExpression
isLambdaExpression Determines if argument is aLambdaExpression
isListExpression Determines if argument is aListExpression
isMapExpression Determines if argument is aMapExpression
isMapEntryExpression Determines if argument is aMapEntryExpression
isMethodCallExpression Determines if argument is aMethodCallExpression
isMethodPointerExpression Determines if argument is aMethodPointerExpression
isMethodReferenceExpression Determines if argument is aMethodReferenceExpression
isNamedArgumentListExpression Determines if argument is aNamedArgumentListExpression
isNotExpression Determines if argument is aNotExpression
isPostfixExpression Determines if argument is aPostfixExpression
isPrefixExpression Determines if argument is aPrefixExpression
isPropertyExpression Determines if argument is aPropertyExpression
isRangeExpression Determines if argument is aRangeExpression
isSpreadExpression Determines if argument is aSpreadExpression
isSpreadMapExpression Determines if argument is aSpreadMapExpression
isStaticMethodCallExpression Determines if argument is aStaticMethodCallExpression
isTernaryExpression Determines if argument is aTernaryExpression
isTupleExpression Determines if argument is aTupleExpression
isUnaryMinusExpression Determines if argument is aUnaryMinusExpression
isUnaryPlusExpression Determines if argument is aUnaryPlusExpression
isVariableExpression Determines if argument is aVariableExpression
General utility: Delegates toAbstractTypeCheckingExtension
Imports static members ofClassHelper
Imports static members ofStaticTypeCheckingSupport
-
Field Summary
Fields inherited from class org.codehaus.groovy.transform.stc.AbstractTypeCheckingExtension
context, debug, handled
Fields inherited from class org.codehaus.groovy.transform.stc.TypeCheckingExtension
typeCheckingVisitor
-
Constructor Summary
Constructors Constructor Description GroovyTypeCheckingExtensionSupport(StaticTypeCheckingVisitor typeCheckingVisitor, java.lang.String scriptPath, CompilationUnit compilationUnit)
Builds a type checking extension relying on a Groovy script (type checking DSL). -
Method Summary
Modifier and Type Method Description void
afterMethodCall(MethodCall call)
Allows the extension to perform additional tasks after the type checker actually visits a method call.void
afterVisitClass(ClassNode node)
Allows the extension to perform additional tasks after the type checker actually visited a class node.void
afterVisitMethod(MethodNode node)
Allows the extension to perform additional tasks after the type checker actually visited a method node.boolean
beforeMethodCall(MethodCall call)
Allows the extension to perform additional tasks before the type checker actually visits a method call.boolean
beforeVisitClass(ClassNode node)
Allows the extension to perform additional tasks before the type checker actually visits a class node.boolean
beforeVisitMethod(MethodNode node)
Allows the extension to perform additional tasks before the type checker actually visits a method node.void
finish()
Subclasses should implement this method if they need to perform additional checks after the type checker has finished its work.java.util.List<MethodNode>
handleAmbiguousMethods(java.util.List<MethodNode> nodes, Expression origin)
This method is called by the type checker before throwing an "ambiguous method" error, giving the chance to the extension to select the method properly.boolean
handleIncompatibleAssignment(ClassNode lhsType, ClassNode rhsType, Expression assignmentExpression)
This method is called by the type checker when an assignment is not allowed by the type checker.boolean
handleIncompatibleReturnType(ReturnStatement returnStatement, ClassNode inferredReturnType)
Allows the extension to catch incompatible return types.java.util.List<MethodNode>
handleMissingMethod(ClassNode receiver, java.lang.String name, ArgumentListExpression argumentList, ClassNode[] argumentTypes, MethodCall call)
This method is called by the type checker when a method call cannot be resolved.boolean
handleUnresolvedAttribute(AttributeExpression aexp)
This method is called by the type checker when an attribute expression cannot be resolved (for example, when an attribute doesn't exist).boolean
handleUnresolvedProperty(PropertyExpression pexp)
This method is called by the type checker when a property expression cannot be resolved (for example, when a property doesn't exist).boolean
handleUnresolvedVariableExpression(VariableExpression vexp)
This method is called by the type checker when a variable expression cannot be resolved.void
onMethodSelection(Expression expression, MethodNode target)
Allows the extension to listen to method selection events.void
setDebug(boolean debug)
void
setup()
Subclasses should implement this method whenever they need to perform special checks before the type checker starts working.Methods inherited from class org.codehaus.groovy.transform.stc.AbstractTypeCheckingExtension
argTypeMatches, argTypeMatches, argTypesMatches, argTypesMatches, delegatesTo, delegatesTo, delegatesTo, firstArgTypesMatches, firstArgTypesMatches, getArguments, getCurrentScope, getEnclosingBinaryExpression, getEnclosingBinaryExpressionStack, getEnclosingClassNode, getEnclosingClassNodes, getEnclosingClosure, getEnclosingClosureStack, getEnclosingMethod, getEnclosingMethodCall, getEnclosingMethodCalls, getEnclosingMethods, getGeneratedMethods, isAnnotatedBy, isAnnotatedBy, isDynamic, isExtensionMethod, isGenerated, isMethodCall, log, makeDynamic, makeDynamic, makeDynamic, makeDynamic, makeDynamic, makeDynamic, newMethod, newMethod, newMethod, newScope, newScope, popEnclosingBinaryExpression, popEnclosingClassNode, popEnclosingClosure, popEnclosingMethod, popEnclosingMethodCall, popTemporaryTypeInfo, pushEnclosingBinaryExpression, pushEnclosingClassNode, pushEnclosingClosureExpression, pushEnclosingMethod, pushEnclosingMethodCall, pushTemporaryTypeInfo, safeCall, scopeExit, scopeExit, setHandled, unique, withTypeChecker
Methods inherited from class org.codehaus.groovy.transform.stc.TypeCheckingExtension
addStaticTypeError, buildListType, buildMapType, classNodeFor, classNodeFor, existsProperty, existsProperty, extractStaticReceiver, getArgumentTypes, getTargetMethod, getType, isStaticMethodCallOnClass, lookupClassNodeFor, parameterizedType, storeType
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Constructor Details
-
GroovyTypeCheckingExtensionSupport
public GroovyTypeCheckingExtensionSupport(StaticTypeCheckingVisitor typeCheckingVisitor, java.lang.String scriptPath, CompilationUnit compilationUnit)Builds a type checking extension relying on a Groovy script (type checking DSL).- Parameters:
typeCheckingVisitor
- the type checking visitorscriptPath
- the path to the type checking script (in classpath)compilationUnit
-
-
-
Method Details
-
setDebug
public void setDebug(boolean debug) -
setup
public void setup()Description copied from class:TypeCheckingExtension
Subclasses should implement this method whenever they need to perform special checks before the type checker starts working.- Overrides:
setup
in classTypeCheckingExtension
-
finish
public void finish()Description copied from class:TypeCheckingExtension
Subclasses should implement this method if they need to perform additional checks after the type checker has finished its work. This is particularly useful for situations where you need multiple passes. Some checks in that case may be deferred to the end, using this method.- Overrides:
finish
in classTypeCheckingExtension
-
onMethodSelection
Description copied from class:TypeCheckingExtension
Allows the extension to listen to method selection events. Given an expression, which may be a method call expression, a static method call expression, a pre/postfix expression, ..., if a corresponding method is found, this method is called.- Overrides:
onMethodSelection
in classTypeCheckingExtension
- Parameters:
expression
- the expression for which a corresponding method has been foundtarget
- the method which has been chosen by the type checker
-
afterMethodCall
Description copied from class:TypeCheckingExtension
Allows the extension to perform additional tasks after the type checker actually visits a method call. Compared to a custom visitor, this method ensures that the node being visited is a node which would have been visited by the type checker. This is in particular important for nodes which are marked withTypeCheckingMode.SKIP
.- Overrides:
afterMethodCall
in classTypeCheckingExtension
- Parameters:
call
- a method call, either aMethodCallExpression
,StaticMethodCallExpression
, orConstructorCallExpression
-
beforeMethodCall
Description copied from class:TypeCheckingExtension
Allows the extension to perform additional tasks before the type checker actually visits a method call. Compared to a custom visitor, this method ensures that the node being visited is a node which would have been visited by the type checker. This is in particular important for nodes which are marked withTypeCheckingMode.SKIP
.- Overrides:
beforeMethodCall
in classTypeCheckingExtension
- Parameters:
call
- a method call, either aMethodCallExpression
,StaticMethodCallExpression
, orConstructorCallExpression
- Returns:
- false if the type checker should visit the node, or true if this extension replaces what the type checker would do with the method call.
-
handleUnresolvedVariableExpression
Description copied from class:TypeCheckingExtension
This method is called by the type checker when a variable expression cannot be resolved. It gives the extension a chance to resolve it for the type checker.- Overrides:
handleUnresolvedVariableExpression
in classTypeCheckingExtension
- Parameters:
vexp
- the unresolved variable extension- Returns:
boolean
false if the extension doesn't handle it, true if the extension handles this variable.
-
handleUnresolvedProperty
Description copied from class:TypeCheckingExtension
This method is called by the type checker when a property expression cannot be resolved (for example, when a property doesn't exist). It gives the extension a chance to resolve it.- Overrides:
handleUnresolvedProperty
in classTypeCheckingExtension
- Parameters:
pexp
- the unresolved property- Returns:
boolean
false if this extension doesn't resolve the property, true if it resolves the property.
-
handleUnresolvedAttribute
Description copied from class:TypeCheckingExtension
This method is called by the type checker when an attribute expression cannot be resolved (for example, when an attribute doesn't exist). It gives the extension a chance to resolve it.- Overrides:
handleUnresolvedAttribute
in classTypeCheckingExtension
- Parameters:
aexp
- the unresolved attribute- Returns:
boolean
false if this extension doesn't resolve the attribute, true if it resolves the attribute.
-
afterVisitMethod
Description copied from class:TypeCheckingExtension
Allows the extension to perform additional tasks after the type checker actually visited a method node. Compared to a custom visitor, this method ensures that the node being visited is a node which would have been visited by the type checker. This is in particular important for nodes which are marked withTypeCheckingMode.SKIP
.- Overrides:
afterVisitMethod
in classTypeCheckingExtension
- Parameters:
node
- a method node
-
beforeVisitClass
Description copied from class:TypeCheckingExtension
Allows the extension to perform additional tasks before the type checker actually visits a class node. Compared to a custom visitor, this method ensures that the node being visited is a node which would have been visited by the type checker. This is in particular important for nodes which are marked withTypeCheckingMode.SKIP
.- Overrides:
beforeVisitClass
in classTypeCheckingExtension
- Parameters:
node
- a class node- Returns:
- false if the type checker should visit the node, or true if this extension replaces what the type checker would do with the class.
-
afterVisitClass
Description copied from class:TypeCheckingExtension
Allows the extension to perform additional tasks after the type checker actually visited a class node. Compared to a custom visitor, this method ensures that the node being visited is a node which would have been visited by the type checker. This is in particular important for nodes which are marked withTypeCheckingMode.SKIP
.- Overrides:
afterVisitClass
in classTypeCheckingExtension
- Parameters:
node
- a class node
-
beforeVisitMethod
Description copied from class:TypeCheckingExtension
Allows the extension to perform additional tasks before the type checker actually visits a method node. Compared to a custom visitor, this method ensures that the node being visited is a node which would have been visited by the type checker. This is in particular important for nodes which are marked withTypeCheckingMode.SKIP
.- Overrides:
beforeVisitMethod
in classTypeCheckingExtension
- Parameters:
node
- a method node- Returns:
- false if the type checker should visit the node, or true if this extension replaces what the type checker would do with the method.
-
handleIncompatibleAssignment
public boolean handleIncompatibleAssignment(ClassNode lhsType, ClassNode rhsType, Expression assignmentExpression)Description copied from class:TypeCheckingExtension
This method is called by the type checker when an assignment is not allowed by the type checker. Extensions may override this method to allow such assignments where the type checker normally disallows them.- Overrides:
handleIncompatibleAssignment
in classTypeCheckingExtension
- Parameters:
lhsType
- the type of the left hand side of the assignment, as found by the type checkerrhsType
- the type of the right hand side of the assignment, as found by the type checkerassignmentExpression
- the assignment expression which triggered this call- Returns:
boolean
false if the extension does not handle this assignment, true otherwise
-
handleIncompatibleReturnType
public boolean handleIncompatibleReturnType(ReturnStatement returnStatement, ClassNode inferredReturnType)Description copied from class:TypeCheckingExtension
Allows the extension to catch incompatible return types. This event is called whenever the type checker finds that an inferred return type is incompatible with the declared return type of a method.- Overrides:
handleIncompatibleReturnType
in classTypeCheckingExtension
- Parameters:
returnStatement
- the statement that triggered the errorinferredReturnType
- the inferred return type for this statement- Returns:
- false if the extension doesn't handle the error, true otherwise
-
handleMissingMethod
public java.util.List<MethodNode> handleMissingMethod(ClassNode receiver, java.lang.String name, ArgumentListExpression argumentList, ClassNode[] argumentTypes, MethodCall call)Description copied from class:TypeCheckingExtension
This method is called by the type checker when a method call cannot be resolved. Extensions may override this method to handle missing methods and prevent the type checker from throwing an error.- Overrides:
handleMissingMethod
in classTypeCheckingExtension
- Parameters:
receiver
- the type of the receivername
- the name of the called methodargumentList
- the list of arguments of the callargumentTypes
- the types of the arguments of the callcall
- the method call itself, if needed- Returns:
- an empty list if the extension cannot resolve the method, or a list of potential methods if the extension finds candidates. This method must not return null.
-
handleAmbiguousMethods
public java.util.List<MethodNode> handleAmbiguousMethods(java.util.List<MethodNode> nodes, Expression origin)Description copied from class:TypeCheckingExtension
This method is called by the type checker before throwing an "ambiguous method" error, giving the chance to the extension to select the method properly. This means that when this method is called, the "nodes" parameter contains at least two methods. If the returned list still contains at least two methods, then the type checker will throw an ambiguous method call error. If the returned method contains 1 element, then the type checker will not throw any error. It is invalid to return an empty list.- Overrides:
handleAmbiguousMethods
in classTypeCheckingExtension
- Parameters:
nodes
- the list of ambiguous methodsorigin
- the expression which originated the method selection process- Returns:
- a single element list of disambiguated selection, or more elements if still ambiguous. It is not allowed to return an empty list.
-