Class ClassNodeUtils

java.lang.Object
org.apache.groovy.ast.tools.ClassNodeUtils

public class ClassNodeUtils extends Object
Utility class for working with ClassNodes
  • Method Details

    • formatTypeName

      public static String formatTypeName(ClassNode cNode)
      Formats a type name into a human-readable version. For arrays, appends "[]" to the formatted type name of the component. For unit class nodes, uses the class node name.
      Parameters:
      cNode - the type to format
      Returns:
      a human-readable version of the type name (java.lang.String[] for example)
    • addGeneratedMethod

      public static MethodNode addGeneratedMethod(ClassNode cNode, String name, int modifiers, ClassNode returnType, Parameter[] parameters, ClassNode[] exceptions, Statement code)
      Returns an existing method if one exists or else create a new method and mark it as @Generated.
      See Also:
    • addGeneratedMethod

      public static void addGeneratedMethod(ClassNode cNode, MethodNode mNode)
      Adds a method and mark it as @Generated.
      See Also:
    • addGeneratedMethod

      public static void addGeneratedMethod(ClassNode cNode, MethodNode mNode, boolean skipChecks)
      Adds a method and mark it as @Generated.
      See Also:
    • addGeneratedInnerClass

      public static void addGeneratedInnerClass(ClassNode cNode, ClassNode inner)
      Adds an inner class that is marked as @Generated.
      See Also:
    • addGeneratedConstructor

      public static ConstructorNode addGeneratedConstructor(ClassNode classNode, int modifiers, Parameter[] parameters, ClassNode[] exceptions, Statement code)
      Adds a method that is marked as @Generated.
      See Also:
    • addGeneratedConstructor

      public static void addGeneratedConstructor(ClassNode classNode, ConstructorNode ctorNode)
      Adds a method that is marked as @Generated.
      See Also:
    • getDeclaredMethodsFromSuper

      public static Map<String,MethodNode> getDeclaredMethodsFromSuper(ClassNode cNode)
      Adds methods from the super class.
      Parameters:
      cNode - The ClassNode
      Returns:
      A map of methods
    • addDeclaredMethodsFromInterfaces

      public static void addDeclaredMethodsFromInterfaces(ClassNode cNode, Map<String,MethodNode> methodsMap)
      Adds methods from all interfaces. Existing entries in the methods map take precedence. Methods from interfaces visited early take precedence over later ones.
      Parameters:
      cNode - The ClassNode
      methodsMap - A map of existing methods to alter
    • getDeclaredMethodsFromInterfaces

      public static Map<String,MethodNode> getDeclaredMethodsFromInterfaces(ClassNode cNode)
      Gets methods from all interfaces. Methods from interfaces visited early take precedence over later ones.
      Parameters:
      cNode - The ClassNode
      Returns:
      A map of methods
    • addDeclaredMethodsFromAllInterfaces

      public static void addDeclaredMethodsFromAllInterfaces(ClassNode cNode, Map<String,MethodNode> methodsMap)
      Adds methods from interfaces and parent interfaces. Existing entries in the methods map take precedence. Methods from interfaces visited early take precedence over later ones.
      Parameters:
      cNode - The ClassNode
      methodsMap - A map of existing methods to alter
    • hasPossibleStaticMethod

      public static boolean hasPossibleStaticMethod(ClassNode cNode, String name, Expression arguments, boolean trySpread)
      Returns true if the given method has a possibly matching static method with the given name and arguments. Handles default arguments and optionally spread expressions.
      Parameters:
      cNode - the ClassNode of interest
      name - the name of the method of interest
      arguments - the arguments to match against
      trySpread - whether to try to account for SpreadExpressions within the arguments
      Returns:
      true if a matching method was found.
    • hasPossibleStaticProperty

      public static boolean hasPossibleStaticProperty(ClassNode cNode, String methodName)
      Returns true if we have a static accessor
    • getPropNameForAccessor

      public static String getPropNameForAccessor(String accessorName)
      Returns the property name, e.g. age, given an accessor name, e.g. getAge. Returns the original if a valid prefix cannot be removed.
      Parameters:
      accessorName - the accessor name of interest, e.g. getAge
      Returns:
      the property name, e.g. age, or original if not a valid property accessor name
    • isValidAccessorName

      public static boolean isValidAccessorName(String accessorName)
      Detects whether the given accessor name starts with "get", "set" or "is" followed by at least one character.
      Parameters:
      accessorName - the accessor name of interest, e.g. getAge
      Returns:
      true if a valid prefix is found
    • isNonSealed

      public static boolean isNonSealed(ClassNode cn)
      Check if the type is declared non-sealed
      Parameters:
      cn - the type
      Returns:
      the check result
    • hasStaticProperty

      public static boolean hasStaticProperty(ClassNode cNode, String propName)
    • getStaticProperty

      public static PropertyNode getStaticProperty(ClassNode cNode, String propName)
      Detects whether a static property with the given name is within the class or a super class.
      Parameters:
      cNode - the ClassNode of interest
      propName - the property name
      Returns:
      the static property if found or else null
    • isInnerClass

      public static boolean isInnerClass(ClassNode cNode)
      Detects whether a given ClassNode is an inner class (non-static).
      Parameters:
      cNode - the ClassNode of interest
      Returns:
      true if the given node is a (non-static) inner class, else false
    • isCompatibleWith

      public static boolean isCompatibleWith(ClassNode source, ClassNode target)
      Checks if the source ClassNode is compatible with the target ClassNode
    • hasNoArgConstructor

      public static boolean hasNoArgConstructor(ClassNode cNode)
    • hasExplicitConstructor

      public static boolean hasExplicitConstructor(AbstractASTTransformation xform, ClassNode cNode)
      Determines if an explicit (non-generated) constructor is in the class.
      Parameters:
      xform - if non-null, add an error if an explicit constructor is found
      cNode - the type of the containing class
      Returns:
      true if an explicit (non-generated) constructor was found
    • samePackageName

      public static boolean samePackageName(ClassNode first, ClassNode second)
      Determines if the given ClassNode values have the same package name.
      Parameters:
      first - a ClassNode
      second - a ClassNode
      Returns:
      true if both given nodes have the same package name
      Throws:
      NullPointerException - if either of the given nodes are null
    • getField

      public static FieldNode getField(ClassNode classNode, String fieldName)
      Searches the class for a field that matches specified name.
      Since:
      3.0.0
    • getField

      public static FieldNode getField(ClassNode classNode, String fieldName, Predicate<? super FieldNode> acceptability)
      Searches the class for a field that matches specified name and test.
      Since:
      4.0.0
    • getMethod

      public static MethodNode getMethod(ClassNode classNode, String methodName, Predicate<? super MethodNode> acceptability)
      Searches the class for a method that matches specified name and test.
      Since:
      5.0.0
    • isSubtype

      public static boolean isSubtype(ClassNode maybeSuperclassOrInterface, ClassNode candidateChild)