Package org.codehaus.groovy.ast.tools
Class GenericsUtils
java.lang.Object
org.codehaus.groovy.ast.tools.GenericsUtils
Utility methods to deal with parameterized types.
- 
Field SummaryFields
- 
Constructor SummaryConstructors
- 
Method SummaryModifier and TypeMethodDescriptionaddMethodGenerics(MethodNode node, Map<String, ClassNode> oldSpec) static GenericsType[]alignGenericTypes(GenericsType[] redirectGenericTypes, GenericsType[] parameterizedTypes, GenericsType[] alignmentTarget) Deprecated, for removal: This API element is subject to removal in a future version.You shouldn't call this method because it is inherently unreliable.static GenericsType[]applyGenericsContextToPlaceHolders(Map<String, ClassNode> genericsSpec, GenericsType[] oldPlaceHolders) Transforms generics types from an old context to a new context using the given spec.static GenericsTypebuildWildcardType(ClassNode... upperBounds) Generates a wildcard generic type in order to be used for checks against class nodes.static voidClears the parameterized type cache.static ClassNodecorrectToGenericsSpec(Map<String, ClassNode> genericsSpec, ClassNode type) static ClassNodecorrectToGenericsSpec(Map<String, ClassNode> genericsSpec, GenericsType type) static MethodNodecorrectToGenericsSpec(Map<String, ClassNode> genericsSpec, MethodNode mn) static ClassNodecorrectToGenericsSpecRecurse(Map<String, ClassNode> genericsSpec, ClassNode type) static ClassNode[]correctToGenericsSpecRecurse(Map<String, ClassNode> genericsSpec, ClassNode[] types) static ClassNodecorrectToGenericsSpecRecurse(Map<String, ClassNode> genericsSpec, ClassNode type, List<String> exclusions) createGenericsSpec(ClassNode type) createGenericsSpec(ClassNode type, Map<String, ClassNode> oldSpec) extractPlaceholders(ClassNode type) Returns the type parameter/argument relationships of the specified type.static voidextractPlaceholders(ClassNode type, Map<GenericsType.GenericsTypeName, GenericsType> placeholders) Populates the supplied map with the type parameter/argument relationships of the specified type.static voidstatic ClassNodefindActualTypeByGenericsPlaceholderName(String placeholderName, Map<GenericsType, GenericsType> genericsPlaceholderAndTypeMap) Deprecated, for removal: This API element is subject to removal in a future version.static ClassNodefindParameterizedType(ClassNode genericsClass, ClassNode actualType) Convenience method forfindParameterizedType(ClassNode,ClassNode,boolean)withtryToFindExactTypeset tofalse.static ClassNodefindParameterizedType(ClassNode genericsClass, ClassNode actualType, boolean tryToFindExactType) Gets the parameterized type by searching the whole class hierarchy according to generics class and actual receiver.static ClassNodefindParameterizedTypeFromCache(ClassNode genericsClass, ClassNode actualType) Convenience method forfindParameterizedTypeFromCache(ClassNode,ClassNode,boolean)withtryToFindExactTypeset tofalse.static ClassNodefindParameterizedTypeFromCache(ClassNode genericsClass, ClassNode actualType, boolean tryToFindExactType) Try to get the parameterized type from the cache.static ClassNodegetSuperClass(ClassNode type, ClassNode target) static booleanhasNonPlaceHolders(ClassNode type) Checks if the type has any non-placeholder (aka resolved) generics.static booleanhasPlaceHolders(ClassNode type) Checks if the type has any placeholder (aka unresolved) generics.static booleanChecks for any placeholder (aka unresolved) generics.static ClassNodemakeClassSafe(Class klass) static ClassNodemakeClassSafe0(ClassNode type, GenericsType... genericTypes) static ClassNodemakeClassSafeWithGenerics(Class klass, ClassNode genericsType) static ClassNodemakeClassSafeWithGenerics(ClassNode type, GenericsType... genericTypes) static Map<GenericsType,GenericsType> makeDeclaringAndActualGenericsTypeMap(ClassNode declaringClass, ClassNode actualReceiver) Deprecated, for removal: This API element is subject to removal in a future version.static Map<GenericsType,GenericsType> makeDeclaringAndActualGenericsTypeMapOfExactType(ClassNode declaringClass, ClassNode actualReceiver) Deprecated, for removal: This API element is subject to removal in a future version.static ClassNodestatic ClassNodenonGeneric(ClassNode type) static ClassNodeparameterizeInterfaceGenerics(ClassNode hint, ClassNode target) Deprecated, for removal: This API element is subject to removal in a future version.Use #parameterizeType insteadparameterizeSAM(ClassNode samType) Gets the parameter and return types of the abstract method of SAM.static ClassNodeparameterizeType(ClassNode hint, ClassNode target) Interface class nodes retrieved fromClassNode.getInterfaces()orClassNode.getAllInterfaces()are returned with generic type arguments.static ClassNode[]parseClassNodesFromString(String option, SourceUnit sourceUnit, CompilationUnit compilationUnit, MethodNode mn, ASTNode usage) static StringtoGenericTypesString(GenericsType[] genericsTypes) 
- 
Field Details- 
EMPTY_GENERICS_ARRAY- Since:
- 2.0.0
 
