public class GroovyTypeCheckingExtensionSupport extends AbstractTypeCheckingExtension
TypeCheckingExtension
,
this class adds a number of utility methods aimed at leveraging the syntax of the Groovy language to improve
expressivity and conciseness.Modifier and Type | Class and Description |
---|---|
static class |
GroovyTypeCheckingExtensionSupport.TypeCheckingDSL |
context, debug, handled
typeCheckingVisitor
Constructor and Description |
---|
GroovyTypeCheckingExtensionSupport(StaticTypeCheckingVisitor typeCheckingVisitor,
String scriptPath,
CompilationUnit compilationUnit)
Builds a type checking extension relying on a Groovy script (type checking DSL).
|
Modifier and Type | Method and 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.
|
List<MethodNode> |
handleAmbiguousMethods(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.
|
List<MethodNode> |
handleMissingMethod(ClassNode receiver,
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.
|
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
addStaticTypeError, buildListType, buildMapType, classNodeFor, classNodeFor, existsProperty, existsProperty, extractStaticReceiver, getArgumentTypes, getTargetMethod, getType, isStaticMethodCallOnClass, lookupClassNodeFor, parameterizedType, storeType
public GroovyTypeCheckingExtensionSupport(StaticTypeCheckingVisitor typeCheckingVisitor, String scriptPath, CompilationUnit compilationUnit)
typeCheckingVisitor
- the type checking visitorscriptPath
- the path to the type checking script (in classpath)compilationUnit
- public void setDebug(boolean debug)
public void setup()
TypeCheckingExtension
setup
in class TypeCheckingExtension
public void finish()
TypeCheckingExtension
finish
in class TypeCheckingExtension
public void onMethodSelection(Expression expression, MethodNode target)
TypeCheckingExtension
onMethodSelection
in class TypeCheckingExtension
expression
- the expression for which a corresponding method has been foundtarget
- the method which has been chosen by the type checkerpublic void afterMethodCall(MethodCall call)
TypeCheckingExtension
TypeCheckingMode.SKIP
.afterMethodCall
in class TypeCheckingExtension
call
- a method call, either a MethodCallExpression
, StaticMethodCallExpression
, or ConstructorCallExpression
public boolean beforeMethodCall(MethodCall call)
TypeCheckingExtension
TypeCheckingMode.SKIP
.beforeMethodCall
in class TypeCheckingExtension
call
- a method call, either a MethodCallExpression
, StaticMethodCallExpression
, or ConstructorCallExpression
public boolean handleUnresolvedVariableExpression(VariableExpression vexp)
TypeCheckingExtension
handleUnresolvedVariableExpression
in class TypeCheckingExtension
vexp
- the unresolved variable extensionboolean
false if the extension doesn't handle it,
true if the extension handles this variable.public boolean handleUnresolvedProperty(PropertyExpression pexp)
TypeCheckingExtension
handleUnresolvedProperty
in class TypeCheckingExtension
pexp
- the unresolved propertyboolean
false if this extension doesn't resolve the property, true
if it resolves the property.public boolean handleUnresolvedAttribute(AttributeExpression aexp)
TypeCheckingExtension
handleUnresolvedAttribute
in class TypeCheckingExtension
aexp
- the unresolved attributeboolean
false if this extension doesn't resolve the attribute, true
if it resolves the attribute.public void afterVisitMethod(MethodNode node)
TypeCheckingExtension
TypeCheckingMode.SKIP
.afterVisitMethod
in class TypeCheckingExtension
node
- a method nodepublic boolean beforeVisitClass(ClassNode node)
TypeCheckingExtension
TypeCheckingMode.SKIP
.beforeVisitClass
in class TypeCheckingExtension
node
- a class nodepublic void afterVisitClass(ClassNode node)
TypeCheckingExtension
TypeCheckingMode.SKIP
.afterVisitClass
in class TypeCheckingExtension
node
- a class nodepublic boolean beforeVisitMethod(MethodNode node)
TypeCheckingExtension
TypeCheckingMode.SKIP
.beforeVisitMethod
in class TypeCheckingExtension
node
- a method nodepublic boolean handleIncompatibleAssignment(ClassNode lhsType, ClassNode rhsType, Expression assignmentExpression)
TypeCheckingExtension
handleIncompatibleAssignment
in class TypeCheckingExtension
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 callboolean
false if the extension does not handle this assignment, true otherwisepublic boolean handleIncompatibleReturnType(ReturnStatement returnStatement, ClassNode inferredReturnType)
TypeCheckingExtension
handleIncompatibleReturnType
in class TypeCheckingExtension
returnStatement
- the statement that triggered the errorinferredReturnType
- the inferred return type for this statementpublic List<MethodNode> handleMissingMethod(ClassNode receiver, String name, ArgumentListExpression argumentList, ClassNode[] argumentTypes, MethodCall call)
TypeCheckingExtension
handleMissingMethod
in class TypeCheckingExtension
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 neededpublic List<MethodNode> handleAmbiguousMethods(List<MethodNode> nodes, Expression origin)
TypeCheckingExtension
handleAmbiguousMethods
in class TypeCheckingExtension
nodes
- the list of ambiguous methodsorigin
- the expression which originated the method selection process