Interface Node
-
- All Superinterfaces:
Reportable
- All Known Subinterfaces:
AntlrNode<N>
,CommentNode
,GenericNode<N>
,JjtreeNode<N>
,RootNode
,ScopedNode
,TextAvailableNode
,TextNode
- All Known Implementing Classes:
AbstractJjtreeNode
,AbstractNode
,BaseAntlrErrorNode
,BaseAntlrInnerNode
,BaseAntlrNode
,BaseAntlrTerminalNode
,PlainTextLanguage.PlainTextFile
public interface Node extends Reportable
Root interface for all AST nodes. This interface provides only the API shared by all AST implementations in PMD language modules. This includes for now:- Tree traversal methods:
getParent()
,getIndexInParent()
,getChild(int)
, andgetNumChildren()
. These four basic operations are used to implement more specific traversal operations, likefirstChild(Class)
, andNodeStream
s. - The API used to describe nodes in a form understandable by XPath expressions:
getXPathNodeName()
,getXPathAttributesIterator()
- Location metadata:
getReportLocation()
- An extensible metadata store:
getUserMap()
Every language implementation must publish a sub-interface of Node which serves as a supertype for all nodes of that language (e.g. pmd-java provides JavaNode, pmd-apex provides ApexNode, etc.). It is assumed in many places that the
getChild(int)
andgetParent()
method return an instance of this sub-interface. For example, no JSP node should have a Java node as its child. Embedding nodes from different languages will not be done via these methods, and conforming implementations should ensure that every node returned by these methods are indeed of the same type.
-
-
Field Summary
Fields Modifier and Type Field Description static Comparator<Node>
COORDS_COMPARATOR
Compares nodes according to their location in the file.
-
Method Summary
All Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description default <P,R>
RacceptVisitor(AstVisitor<? super P,? extends R> visitor, P data)
Calls back the visitor's visit method corresponding to the runtime type of this Node.default NodeStream<? extends Node>
ancestors()
Returns a node stream containing all the strict ancestors of this node, in innermost to outermost order.default <R extends Node>
NodeStream<R>ancestors(Class<? extends R> rClass)
Returns the ancestor stream of this node filtered by the given node type.default NodeStream<? extends Node>
ancestorsOrSelf()
Returns a node stream containing this node and its ancestors.default NodeStream<? extends Node>
asStream()
Returns a node stream containing only this node.default NodeStream<? extends Node>
children()
Returns a node stream containing all the children of this node.default <R extends Node>
NodeStream<R>children(Class<? extends R> rClass)
Returns a node stream of the children of this node that are of the given type.default int
compareLocation(Node other)
Compare the coordinates of this node with the other one as if withCOORDS_COMPARATOR
.default NodeStream.DescendantNodeStream<? extends Node>
descendants()
Returns a node stream containing all the descendants of this node.default <R extends Node>
NodeStream.DescendantNodeStream<R>descendants(Class<? extends R> rClass)
Returns a node stream of the descendants of this node that are of the given type.default NodeStream.DescendantNodeStream<? extends Node>
descendantsOrSelf()
Returns a node stream containing this node, then all its descendants.default <R extends Node>
@Nullable RfirstChild(Class<? extends R> rClass)
Returns the first child of this node that has the given type.default AstInfo<? extends RootNode>
getAstInfo()
Returns theAstInfo
for this root node.default int
getBeginColumn()
default int
getBeginLine()
Node
getChild(int index)
Returns the child of this node at the given index.default int
getEndColumn()
default int
getEndLine()
default @Nullable Node
getFirstChild()
Returns the first child of this node, or null if it doesn't exist.default String
getImage()
Returns a string token, usually filled-in by the parser, which describes some textual characteristic of this node.int
getIndexInParent()
Returns the index of this node in its parent's children.default LanguageVersion
getLanguageVersion()
Returns the language version of this node.default @Nullable Node
getLastChild()
Returns the first last of this node, or null if it doesn't exist.default @Nullable Node
getNextSibling()
Returns the next sibling of this node, or null if it does not exist.int
getNumChildren()
Returns the number of children of this node.Node
getParent()
Returns the parent of this node, or null if this is the root of the tree.default @Nullable Node
getPreviousSibling()
Returns the previous sibling of this node, or null if it does not exist.default FileLocation
getReportLocation()
Returns the location at which this element should be reported.default @NonNull RootNode
getRoot()
Returns the root of the tree this node is declared in.default @NonNull TextDocument
getTextDocument()
Returns the text document from which this tree was parsed.TextRegion
getTextRegion()
Returns a region of text delimiting the node in the underlying text document.DataMap<DataMap.DataKey<?,?>>
getUserMap()
Returns a data map used to store additional information on this node.default Iterator<Attribute>
getXPathAttributesIterator()
Returns an iterator enumerating all the attributes that are available from XPath for this node.String
getXPathNodeName()
Gets the name of the node that is used to match it with XPath queries.default boolean
hasImageEqualTo(String image)
Returns true if this node's image is equal to the given string.default boolean
isFindBoundary()
Returns true if this node is considered a boundary by traversal methods.
-
-
-
Field Detail
-
COORDS_COMPARATOR
static final Comparator<Node> COORDS_COMPARATOR
Compares nodes according to their location in the file. Note that this comparator is not consistent with equals (seeComparator
) as some nodes have the same location.
-
-
Method Detail
-
getImage
default String getImage()
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 returnsnull
.Note: This method will be deprecated in the future (#4787). It will be replaced with methods that have more specific names in node classes. In some cases, there are already alternatives available that should be used.
-
hasImageEqualTo
default boolean hasImageEqualTo(String image)
Returns true if this node's image is equal to the given string.Note: This method will be deprecated in the future (#4787). See
getImage()
.- Parameters:
image
- The image to check
-
compareLocation
default int compareLocation(Node other)
Compare the coordinates of this node with the other one as if withCOORDS_COMPARATOR
. The result is useless if both nodes are not from the same tree.- Parameters:
other
- Other node- Returns:
- A positive integer if this node comes AFTER the other, 0 if they have the same position, a negative integer if this node comes BEFORE the other
-
getReportLocation
default FileLocation getReportLocation()
Returns the location at which this element should be reported.Use this instead of
getBeginColumn()
/getBeginLine()
, etc. This is not necessarily the exact boundaries of the node in the text. Nodes that can provide exact position information do so using aTextRegion
, by implementingTextAvailableNode
.Use this instead of
getBeginColumn()
/getBeginLine()
, etc.- Specified by:
getReportLocation
in interfaceReportable
-
getTextRegion
TextRegion getTextRegion()
Returns a region of text delimiting the node in the underlying text document. This does not necessarily match thereport location
.
-
getBeginLine
default int getBeginLine()
-
getBeginColumn
default int getBeginColumn()
-
getEndLine
default int getEndLine()
-
getEndColumn
default int getEndColumn()
-
isFindBoundary
@NoAttribute default boolean isFindBoundary()
Returns true if this node is considered a boundary by traversal methods. Traversal methods such asdescendants()
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.- Returns:
- True if this node is a find boundary
- See Also:
NodeStream.DescendantNodeStream.crossFindBoundaries(boolean)
-
getUserMap
DataMap<DataMap.DataKey<?,?>> getUserMap()
Returns a data map used to store additional information on this node.- Returns:
- The user data map of this node
- Since:
- 6.22.0
-
getTextDocument
default @NonNull TextDocument getTextDocument()
Returns the text document from which this tree was parsed. This means, that the whole file text is in memory while the AST is.- Returns:
- The text document
-
getParent
Node getParent()
Returns the parent of this node, or null if this is the root of the tree.- Returns:
- The parent of this node
- Since:
- 6.21.0
-
getChild
Node getChild(int index)
Returns the child of this node at the given index.- Throws:
IndexOutOfBoundsException
- if the index is negative or greater thangetNumChildren()
.- Since:
- 6.21.0
-
getNumChildren
int getNumChildren()
Returns the number of children of this node.- Since:
- 6.21.0
-
getIndexInParent
int getIndexInParent()
Returns the index of this node in its parent's children. If this node is a root node, returns -1.- Returns:
- The index of this node in its parent's children
- Since:
- 6.21.0
-
acceptVisitor
default <P,R> R acceptVisitor(AstVisitor<? super P,? extends R> visitor, P data)
Calls back the visitor's visit method corresponding to the runtime type of this Node. This should usually be preferred to calling avisit
method directly (usually the only calls to those are in the implementations of thisacceptVisitor
method).- Implementation Requirements:
- A typical implementation will check the type of the visitor to
be that of the language specific visitor, then call the most specific
visit method of this Node. This is typically implemented by having
a different override per concrete node class (no shortcuts).
The default implementation calls back
AstVisitor.cannotVisit(Node, Object)
. - Type Parameters:
R
- Return type of the visitorP
- Parameter type of the visitor- Parameters:
visitor
- Visitor to dispatchdata
- Parameter to the visit- Returns:
- What the visitor returned. If this node doesn't recognize
the type of the visitor, returns
visitor.cannotVisit(this, data)
. - Since:
- 7.0.0
-
getAstInfo
default AstInfo<? extends RootNode> getAstInfo()
Returns theAstInfo
for this root node.- Implementation Note:
- This default implementation can not work unless overridden in the root node.
-
getXPathNodeName
String getXPathNodeName()
Gets the name of the node that is used to match it with XPath queries.- Returns:
- The XPath node name
-
getXPathAttributesIterator
default Iterator<Attribute> getXPathAttributesIterator()
Returns an iterator enumerating all the attributes that are available from XPath for this node.- Returns:
- An attribute iterator for this node
- See Also:
AttributeAxisIterator
-
getFirstChild
default @Nullable Node getFirstChild()
Returns the first child of this node, or null if it doesn't exist.- Since:
- 7.0.0
-
getLastChild
default @Nullable Node getLastChild()
Returns the first last of this node, or null if it doesn't exist.- Since:
- 7.0.0
-
getPreviousSibling
default @Nullable Node getPreviousSibling()
Returns the previous sibling of this node, or null if it does not exist.- Since:
- 7.0.0
-
getNextSibling
default @Nullable Node getNextSibling()
Returns the next sibling of this node, or null if it does not exist.- Since:
- 7.0.0
-
asStream
default NodeStream<? extends Node> asStream()
Returns a node stream containing only this node.NodeStream.of(Node)
is a null-safe version of this method.- Returns:
- A node stream containing only this node
- Since:
- 7.0.0
- See Also:
NodeStream.of(Node)
-
children
default NodeStream<? extends Node> children()
Returns a node stream containing all the children of this node. This method does not provide much type safety, you'll probably want to usechildren(Class)
.- Since:
- 7.0.0
- See Also:
NodeStream.children(Class)
-
descendants
default NodeStream.DescendantNodeStream<? extends Node> descendants()
Returns a node stream containing all the descendants of this node. SeeNodeStream.DescendantNodeStream
for details.- Returns:
- A node stream of the descendants of this node
- Since:
- 7.0.0
- See Also:
NodeStream.descendants()
-
descendantsOrSelf
default NodeStream.DescendantNodeStream<? extends Node> descendantsOrSelf()
Returns a node stream containing this node, then all its descendants. SeeNodeStream.DescendantNodeStream
for details.- Returns:
- A node stream of the whole subtree topped by this node
- Since:
- 7.0.0
- See Also:
NodeStream.descendantsOrSelf()
-
ancestors
default NodeStream<? extends Node> ancestors()
Returns a node stream containing all the strict ancestors of this node, in innermost to outermost order. The returned stream doesn't contain this node, and is empty if this node has no parent.- Returns:
- A node stream of the ancestors of this node
- Since:
- 7.0.0
- See Also:
NodeStream.ancestors()
-
ancestorsOrSelf
default NodeStream<? extends Node> ancestorsOrSelf()
Returns a node stream containing this node and its ancestors. The nodes of the returned stream are yielded in a depth-first fashion.- Returns:
- A stream of ancestors
- Since:
- 7.0.0
- See Also:
NodeStream.ancestorsOrSelf()
-
children
default <R extends Node> NodeStream<R> children(Class<? extends R> rClass)
Returns a node stream of the children of this node that are of the given type.- Type Parameters:
R
- Type of node the returned stream should contain- Parameters:
rClass
- Type of node the returned stream should contain- Returns:
- A new node stream
- Since:
- 7.0.0
- See Also:
NodeStream.children(Class)
-
firstChild
default <R extends Node> @Nullable R firstChild(Class<? extends R> rClass)
Returns the first child of this node that has the given type. Returns null if no such child exists.If you want to process this element as a node stream, use
asStream().firstChild(rClass)
instead, which returns a node stream.- Type Parameters:
R
- Type of the child to find- Parameters:
rClass
- Type of the child to find- Returns:
- A child, or null
- Since:
- 7.0.0
-
descendants
default <R extends Node> NodeStream.DescendantNodeStream<R> descendants(Class<? extends R> rClass)
Returns a node stream of the descendants of this node that are of the given type. SeeNodeStream.DescendantNodeStream
for details.- Type Parameters:
R
- Type of node the returned stream should contain- Parameters:
rClass
- Type of node the returned stream should contain- Returns:
- A new node stream
- Since:
- 7.0.0
- See Also:
NodeStream.descendants(Class)
-
ancestors
default <R extends Node> NodeStream<R> ancestors(Class<? extends R> rClass)
Returns the ancestor stream of this node filtered by the given node type.- Type Parameters:
R
- Type of node the returned stream should contain- Parameters:
rClass
- Type of node the returned stream should contain- Returns:
- A new node stream
- Since:
- 7.0.0
- See Also:
NodeStream.ancestors(Class)
-
getRoot
default @NonNull RootNode getRoot()
Returns the root of the tree this node is declared in.- Since:
- 7.0.0
-
getLanguageVersion
default LanguageVersion getLanguageVersion()
Returns the language version of this node.
-
-