- 
JAVA_LANG_OBJECT- Since:
- 3.0.0
- See Also:
 
 
- 
- 
Constructor Details- 
GenericsUtilspublic GenericsUtils()
 
- 
- 
Method Details- 
alignGenericTypes@Deprecated(forRemoval=true, since="2.3.0") public static GenericsType[] alignGenericTypes(GenericsType[] redirectGenericTypes, GenericsType[] parameterizedTypes, GenericsType[] alignmentTarget) Deprecated, for removal: This API element is subject to removal in a future version.You shouldn't call this method because it is inherently unreliable.Given a parameterized type and a generic type information, aligns actual type parameters. For example, if a class uses generic type<T,U,V> (redirectGenericTypes), is used with actual type parameters<java.lang.String, U,V> , then a class or interface using generic types<T,V> will be aligned to<java.lang.String,V> - Parameters:
- redirectGenericTypes- the type arguments or the redirect class node
- parameterizedTypes- the actual type arguments used on this class node
- alignmentTarget- the generic type arguments to which we want to align to
- Returns:
- aligned type arguments
- Since:
- 2.0.0
 
- 
buildWildcardTypeGenerates a wildcard generic type in order to be used for checks against class nodes. SeeGenericsType.isCompatibleWith(ClassNode).- Since:
- 2.0.0
 
- 
extractPlaceholdersReturns the type parameter/argument relationships of the specified type.- Since:
- 2.0.0
 
- 
extractPlaceholderspublic static void extractPlaceholders(ClassNode type, Map<GenericsType.GenericsTypeName, GenericsType> placeholders) Populates the supplied map with the type parameter/argument relationships of the specified type.- Since:
- 2.0.0
 
- 
toGenericTypesString- Since:
- 3.0.0
 
- 
parameterizeInterfaceGenerics@Deprecated(forRemoval=true, since="2.5.0") public static ClassNode parameterizeInterfaceGenerics(ClassNode hint, ClassNode target) Deprecated, for removal: This API element is subject to removal in a future version.Use #parameterizeType insteadInterface class nodes retrieved fromClassNode.getInterfaces()orClassNode.getAllInterfaces()are returned with generic type arguments. This method allows returning a parameterized interface given the parameterized class node which implements this interface.- Parameters:
- hint- the class node where generics types are parameterized
- target- the interface we want to parameterize generics types
- Returns:
- a parameterized interface class node
- Since:
- 2.0.0
 
