Class StaticTypeCheckingSupport
java.lang.Object
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport
public abstract class StaticTypeCheckingSupport
extends java.lang.Object
Support methods for
StaticTypeCheckingVisitor
.-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
StaticTypeCheckingSupport.BooleanArrayStaticTypesHelper
static class
StaticTypeCheckingSupport.ByteArrayStaticTypesHelper
static class
StaticTypeCheckingSupport.CharArrayStaticTypesHelper
static class
StaticTypeCheckingSupport.DoubleArrayStaticTypesHelper
static class
StaticTypeCheckingSupport.FloatArrayStaticTypesHelper
static class
StaticTypeCheckingSupport.IntArrayStaticTypesHelper
static class
StaticTypeCheckingSupport.LongArrayStaticTypesHelper
static class
StaticTypeCheckingSupport.ObjectArrayStaticTypesHelper
A DGM-like class which adds support for method calls which are handled specifically by the Groovy compiler.static class
StaticTypeCheckingSupport.ShortArrayStaticTypesHelper
-
Field Summary
Fields Modifier and Type Field Description protected static ClassNode
ArrayList_TYPE
protected static ClassNode
Collection_TYPE
protected static ClassNode
Deprecated_TYPE
protected static java.util.Comparator<MethodNode>
DGM_METHOD_NODE_COMPARATOR
This comparator is used when we return the list of methods from DGM which name correspond to a given name.protected static ExtensionMethodCache
EXTENSION_METHOD_CACHE
protected static ClassNode
GSTRING_STRING_CLASSNODE
protected static ClassNode
LinkedHashMap_TYPE
protected static ClassNode
LinkedHashSet_TYPE
protected static ClassNode
Matcher_TYPE
protected static java.util.Map<java.lang.String,java.lang.Integer>
NUMBER_OPS
protected static java.util.Map<ClassNode,java.lang.Integer>
NUMBER_TYPES
protected static ClassNode
UNKNOWN_PARAMETER_TYPE
This is for internal use only. -
Constructor Summary
Constructors Constructor Description StaticTypeCheckingSupport()
-
Method Summary
Modifier and Type Method Description static int
allParametersAndArgumentsMatch(Parameter[] parameters, ClassNode[] argumentTypes)
Determines if the specific argument types fit the parameters.static boolean
checkCompatibleAssignmentTypes(ClassNode left, ClassNode right)
Returns true or false depending on whether the right classnode can be assigned to the left classnode.static boolean
checkCompatibleAssignmentTypes(ClassNode left, ClassNode right, Expression rightExpression)
static boolean
checkCompatibleAssignmentTypes(ClassNode left, ClassNode right, Expression rightExpression, boolean allowConstructorCoercion)
Everything that can be done bycastToType
should be allowed for assignment.static java.util.List<MethodNode>
chooseBestMethod(ClassNode receiver, java.util.Collection<MethodNode> methods, ClassNode... argumentTypes)
Returns the method(s) which best fit the argument types.static void
clearExtensionMethodCache()
static void
clearExtensionMethodCache(java.lang.ClassLoader loader)
static java.util.Set<ClassNode>
collectAllInterfaces(ClassNode node)
Collects all interfaces of a class node, including those defined by the super class.static java.lang.Object
evaluateExpression(Expression expr, CompilerConfiguration config)
Evaluates expressions as found in annotation parameters.static java.lang.Object
evaluateExpression(Expression expr, CompilerConfiguration config, GroovyClassLoader loader)
Evaluates expressions as found in annotation parameters.static java.util.List<MethodNode>
filterMethodsByVisibility(java.util.List<MethodNode> methodNodeList, ClassNode enclosingClassNode)
Filter methods according to visibilitystatic java.util.List<MethodNode>
findDGMMethodsByNameAndArguments(java.lang.ClassLoader loader, ClassNode receiver, java.lang.String name, ClassNode[] args)
static java.util.List<MethodNode>
findDGMMethodsByNameAndArguments(java.lang.ClassLoader loader, ClassNode receiver, java.lang.String name, ClassNode[] args, java.util.List<MethodNode> methods)
static java.util.List<MethodNode>
findDGMMethodsByNameAndArguments(ClassNode receiver, java.lang.String name, ClassNode[] args)
Deprecated.static java.util.List<MethodNode>
findDGMMethodsByNameAndArguments(ClassNode receiver, java.lang.String name, ClassNode[] args, java.util.List<MethodNode> methods)
Deprecated.static java.util.Set<MethodNode>
findDGMMethodsForClassNode(java.lang.ClassLoader loader, ClassNode clazz, java.lang.String name)
protected static void
findDGMMethodsForClassNode(java.lang.ClassLoader loader, ClassNode clazz, java.lang.String name, java.util.TreeSet<MethodNode> accumulator)
protected static java.util.Set<MethodNode>
findDGMMethodsForClassNode(ClassNode clazz, java.lang.String name)
Deprecated.protected static void
findDGMMethodsForClassNode(ClassNode clazz, java.lang.String name, java.util.TreeSet<MethodNode> accumulator)
Deprecated.static java.util.List<MethodNode>
findSetters(ClassNode cn, java.lang.String setterName, boolean voidOnly)
protected static Variable
findTargetVariable(VariableExpression ve)
Given a variable expression, returns the ultimately accessed variable.protected static GenericsType
fullyResolve(GenericsType gt, java.util.Map<GenericsType.GenericsTypeName,GenericsType> placeholders)
Given a generics type representing SomeClass<T,V> and a resolved placeholder map, returns a new generics type for which placeholders are resolved recursively.protected static ClassNode
fullyResolveType(ClassNode type, java.util.Map<GenericsType.GenericsTypeName,GenericsType> placeholders)
static ClassNode
getCorrectedClassNode(ClassNode type, ClassNode superClass, boolean handlingGenerics)
static boolean
implementsInterfaceOrIsSubclassOf(ClassNode type, ClassNode superOrInterface)
protected static boolean
isArrayAccessExpression(Expression expression)
Returns true for expressions of the form x[...]static boolean
isAssignableTo(ClassNode type, ClassNode toBeAssignedTo)
Checks if a class node is assignable to another.static boolean
isAssignment(int op)
static boolean
isBeingCompiled(ClassNode node)
static boolean
isClassClassNodeWrappingConcreteType(ClassNode classNode)
Returns true if the class node represents a the class node for the Class class and if the parametrized type is a neither a placeholder or a wildcard.static boolean
isCompareToBoolean(int op)
static boolean
isGStringOrGStringStringLUB(ClassNode node)
static boolean
isParameterizedWithGStringOrGStringString(ClassNode node)
static boolean
isParameterizedWithString(ClassNode node)
static ClassNode
isTraitSelf(VariableExpression vexp)
static boolean
isUnboundedWildcard(GenericsType gt)
static boolean
isUsingGenericsOrIsArrayUsingGenerics(ClassNode cn)
Returns true if a class node makes use of generic types.static boolean
isUsingUncheckedGenerics(ClassNode node)
Returns true if the provided class node, when considered as a receiver of a message or as a parameter, is using a placeholder in its generics type.static boolean
isWildcardLeftHandSide(ClassNode node)
Tells if a class is one of the "accept all" classes as the left hand side of an assignment.static boolean
isWithCall(java.lang.String name, Expression arguments)
Called on method call checks in order to determine if a method call corresponds to the idiomatic o.with { ...static boolean
missesGenericsTypes(ClassNode cn)
Determines if node is a raw type or references any generics placeholders.static Parameter[]
parameterizeArguments(ClassNode receiver, MethodNode m)
Given a receiver and a method node, parameterize the method arguments using available generic type information.static ClassNode
resolveClassNodeGenerics(java.util.Map<GenericsType.GenericsTypeName,GenericsType> resolvedPlaceholders, java.util.Map<GenericsType.GenericsTypeName,GenericsType> placeholdersFromContext, ClassNode currentType)
protected static boolean
typeCheckMethodArgumentWithGenerics(ClassNode parameterType, ClassNode argumentType, boolean lastArg)
Checks that the parameterized generics of an argument are compatible with the generics of the parameter.protected static boolean
typeCheckMethodsWithGenerics(ClassNode receiver, ClassNode[] argumentTypes, MethodNode candidateMethod)
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Field Details
-
Matcher_TYPE
-
ArrayList_TYPE
-
Collection_TYPE
-
Deprecated_TYPE
-
LinkedHashMap_TYPE
-
LinkedHashSet_TYPE
-
NUMBER_TYPES
-
NUMBER_OPS
protected static final java.util.Map<java.lang.String,java.lang.Integer> NUMBER_OPS -
GSTRING_STRING_CLASSNODE
-
UNKNOWN_PARAMETER_TYPE
This is for internal use only. When an argument method is null, we cannot determine its type, so we use this one as a wildcard. -
DGM_METHOD_NODE_COMPARATOR
This comparator is used when we return the list of methods from DGM which name correspond to a given name. As we also lookup for DGM methods of superclasses or interfaces, it may be possible to find two methods which have the same name and the same arguments. In that case, we should not add the method from superclass or interface otherwise the system won't be able to select the correct method, resulting in an ambiguous method selection for similar methods. -
EXTENSION_METHOD_CACHE
-
-
Constructor Details
-
StaticTypeCheckingSupport
public StaticTypeCheckingSupport()
-
-
Method Details
-
clearExtensionMethodCache
public static void clearExtensionMethodCache() -
clearExtensionMethodCache
public static void clearExtensionMethodCache(java.lang.ClassLoader loader) -
isArrayAccessExpression
Returns true for expressions of the form x[...]- Parameters:
expression
- an expression- Returns:
- true for array access expressions
-
isWithCall
Called on method call checks in order to determine if a method call corresponds to the idiomatic o.with { ... } structure- Parameters:
name
- name of the method calledarguments
- method call arguments- Returns:
- true if the name is "with" and arguments consist of a single closure
-
findTargetVariable
Given a variable expression, returns the ultimately accessed variable.- Parameters:
ve
- a variable expression- Returns:
- the target variable
-
findDGMMethodsForClassNode
@Deprecated protected static java.util.Set<MethodNode> findDGMMethodsForClassNode(ClassNode clazz, java.lang.String name)Deprecated. -
findDGMMethodsForClassNode
public static java.util.Set<MethodNode> findDGMMethodsForClassNode(java.lang.ClassLoader loader, ClassNode clazz, java.lang.String name) -
findDGMMethodsForClassNode
@Deprecated protected static void findDGMMethodsForClassNode(ClassNode clazz, java.lang.String name, java.util.TreeSet<MethodNode> accumulator)Deprecated. -
findDGMMethodsForClassNode
protected static void findDGMMethodsForClassNode(java.lang.ClassLoader loader, ClassNode clazz, java.lang.String name, java.util.TreeSet<MethodNode> accumulator) -
allParametersAndArgumentsMatch
public static int allParametersAndArgumentsMatch(Parameter[] parameters, ClassNode[] argumentTypes)Determines if the specific argument types fit the parameters.- Returns:
- -1 if arguments do not match, 0 if arguments are of the exact type, and > 0 when one or more argument is not of the exact type but still match
-
isAssignableTo
Checks if a class node is assignable to another. This is used for example in assignment checks where you want to verify that the assignment is valid.- Returns:
- true if the class node is assignable to the other class node, false otherwise
-
isCompareToBoolean
public static boolean isCompareToBoolean(int op) -
isAssignment
public static boolean isAssignment(int op) -
checkCompatibleAssignmentTypes
Returns true or false depending on whether the right classnode can be assigned to the left classnode. This method should not add errors by itself: we let the caller decide what to do if an incompatible assignment is found.- Parameters:
left
- the class to be assigned toright
- the assignee class- Returns:
- false if types are incompatible
-
checkCompatibleAssignmentTypes
public static boolean checkCompatibleAssignmentTypes(ClassNode left, ClassNode right, Expression rightExpression) -
checkCompatibleAssignmentTypes
public static boolean checkCompatibleAssignmentTypes(ClassNode left, ClassNode right, Expression rightExpression, boolean allowConstructorCoercion)Everything that can be done bycastToType
should be allowed for assignment. -
isWildcardLeftHandSide
Tells if a class is one of the "accept all" classes as the left hand side of an assignment.- Parameters:
node
- the classnode to test- Returns:
- true if it's an Object, String, boolean, Boolean or Class.
-
isBeingCompiled
-
implementsInterfaceOrIsSubclassOf
-
findDGMMethodsByNameAndArguments
@Deprecated public static java.util.List<MethodNode> findDGMMethodsByNameAndArguments(ClassNode receiver, java.lang.String name, ClassNode[] args)Deprecated. -
findDGMMethodsByNameAndArguments
public static java.util.List<MethodNode> findDGMMethodsByNameAndArguments(java.lang.ClassLoader loader, ClassNode receiver, java.lang.String name, ClassNode[] args) -
findDGMMethodsByNameAndArguments
@Deprecated public static java.util.List<MethodNode> findDGMMethodsByNameAndArguments(ClassNode receiver, java.lang.String name, ClassNode[] args, java.util.List<MethodNode> methods)Deprecated. -
findDGMMethodsByNameAndArguments
public static java.util.List<MethodNode> findDGMMethodsByNameAndArguments(java.lang.ClassLoader loader, ClassNode receiver, java.lang.String name, ClassNode[] args, java.util.List<MethodNode> methods) -
isUsingUncheckedGenerics
Returns true if the provided class node, when considered as a receiver of a message or as a parameter, is using a placeholder in its generics type. In this case, we're facing unchecked generics and type checking is limited (ex: void foo(Set s) { s.keySet() }- Parameters:
node
- the node to test- Returns:
- true if it is using any placeholder in generics types
-
chooseBestMethod
public static java.util.List<MethodNode> chooseBestMethod(ClassNode receiver, java.util.Collection<MethodNode> methods, ClassNode... argumentTypes)Returns the method(s) which best fit the argument types.- Returns:
- zero or more results
-
parameterizeArguments
Given a receiver and a method node, parameterize the method arguments using available generic type information.- Parameters:
receiver
- the classm
- the method- Returns:
- the parameterized arguments
-
isUsingGenericsOrIsArrayUsingGenerics
Returns true if a class node makes use of generic types. If the class node represents an array type, then checks if the component type is using generics.- Parameters:
cn
- a class node for which to check if it is using generics- Returns:
- true if the type (or component type) is using generics
-
fullyResolve
protected static GenericsType fullyResolve(GenericsType gt, java.util.Map<GenericsType.GenericsTypeName,GenericsType> placeholders)Given a generics type representing SomeClass<T,V> and a resolved placeholder map, returns a new generics type for which placeholders are resolved recursively. -
fullyResolveType
protected static ClassNode fullyResolveType(ClassNode type, java.util.Map<GenericsType.GenericsTypeName,GenericsType> placeholders) -
typeCheckMethodArgumentWithGenerics
protected static boolean typeCheckMethodArgumentWithGenerics(ClassNode parameterType, ClassNode argumentType, boolean lastArg)Checks that the parameterized generics of an argument are compatible with the generics of the parameter.- Parameters:
parameterType
- the parameter type of a methodargumentType
- the type of the argument passed to the method
-
typeCheckMethodsWithGenerics
protected static boolean typeCheckMethodsWithGenerics(ClassNode receiver, ClassNode[] argumentTypes, MethodNode candidateMethod) -
resolveClassNodeGenerics
public static ClassNode resolveClassNodeGenerics(java.util.Map<GenericsType.GenericsTypeName,GenericsType> resolvedPlaceholders, java.util.Map<GenericsType.GenericsTypeName,GenericsType> placeholdersFromContext, ClassNode currentType) -
getCorrectedClassNode
-
isUnboundedWildcard
-
filterMethodsByVisibility
public static java.util.List<MethodNode> filterMethodsByVisibility(java.util.List<MethodNode> methodNodeList, ClassNode enclosingClassNode)Filter methods according to visibility- Parameters:
methodNodeList
- method nodes to filterenclosingClassNode
- the enclosing class- Returns:
- filtered method nodes
- Since:
- 3.0.0
-
isGStringOrGStringStringLUB
- Returns:
- true if the class node is either a GString or the LUB of String and GString.
-
isParameterizedWithGStringOrGStringString
- Parameters:
node
- the node to be tested- Returns:
- true if the node is using generics types and one of those types is a gstring or string/gstring lub
-
isParameterizedWithString
- Parameters:
node
- the node to be tested- Returns:
- true if the node is using generics types and one of those types is a string
-
missesGenericsTypes
Determines if node is a raw type or references any generics placeholders. -
evaluateExpression
Evaluates expressions as found in annotation parameters. For example, it will evaluate a constant, be it referenced directly as an integer or as a reference to a field.If the expression cannot be evaluated on its own, an exception is thrown.
- Parameters:
expr
- the expression to be evaluatedconfig
- the compiler configuration- Returns:
- the result of the expression
- Throws:
GroovyBugError
-
evaluateExpression
public static java.lang.Object evaluateExpression(Expression expr, CompilerConfiguration config, GroovyClassLoader loader)Evaluates expressions as found in annotation parameters. For example, it will evaluate a constant, be it referenced directly as an integer or as a reference to a field.If the expression cannot be evaluated on its own, an exception is thrown.
- Parameters:
expr
- the expression to be evaluatedconfig
- the compiler configurationloader
- the compiler class loader- Returns:
- the result of the expression
- Throws:
GroovyBugError
-
collectAllInterfaces
Collects all interfaces of a class node, including those defined by the super class.- Parameters:
node
- a class for which we want to retrieve all interfaces- Returns:
- a set of interfaces implemented by this class node
-
isClassClassNodeWrappingConcreteType
Returns true if the class node represents a the class node for the Class class and if the parametrized type is a neither a placeholder or a wildcard. For example, the class node Class<Foo> where Foo is a class would return true, but the class node for Class<?> would return false.- Parameters:
classNode
- a class node to be tested- Returns:
- true if it is the class node for Class and its generic type is a real class
-
findSetters
public static java.util.List<MethodNode> findSetters(ClassNode cn, java.lang.String setterName, boolean voidOnly) -
isTraitSelf
-
findDGMMethodsByNameAndArguments(ClassLoader, ClassNode, String, ClassNode[], List)
instead