Class Traits


  • public abstract class Traits
    extends Object
    A collection of utility methods used to deal with traits.
    Since:
    2.3.0
    • Field Detail

      • IMPLEMENTED_CLASSNODE

        public static final ClassNode IMPLEMENTED_CLASSNODE
      • TRAITBRIDGE_CLASSNODE

        public static final ClassNode TRAITBRIDGE_CLASSNODE
      • TRAIT_CLASS

        public static final Class<Trait> TRAIT_CLASS
      • TRAIT_CLASSNODE

        public static final ClassNode TRAIT_CLASSNODE
      • GENERATED_PROXY_CLASSNODE

        public static final ClassNode GENERATED_PROXY_CLASSNODE
      • SELFTYPE_CLASSNODE

        public static final ClassNode SELFTYPE_CLASSNODE
    • Constructor Detail

      • Traits

        public Traits()
    • Method Detail

      • findStaticFieldHelper

        public static ClassNode findStaticFieldHelper​(ClassNode trait)
      • isTrait

        public static boolean isTrait​(ClassNode cNode)
        Returns true if the specified class node is a trait.
        Parameters:
        cNode - a class node to test
        Returns:
        true if the classnode represents a trait
      • isTrait

        public static boolean isTrait​(Class<?> clazz)
        Returns true if the specified class is a trait.
        Parameters:
        clazz - a class to test
        Returns:
        true if the classnode represents a trait
      • isAnnotatedWithTrait

        public static boolean isAnnotatedWithTrait​(ClassNode cNode)
        Returns true if the specified class node is annotated with the Trait interface.
        Parameters:
        cNode - a class node
        Returns:
        true if the specified class node is annotated with the Trait interface.
      • hasDefaultImplementation

        public static boolean hasDefaultImplementation​(MethodNode method)
        Indicates whether a method in a trait interface has a default implementation.
        Parameters:
        method - a method node
        Returns:
        true if the method has a default implementation in the trait
      • hasDefaultImplementation

        public static boolean hasDefaultImplementation​(Method method)
        Indicates whether a method in a trait interface has a default implementation.
        Parameters:
        method - a method node
        Returns:
        true if the method has a default implementation in the trait
      • isBridgeMethod

        public static boolean isBridgeMethod​(Method someMethod)
        Reflection API to indicate whether some method is a bridge method to the default implementation of a trait.
        Parameters:
        someMethod - a method node
        Returns:
        null if it is not a method implemented in a trait. If it is, returns the method from the trait class.
      • getBridgeMethodTarget

        public static Method getBridgeMethodTarget​(Method someMethod)
        Reflection API to find the method corresponding to the default implementation of a trait, given a bridge method.
        Parameters:
        someMethod - a method node
        Returns:
        null if it is not a method implemented in a trait. If it is, returns the method from the trait class.
      • getAsType

        public static <T> T getAsType​(Object self,
                                      Class<T> clazz)
        Converts a class implementing some trait into a target class. If the trait is a dynamic proxy and that the target class is assignable to the target object of the proxy, then the target object is returned. Otherwise, falls back to DefaultGroovyMethods.asType(java.lang.Object, Class)
        Parameters:
        self - an object to be coerced to some class
        clazz - the class to be coerced to
        Returns:
        the object coerced to the target class, or the proxy instance if it is compatible with the target class.
      • decomposeSuperCallName

        public static String[] decomposeSuperCallName​(String origName)
        Returns the name of a method without the super trait specific prefix. If the method name doesn't correspond to a super trait method call, the result will be null.
        Parameters:
        origName - the name of a method
        Returns:
        null if the name doesn't start with the super trait prefix, otherwise the name without the prefix
      • collectAllInterfacesReverseOrder

        public static LinkedHashSet<ClassNode> collectAllInterfacesReverseOrder​(ClassNode cNode,
                                                                                LinkedHashSet<ClassNode> interfaces)
        Collects all interfaces of a class node, but reverses the order of the declaration of direct interfaces of this class node. This is used to make sure a trait implementing A,B where both A and B have the same method will take the method from B (latest), aligning the behavior with categories.
        Parameters:
        cNode - a class node
        interfaces - ordered set of interfaces
      • collectSelfTypes

        public static LinkedHashSet<ClassNode> collectSelfTypes​(ClassNode receiver,
                                                                LinkedHashSet<ClassNode> selfTypes)
        Collects all the self types that a type should extend or implement, given the traits is implements. Collects from interfaces and superclasses too.
        Parameters:
        receiver - a class node that may implement a trait
        selfTypes - a set where the self types will be put
        Returns:
        the selfTypes collection
        Since:
        2.4.0
      • collectSelfTypes

        public static LinkedHashSet<ClassNode> collectSelfTypes​(ClassNode receiver,
                                                                LinkedHashSet<ClassNode> selfTypes,
                                                                boolean checkInterfaces,
                                                                boolean checkSuperClass)
        Collects all the self types that a type should extend or implement, given the traits is implements.
        Parameters:
        receiver - a class node that may implement a trait
        selfTypes - a set where the self types will be put
        checkInterfaces - should the interfaces that the node implements be collected too
        checkSuperClass - should we collect from the superclass too
        Returns:
        the selfTypes collection
        Since:
        2.4.0
      • findTraits

        public static List<ClassNode> findTraits​(ClassNode cNode)
        Find all traits associated with the given type.
        Parameters:
        cNode - the given classnode
        Returns:
        the list of ordered trait classnodes