- 
parameterizeTypeInterface class nodes retrieved fromClassNode.getInterfaces()orClassNode.getAllInterfaces()are returned with generic type arguments. This method allows returning a parameterized interface given the parameterized class node which implements this interface.- Parameters:
- hint- the ClassNode where generics types are parameterized
- target- the interface we want to parameterize generics types
- Returns:
- a parameterized interface ClassNode
- Since:
- 2.1.0
 
- 
nonGeneric- Since:
- 2.3.0
 
- 
newClass- Since:
- 2.3.0
 
- 
makeClassSafe- Since:
- 2.3.0
 
- 
makeClassSafeWithGenerics- Since:
- 2.4.0
 
- 
makeClassSafe0- Since:
- 2.3.0
 
- 
makeClassSafeWithGenerics- Since:
- 2.3.0
 
- 
correctToGenericsSpec- Since:
- 2.3.0
 
- 
correctToGenericsSpecRecursepublic static ClassNode correctToGenericsSpecRecurse(Map<String, ClassNode> genericsSpec, ClassNode type) - Since:
- 2.3.0
 
- 
correctToGenericsSpecRecursepublic static ClassNode[] correctToGenericsSpecRecurse(Map<String, ClassNode> genericsSpec, ClassNode[] types) - Since:
- 2.4.1
 
- 
correctToGenericsSpecRecursepublic static ClassNode correctToGenericsSpecRecurse(Map<String, ClassNode> genericsSpec, ClassNode type, List<String> exclusions) - Since:
- 2.4.1
 
- 
correctToGenericsSpecpublic static ClassNode correctToGenericsSpec(Map<String, ClassNode> genericsSpec, GenericsType type) - Since:
- 2.3.0
 
- 
correctToGenericsSpec- Since:
- 2.3.0
 
- 
createGenericsSpec- Since:
- 2.4.0
 
- 
createGenericsSpecpublic static Map<String,ClassNode> createGenericsSpec(ClassNode type, Map<String, ClassNode> oldSpec) - Since:
- 2.3.0
 
- 
addMethodGenericspublic static Map<String,ClassNode> addMethodGenerics(MethodNode node, Map<String, ClassNode> oldSpec) - Since:
- 2.4.1
 
- 
extractSuperClassGenericspublic static void extractSuperClassGenerics(ClassNode type, ClassNode target, Map<String, ClassNode> spec) - Since:
- 2.3.1
 
- 
getSuperClass- Since:
- 3.0.0
 
- 
parseClassNodesFromStringpublic static ClassNode[] parseClassNodesFromString(String option, SourceUnit sourceUnit, CompilationUnit compilationUnit, MethodNode mn, ASTNode usage) - Since:
- 2.4.0
 
- 
applyGenericsContextToPlaceHolderspublic static GenericsType[] applyGenericsContextToPlaceHolders(Map<String, ClassNode> genericsSpec, GenericsType[] oldPlaceHolders) Transforms generics types from an old context to a new context using the given spec. This method assumes all generics types will be placeholders. WARNING: The resulting generics types may or may not be placeholders after the transformation.- Parameters:
- genericsSpec- the generics context information spec
- oldPlaceHolders- the old placeholders
- Returns:
- the new generics types
- Since:
- 2.5.0
 
- 
clearParameterizedTypeCachepublic static void clearParameterizedTypeCache()Clears the parameterized type cache.It is useful to IDE as the type being compiled are continuously being edited/altered; see GROOVY-8675 - Since:
- 3.0.0
 
- 
findParameterizedTypeFromCachepublic static ClassNode findParameterizedTypeFromCache(ClassNode genericsClass, ClassNode actualType) Convenience method forfindParameterizedTypeFromCache(ClassNode,ClassNode,boolean)withtryToFindExactTypeset tofalse.- Since:
- 3.0.0
 
- 
findParameterizedTypeFromCachepublic static ClassNode findParameterizedTypeFromCache(ClassNode genericsClass, ClassNode actualType, boolean tryToFindExactType) Try to get the parameterized type from the cache.If no cached item found, cache and return the result of findParameterizedType(ClassNode,ClassNode,boolean).- Since:
- 3.0.0
 
