Class AbstractNode

  • All Implemented Interfaces:
    Node
    Direct Known Subclasses:
    AbstractJjtreeNode

    public abstract class AbstractNode
    extends Object
    implements Node
    Base class for all implementations of the Node interface.

    Please use the Node interface wherever possible and not this class, unless you're compelled to do so.

    Note that nearly all methods of the Node interface will have default implementations with PMD 7.0.0, so that it will not be necessary to extend this class directly.

    • Field Detail

      • beginLine

        @Deprecated
        protected int beginLine
        Deprecated.
        This will be removed to delegate to the tokens for nodes that are backed by tokens.
      • endLine

        @Deprecated
        protected int endLine
        Deprecated.
        This will be removed to delegate to the tokens for nodes that are backed by tokens.
      • beginColumn

        @Deprecated
        protected int beginColumn
        Deprecated.
        This will be removed to delegate to the tokens for nodes that are backed by tokens.
      • endColumn

        @Deprecated
        protected int endColumn
        Deprecated.
        This will be removed to delegate to the tokens for nodes that are backed by tokens.
    • Constructor Detail

      • AbstractNode

        public AbstractNode​(int id)
      • AbstractNode

        public AbstractNode​(int id,
                            int theBeginLine,
                            int theEndLine,
                            int theBeginColumn,
                            int theEndColumn)
    • Method Detail

      • getParent

        public Node getParent()
        Description copied from interface: Node
        Returns the parent of this node, or null if this is the root of the tree.

        This method should be preferred to Node.jjtGetParent().

        Specified by:
        getParent in interface Node
        Returns:
        The parent of this node
      • getIndexInParent

        public int getIndexInParent()
        Description copied from interface: Node
        Returns the index of this node in its parent's children. If this node is a root node, returns -1.

        This method replaces Node.jjtGetChildIndex(), whose name was JJTree-specific.

        Specified by:
        getIndexInParent in interface Node
        Returns:
        The index of this node in its parent's children
      • getChild

        public Node getChild​(int index)
        Description copied from interface: Node
        Returns the child of this node at the given index.
        Specified by:
        getChild in interface Node
      • getNumChildren

        public int getNumChildren()
        Description copied from interface: Node
        Returns the number of children of this node.
        Specified by:
        getNumChildren in interface Node
      • isSingleLine

        @Deprecated
        public boolean isSingleLine()
        Deprecated.
        This is never used and is trivial, will be removed from this class.
      • jjtOpen

        @Deprecated
        @InternalApi
        public void jjtOpen()
        Deprecated.
        Description copied from interface: Node
        This method is called after the node has been made the current node. It indicates that child nodes can now be added to it.
        Specified by:
        jjtOpen in interface Node
      • jjtClose

        @Deprecated
        @InternalApi
        public void jjtClose()
        Deprecated.
        Description copied from interface: Node
        This method is called after all the child nodes have been added.
        Specified by:
        jjtClose in interface Node
      • jjtSetParent

        @Deprecated
        @InternalApi
        public void jjtSetParent​(Node parent)
        Deprecated.
        Description copied from interface: Node
        Sets the parent of this node.
        Specified by:
        jjtSetParent in interface Node
        Parameters:
        parent - The parent
      • jjtGetParent

        @Deprecated
        public Node jjtGetParent()
        Deprecated.
        Description copied from interface: Node
        Returns the parent of this node.
        Specified by:
        jjtGetParent in interface Node
        Returns:
        The parent of the node
      • jjtAddChild

        @Deprecated
        @InternalApi
        public void jjtAddChild​(Node child,
                                int index)
        Deprecated.
        Description copied from interface: Node
        This method tells the node to add its argument to the node's list of children.
        Specified by:
        jjtAddChild in interface Node
        Parameters:
        child - The child to add
        index - The index to which the child will be added
      • jjtSetChildIndex

        @Deprecated
        @InternalApi
        public void jjtSetChildIndex​(int index)
        Deprecated.
        Description copied from interface: Node
        Sets the index of this node from the perspective of its parent. This means: this.getParent().getChild(index) == this.
        Specified by:
        jjtSetChildIndex in interface Node
        Parameters:
        index - the child index
      • jjtGetChildIndex

        @Deprecated
        public int jjtGetChildIndex()
        Deprecated.
        Description copied from interface: Node
        Gets the index of this node in the children of its parent.
        Specified by:
        jjtGetChildIndex in interface Node
        Returns:
        The index of the node
      • jjtGetChild

        @Deprecated
        public Node jjtGetChild​(int index)
        Deprecated.
        Description copied from interface: Node
        This method returns a child node. The children are numbered from zero, left to right.
        Specified by:
        jjtGetChild in interface Node
        Parameters:
        index - the child index. Must be nonnegative and less than Node.jjtGetNumChildren().
      • jjtGetNumChildren

        @Deprecated
        public int jjtGetNumChildren()
        Deprecated.
        Description copied from interface: Node
        Returns the number of children the node has.
        Specified by:
        jjtGetNumChildren in interface Node
      • jjtGetId

        @Deprecated
        public int jjtGetId()
        Deprecated.
        Will be made protected with 7.0.0.
        Specified by:
        jjtGetId in interface Node
      • getImage

        public String getImage()
        Description copied from interface: Node
        Returns a string token, usually filled-in by the parser, which describes some textual characteristic of this node. This is usually an identifier, but you should check that using the Designer. On most nodes though, this method returns null.
        Specified by:
        getImage in interface Node
      • hasImageEqualTo

        public boolean hasImageEqualTo​(String image)
        Description copied from interface: Node
        Returns true if this node's image is equal to the given string.
        Specified by:
        hasImageEqualTo in interface Node
        Parameters:
        image - The image to check
      • getBeginLine

        public int getBeginLine()
        Specified by:
        getBeginLine in interface Node
      • testingOnlySetBeginLine

        @Deprecated
        @InternalApi
        public void testingOnlySetBeginLine​(int i)
        Deprecated.
        This will be removed with 7.0.0
      • getBeginColumn

        public int getBeginColumn()
        Specified by:
        getBeginColumn in interface Node
      • testingOnlySetBeginColumn

        @Deprecated
        @InternalApi
        public void testingOnlySetBeginColumn​(int i)
        Deprecated.
        This will be removed with 7.0.0
      • getEndLine

        public int getEndLine()
        Specified by:
        getEndLine in interface Node
      • testingOnlySetEndLine

        @Deprecated
        @InternalApi
        public void testingOnlySetEndLine​(int i)
        Deprecated.
        This will be removed with 7.0.0
      • getEndColumn

        public int getEndColumn()
        Specified by:
        getEndColumn in interface Node
      • testingOnlySetEndColumn

        @Deprecated
        @InternalApi
        public void testingOnlySetEndColumn​(int i)
        Deprecated.
        This will be removed with 7.0.0
      • getNthParent

        public Node getNthParent​(int n)
        Description copied from interface: Node
        Returns the n-th parent or null if there are less than n ancestors.
        Specified by:
        getNthParent in interface Node
        Parameters:
        n - how many ancestors to iterate over.
        Returns:
        the n-th parent or null.
      • getFirstParentOfType

        public <T> T getFirstParentOfType​(Class<T> parentType)
        Description copied from interface: Node
        Traverses up the tree to find the first parent instance of type parentType or one of its subclasses.
        Specified by:
        getFirstParentOfType in interface Node
        Type Parameters:
        T - The type you want to find
        Parameters:
        parentType - Class literal of the type you want to find
        Returns:
        Node of type parentType. Returns null if none found.
      • getParentsOfType

        public <T> List<T> getParentsOfType​(Class<T> parentType)
        Description copied from interface: Node
        Traverses up the tree to find all of the parent instances of type parentType or one of its subclasses. The nodes are ordered deepest-first.
        Specified by:
        getParentsOfType in interface Node
        Type Parameters:
        T - The type you want to find
        Parameters:
        parentType - Class literal of the type you want to find
        Returns:
        List of parentType instances found.
      • getFirstParentOfAnyType

        @SafeVarargs
        @Deprecated
        public final <T> T getFirstParentOfAnyType​(Class<? extends T>... parentTypes)
        Deprecated.
        Description copied from interface: Node
        Gets the first parent that's an instance of any of the given types.
        Specified by:
        getFirstParentOfAnyType in interface Node
        Type Parameters:
        T - Most specific common type of the parameters
        Parameters:
        parentTypes - Types to look for
        Returns:
        The first parent with a matching type. Returns null if there is no such parent
      • findDescendantsOfType

        public <T> List<T> findDescendantsOfType​(Class<? extends T> targetType)
        Description copied from interface: Node
        Traverses down the tree to find all the descendant instances of type descendantType without crossing find boundaries.
        Specified by:
        findDescendantsOfType in interface Node
        Parameters:
        targetType - class which you want to find.
        Returns:
        List of all children of type targetType. Returns an empty list if none found.
      • findDescendantsOfType

        public <T> List<T> findDescendantsOfType​(Class<T> targetType,
                                                 boolean crossBoundaries)
        Description copied from interface: Node
        Traverses down the tree to find all the descendant instances of type descendantType.
        Specified by:
        findDescendantsOfType in interface Node
        Parameters:
        targetType - class which you want to find.
        crossBoundaries - if false, recursion stops for nodes for which Node.isFindBoundary() is true
        Returns:
        List of all matching descendants
      • findDescendantsOfType

        @Deprecated
        public <T> void findDescendantsOfType​(Class<T> targetType,
                                              List<T> results,
                                              boolean crossBoundaries)
        Deprecated.
        Use findDescendantsOfType(Class, boolean) instead, which returns a result list.
        Description copied from interface: Node
        Traverses down the tree to find all the descendant instances of type descendantType.
        Specified by:
        findDescendantsOfType in interface Node
        Parameters:
        targetType - class which you want to find.
        results - list to store the matching descendants
        crossBoundaries - if false, recursion stops for nodes for which Node.isFindBoundary() is true
      • findChildrenOfType

        public <T> List<T> findChildrenOfType​(Class<T> targetType)
        Description copied from interface: Node
        Traverses the children to find all the instances of type childType or one of its subclasses.
        Specified by:
        findChildrenOfType in interface Node
        Parameters:
        targetType - class which you want to find.
        Returns:
        List of all children of type childType. Returns an empty list if none found.
        See Also:
        if traversal of the entire tree is needed.
      • isFindBoundary

        public boolean isFindBoundary()
        Description copied from interface: Node
        Returns true if this node is considered a boundary by traversal methods. Traversal methods such as Node.getFirstDescendantOfType(Class) don't look past such boundaries by default, which is usually the expected thing to do. For example, in Java, lambdas and nested classes are considered find boundaries.

        Note: This attribute is deprecated for XPath queries. It is not useful for XPath queries and will be removed with PMD 7.0.0.

        Specified by:
        isFindBoundary in interface Node
      • getAsDocument

        @Deprecated
        public Document getAsDocument()
        Deprecated.
        Description copied from interface: Node
        Get a DOM Document which contains Elements and Attributes representative of this Node and it's children. Essentially a DOM tree representation of the Node AST, thereby allowing tools which can operate upon DOM to also indirectly operate on the AST.
        Specified by:
        getAsDocument in interface Node
      • appendElement

        protected void appendElement​(Node parentNode)
      • getFirstDescendantOfType

        public <T> T getFirstDescendantOfType​(Class<T> descendantType)
        Description copied from interface: Node
        Traverses down the tree to find the first descendant instance of type descendantType without crossing find boundaries.
        Specified by:
        getFirstDescendantOfType in interface Node
        Parameters:
        descendantType - class which you want to find.
        Returns:
        Node of type descendantType. Returns null if none found.
      • getFirstChildOfType

        public <T> T getFirstChildOfType​(Class<T> childType)
        Description copied from interface: Node
        Traverses the children to find the first instance of type childType.
        Specified by:
        getFirstChildOfType in interface Node
        Parameters:
        childType - class which you want to find.
        Returns:
        Node of type childType. Returns null if none found.
        See Also:
        if traversal of the entire tree is needed.
      • hasDescendantOfType

        public final <T> boolean hasDescendantOfType​(Class<T> type)
        Description copied from interface: Node
        Finds if this node contains a descendant of the given type without crossing find boundaries.
        Specified by:
        hasDescendantOfType in interface Node
        Parameters:
        type - the node type to search
        Returns:
        true if there is at least one descendant of the given type
      • hasDecendantOfAnyType

        @Deprecated
        public final boolean hasDecendantOfAnyType​(Class<?>... types)
        Deprecated.
        Returns true if this node has a descendant of any type among the provided types.
        Parameters:
        types - Types to test
      • hasDescendantOfAnyType

        @Deprecated
        public final boolean hasDescendantOfAnyType​(Class<?>... types)
        Deprecated.
        This is implemented inefficiently, with PMD 7 Node streams will provide a better alternative. We cannot ensure binary compatibility because the methods on 7.0 expect at least one class type, by requiring one Class parameter before the varargs (Effective Java 2nd ed., Item 42).
        Returns true if this node has a descendant of any type among the provided types.
        Parameters:
        types - Types to test
      • findChildNodesWithXPath

        public List<Node> findChildNodesWithXPath​(String xpathString)
                                           throws org.jaxen.JaxenException
        Description copied from interface: Node
        Returns all the nodes matching the xpath expression.
        Specified by:
        findChildNodesWithXPath in interface Node
        Parameters:
        xpathString - the expression to check
        Returns:
        List of all matching nodes. Returns an empty list if none found.
        Throws:
        org.jaxen.JaxenException - if the xpath is incorrect or fails altogether
      • hasDescendantMatchingXPath

        public boolean hasDescendantMatchingXPath​(String xpathString)
        Description copied from interface: Node
        Checks whether at least one descendant matches the xpath expression.
        Specified by:
        hasDescendantMatchingXPath in interface Node
        Parameters:
        xpathString - the expression to check
        Returns:
        true if there is a match
      • getUserData

        @Deprecated
        public Object getUserData()
        Deprecated.
        Description copied from interface: Node
        Get the user data associated with this node. By default there is no data, unless it has been set via Node.setUserData(Object).
        Specified by:
        getUserData in interface Node
        Returns:
        The user data set on this node.
      • setUserData

        @Deprecated
        public void setUserData​(Object userData)
        Deprecated.
        Description copied from interface: Node
        Set the user data associated with this node.

        PMD itself will never set user data onto a node. Nor should any Rule implementation, as the AST nodes are shared between concurrently executing Rules (i.e. it is not thread-safe).

        This API is most useful for external applications looking to leverage PMD's robust support for AST structures, in which case application specific annotations on the AST nodes can be quite useful.

        Specified by:
        setUserData in interface Node
        Parameters:
        userData - The data to set on this node.
      • jjtGetFirstToken

        @Deprecated
        public GenericToken jjtGetFirstToken()
        Deprecated.
        Not all nodes are based on tokens, and this is an implementation detail
      • jjtSetFirstToken

        @Deprecated
        public void jjtSetFirstToken​(GenericToken token)
        Deprecated.
        This is JJTree-specific and will be removed from this superclass.
      • jjtGetLastToken

        @Deprecated
        public GenericToken jjtGetLastToken()
        Deprecated.
        Not all nodes are based on tokens, and this is an implementation detail
      • jjtSetLastToken

        @Deprecated
        public void jjtSetLastToken​(GenericToken token)
        Deprecated.
        This is JJTree-specific and will be removed from this superclass.
      • children

        public Iterable<? extends Node> children()
        Description copied from interface: Node
        Returns an iterable enumerating the children of this node. Use it with a foreach loop:
        
              for (Node child : node.children()) {
                  // process child
              }
         

        This method's return type will be changed to NodeStream in PMD 7, which is a more powerful kind of iterable. The change will be source compatible.

        Specified by:
        children in interface Node
        Returns:
        A new iterable for the children of this node
      • remove

        @Deprecated
        @InternalApi
        public void remove()
        Deprecated.
        This is internal API
        Description copied from interface: Node
        Remove the current node from its parent.
        Specified by:
        remove in interface Node
      • removeChildAtIndex

        @Deprecated
        @InternalApi
        public void removeChildAtIndex​(int childIndex)
        Deprecated.
        This is internal API
        Description copied from interface: Node
        This method tells the node to remove the child node at the given index from the node's list of children, if any; if not, no changes are done.
        Specified by:
        removeChildAtIndex in interface Node
        Parameters:
        childIndex - The index of the child to be removed
      • getXPathNodeName

        public String getXPathNodeName()
        Gets the name of the node that is used to match it with XPath queries.

        This default implementation adds compatibility with the previous way to get the xpath node name, which used Object.toString().

        Please override it. It will be removed in version 7.0.0.

        Specified by:
        getXPathNodeName in interface Node
        Returns:
        The XPath node name
      • toString

        @Deprecated
        public String toString()
        Deprecated.
        The equivalence between toString and a node's name could be broken as soon as release 7.0.0. Use getXPathNodeName for that purpose. The use for debugging purposes is not deprecated.
        Overrides:
        toString in class Object
      • getXPathAttributesIterator

        public Iterator<Attribute> getXPathAttributesIterator()
        Description copied from interface: Node
        Returns an iterator enumerating all the attributes that are available from XPath for this node.
        Specified by:
        getXPathAttributesIterator in interface Node
        Returns:
        An attribute iterator for this node