- 
findParameterizedTypeConvenience method forfindParameterizedType(ClassNode,ClassNode,boolean)withtryToFindExactTypeset tofalse.- Since:
- 3.0.0
 
- 
findParameterizedTypepublic static ClassNode findParameterizedType(ClassNode genericsClass, ClassNode actualType, boolean tryToFindExactType) Gets the parameterized type by searching the whole class hierarchy according to generics class and actual receiver.findParameterizedTypeFromCache(ClassNode,ClassNode,boolean)is strongly recommended for better performance.- Since:
- 3.0.0
 
- 
makeDeclaringAndActualGenericsTypeMap@Deprecated(forRemoval=true, since="5.0.0") public static Map<GenericsType,GenericsType> makeDeclaringAndActualGenericsTypeMap(ClassNode declaringClass, ClassNode actualReceiver) Deprecated, for removal: This API element is subject to removal in a future version.map declaring generics type to actual generics type, e.g. GROOVY-7204: declaring generics types: T, S extends Serializable actual generics types : String, Long the result map is [ T: String, S: Long ] The resolved types can not help us to choose methods correctly if the argument is a string: T: Object, S: Serializable so we need actual types: T: String, S: Long- Since:
- 3.0.0
 
- 
makeDeclaringAndActualGenericsTypeMapOfExactType@Deprecated(forRemoval=true, since="5.0.0") public static Map<GenericsType,GenericsType> makeDeclaringAndActualGenericsTypeMapOfExactType(ClassNode declaringClass, ClassNode actualReceiver) Deprecated, for removal: This API element is subject to removal in a future version.The method is similar withmakeDeclaringAndActualGenericsTypeMap(ClassNode, ClassNode), The main difference is that the method will try to map all placeholders found to the relevant exact types, but the other will not try even if the parameterized type has placeholders- Parameters:
- declaringClass- the generics class node declaring the generics types
- actualReceiver- the subclass class node
- Returns:
- the placeholder-to-actualtype mapping
- Since:
- 3.0.0
 
- 
hasNonPlaceHoldersChecks if the type has any non-placeholder (aka resolved) generics.- Since:
- 3.0.0
 
- 
hasPlaceHoldersChecks if the type has any placeholder (aka unresolved) generics.- Since:
- 3.0.0
 
- 
hasUnresolvedGenericsChecks for any placeholder (aka unresolved) generics.- Since:
- 4.0.0
 
- 
parameterizeSAMGets the parameter and return types of the abstract method of SAM. If the abstract method is not parameterized, we will get generics placeholders, e.g. T, U For example, the abstract method ofFunctionisR apply(T t);We parameterize the above interface asFunction<String, Integer>, then the abstract method will beInteger apply(String t);When we callparameterizeSAMon the ClassNodeFunction<String, Integer>, we can get parameter types and return type of the above abstract method, i.e. ClassNodeClassHelper.STRING_TYPEandClassHelper.Integer_TYPE- Parameters:
- samType- the class node which contains only one abstract method
- Since:
- 3.0.0
 
- 
findActualTypeByGenericsPlaceholderName@Deprecated(forRemoval=true, since="5.0.0") public static ClassNode findActualTypeByGenericsPlaceholderName(String placeholderName, Map<GenericsType, GenericsType> genericsPlaceholderAndTypeMap) Deprecated, for removal: This API element is subject to removal in a future version.Gets the actual type according to the placeholder name.- Parameters:
- placeholderName- the placeholder name (i.e. "T", "E", etc.)
- genericsPlaceholderAndTypeMap- the result of- makeDeclaringAndActualGenericsTypeMap(org.codehaus.groovy.ast.ClassNode, org.codehaus.groovy.ast.ClassNode)
- Since:
- 3.0.0
 
 
-