Class Node
- All Implemented Interfaces:
NodeWithRange<Node>
,NodeWithTokenRange<Node>
,Observable
,Visitable
,HasParentNode<Node>
,Cloneable
- Direct Known Subclasses:
ArrayCreationLevel
,BodyDeclaration
,CatchClause
,Comment
,CompilationUnit
,Expression
,ImportDeclaration
,MemberValuePair
,Modifier
,ModuleDeclaration
,ModuleDirective
,Name
,PackageDeclaration
,Parameter
,ReceiverParameter
,SimpleName
,Statement
,SwitchEntry
,Type
,VariableDeclarator
Construction
The tree is built by instantiating the required nodes, then adding them to other nodes. If it is the parser who is building the tree, it will use the largest constructor, the one with "range" as the first parameter. If you want to manually instantiate nodes, we suggest to...
- use a convenience method, like "addStatement(...)", or if none are available...
- use a convenient constructor, like ClassOrInterfaceType(String name), or if none are available...
- use the default constructor.
- Alternatively, use one of the JavaParser.parse(snippet) methods.
Parent/child
The parent node field is managed automatically and can be seen as read only. Note that there is only one parent, and trying to use the same node in two places will lead to unexpected behaviour. It is advised to clone() a node before moving it around.
Comments
Each Node can have one associated comment which describes it and a number of "orphan comments" which it contains but are not specifically associated to any child.
Positions
When the parser creates nodes, it sets their source code position in the "range" field. When you manually instantiate nodes, their range is not set. The top left character is position 1, 1. Note that since this is an abstract syntax tree, it leaves out a lot of text from the original source file, like where braces or comma's are exactly. Therefore there is no position information on everything in the original source file.
Observers
It is possible to add observers to the the tree. Any change in the tree is sent as an event to any observers watching.
Visitors
The most comfortable way of working with an abstract syntax tree is using visitors. You can use one of the visitors in the visitor package, or extend one of them. A visitor can be "run" by calling accept on a node:
node.accept(visitor, argument);where argument is an object of your choice (often simply null.)
- Author:
- Julio Vilmar Gesser
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
Performs a breadth-first node traversal starting with a given node.static class
Performs a simple traversal over all nodes that have the passed node as their parent.static class
Different registration mode for observers on nodes.static class
Iterates over the parent of the node, then the parent's parent, then the parent's parent's parent, until running out of parents.static class
static class
Performs a post-order (or leaves-first) node traversal starting with a given node.static class
Performs a pre-order (or depth-first) node traversal starting with a given node.static class
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic int
Deprecated.static int
Deprecated.static DataKey<LineSeparator>
static Comparator<NodeWithRange<?>>
This can be used to sort nodes on position.protected static PrinterConfiguration
static DataKey<SymbolResolver>
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
addOrphanComment(Comment comment)
clone()
boolean
containsData(DataKey<?> key)
protected Printer
protected Printer
createDefaultPrinter(PrinterConfiguration configuration)
protected void
Called in every constructor for node specific code.boolean
Walks the AST with pre-order traversal, returning all nodes of type "nodeType".findAll(Class<T> nodeType, Node.TreeTraversal traversal)
Walks the AST with specified traversal order, returning all nodes of type "nodeType".Walks the AST with pre-order traversal, returning all nodes of type "nodeType" that match the predicate.<T> Optional<T>
findFirst(Node.TreeTraversal traversal, Function<Node,Optional<T>> consumer)
Walks the AST, applying the function for every node, with traversal algorithm "traversal".Walks the AST with pre-order traversal, returning the first node of type "nodeType" or empty() if none is found.Walks the AST with pre-order traversal, returning the first node of type "nodeType" that matches "predicate" or empty() if none is found.Finds the root node of this AST by finding the topmost parent.This is the list of Comment which are contained in the Node either because they are properly associated to one of its children or because they are floating around inside the NodeContains all nodes that have this node set as their parent.getChildNodesByType(Class<N> clazz)
Deprecated.usefindAll(Class)
but be aware that findAll also considers the initial node.This is a comment associated with this node.<M> M
Gets data for this node using the given key.This method was added to support the clone method.protected PrinterConfiguration
getLineEndingStyleOrDefault(LineSeparator defaultLineSeparator)
getNodesByType(Class<N> clazz)
Deprecated.usefindAll(Class)
but be aware that findAll also considers the initial node.This is a list of Comment which are inside the node and are not associated with any meaningful AST Node.Returns the parent node, orOptional.empty
if no parent is set.Returns the parent node from the perspective of the children of this node.protected Printer
protected Printer
getPrinter(PrinterConfiguration configuration)
getRange()
protected SymbolResolver
int
hashCode()
boolean
hasScope()
boolean
isAncestorOf(Node descendant)
Determines whether this node is an ancestor of the given node.boolean
boolean
isRegistered(AstObserver observer)
Was this observer registered? Note that equals is used to determine if the given observer was registered.<P> void
notifyPropertyChange(ObservableProperty property, P oldValue, P newValue)
void
register(AstObserver observer)
Register an observer.void
register(AstObserver observer, Node.ObserverRegistrationMode mode)
Register a new observer for the given node.void
registerForSubtree(AstObserver observer)
Register the observer for the current node and all the contained node and nodelists, recursively.boolean
remove()
Try to remove this node from the parentboolean
void
removeData(DataKey<?> key)
Remove data by key.void
Forcibly removes this node from the AST.boolean
removeOrphanComment(Comment comment)
boolean
Try to replace this node in the parent with the supplied node.boolean
protected void
setAsParentNodeOf(Node childNode)
protected void
setAsParentNodeOf(NodeList<? extends Node> list)
setBlockComment(String comment)
Use this to store additional information to this node.setComment(Comment comment)
Use this to store additional information to this node.<M> void
Sets data for this node using the given key.setLineComment(String comment)
Use this to store additional information to this node.setParentNode(Node newParentNode)
Assign a new parent to this node, removing it from the list of children of the previous parent, if any.setParsed(Node.Parsedness parsed)
Used by the parser to flag unparsable nodes.setTokenRange(TokenRange tokenRange)
stream()
Make a stream of nodes using pre-order traversal.stream(Node.TreeTraversal traversal)
Make a stream of nodes using traversal algorithm "traversal".toString()
toString(PrinterConfiguration configuration)
void
tryAddImportToParentCompilationUnit(Class<?> clazz)
void
unregister(AstObserver observer)
Unregister an observer.void
walk(Node.TreeTraversal traversal, Consumer<Node> consumer)
Walks the AST, calling the consumer for every node, with traversal algorithm "traversal".<T extends Node>
voidWalks the AST with pre-order traversal, calling the consumer for every node of type "nodeType".void
Walks the AST, calling the consumer for every node with pre-order traversal.Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
Methods inherited from interface com.github.javaparser.HasParentNode
findAncestor, findAncestor, hasParentNode, isDescendantOf
Methods inherited from interface com.github.javaparser.ast.nodeTypes.NodeWithRange
containsWithin, containsWithinRange, getBegin, getEnd, hasRange
-
Field Details
-
NODE_BY_BEGIN_POSITION
This can be used to sort nodes on position. -
prettyPrinterNoCommentsConfiguration
-
ABSOLUTE_BEGIN_LINE
Deprecated.- See Also:
- Constant Field Values
-
ABSOLUTE_END_LINE
Deprecated.- See Also:
- Constant Field Values
-
SYMBOL_RESOLVER_KEY
-
LINE_SEPARATOR_KEY
-
PRINTER_KEY
-
PHANTOM_KEY
-
-
Constructor Details
-
Node
-
-
Method Details
-
customInitialization
protected void customInitialization()Called in every constructor for node specific code. It can't be written in the constructor itself because it will be overwritten during code generation. -
getPrinter
-
getPrinter
-
createDefaultPrinter
-
createDefaultPrinter
-
getDefaultPrinterConfiguration
-
getComment
This is a comment associated with this node.- Returns:
- comment property
-
getRange
- Specified by:
getRange
in interfaceNodeWithRange<Node>
- Returns:
- the range of characters in the source code that this node covers.
-
getTokenRange
- Specified by:
getTokenRange
in interfaceNodeWithTokenRange<Node>
- Returns:
- the range of tokens that this node covers.
-
setTokenRange
- Specified by:
setTokenRange
in interfaceNodeWithTokenRange<Node>
-
setRange
- Specified by:
setRange
in interfaceNodeWithRange<Node>
- Parameters:
range
- the range of characters in the source code that this node covers. null can be used to indicate that no range information is known, or that it is not of interest.
-
setComment
Use this to store additional information to this node.- Parameters:
comment
- to be set
-
setLineComment
Use this to store additional information to this node.- Parameters:
comment
- to be set
-
setBlockComment
Use this to store additional information to this node.- Parameters:
comment
- to be set
-
toString
-
toString
- Returns:
- pretty printed source code for this node and its children. Formatting can be configured with parameter PrinterConfiguration.
-
hashCode
public final int hashCode() -
equals
-
getParentNode
Description copied from interface:HasParentNode
Returns the parent node, orOptional.empty
if no parent is set.- Specified by:
getParentNode
in interfaceHasParentNode<Node>
-
getChildNodes
Contains all nodes that have this node set as their parent. You can add and remove nodes from this list by adding or removing nodes from the fields of this node.- Returns:
- all nodes that have this node as their parent.
-
addOrphanComment
-
removeOrphanComment
-
getOrphanComments
This is a list of Comment which are inside the node and are not associated with any meaningful AST Node.For example, comments at the end of methods (immediately before the parenthesis) or at the end of CompilationUnit are orphan comments.
When more than one comment preceeds a statement, the one immediately preceding it it is associated with the statements, while the others are orphans.
Changes to this list are not persisted.
- Returns:
- all comments that cannot be attributed to a concept
-
getAllContainedComments
This is the list of Comment which are contained in the Node either because they are properly associated to one of its children or because they are floating around inside the Node- Returns:
- all Comments within the node as a list
-
setParentNode
Assign a new parent to this node, removing it from the list of children of the previous parent, if any.- Specified by:
setParentNode
in interfaceHasParentNode<Node>
- Parameters:
newParentNode
- node to be set as parent- Returns:
- return
this
-
setAsParentNodeOf
-
tryAddImportToParentCompilationUnit
-
getChildNodesByType
Deprecated.usefindAll(Class)
but be aware that findAll also considers the initial node.Recursively finds all nodes of a certain type.- Parameters:
clazz
- the type of node to find.
-
getNodesByType
Deprecated.usefindAll(Class)
but be aware that findAll also considers the initial node. -
getData
Gets data for this node using the given key.- Type Parameters:
M
- The type of the data.- Parameters:
key
- The key for the data- Returns:
- The data.
- Throws:
IllegalStateException
- if the key was not set in this node.- See Also:
containsData(DataKey)
,DataKey
-
getDataKeys
This method was added to support the clone method.- Returns:
- all known data keys.
-
setData
Sets data for this node using the given key. For information on creating DataKey, seeDataKey
.- Type Parameters:
M
- The type of data- Parameters:
key
- The singleton key for the dataobject
- The data object- See Also:
DataKey
-
containsData
- Returns:
- does this node have data for this key?
- See Also:
DataKey
-
removeData
Remove data by key.- See Also:
DataKey
-
remove
public boolean remove()Try to remove this node from the parent- Returns:
- true if removed, false if it is a required property of the parent, or if the parent isn't set.
- Throws:
RuntimeException
- if it fails in an unexpected way
-
replace
Try to replace this node in the parent with the supplied node.- Returns:
- true if removed, or if the parent isn't set.
- Throws:
RuntimeException
- if it fails in an unexpected way
-
removeForced
public void removeForced()Forcibly removes this node from the AST. If it cannot be removed from the parent with remove(), it will try to remove its parent instead, until it finds a node that can be removed, or no parent can be found.Since everything at CompilationUnit level is removable, this method will only (silently) fail when the node is in a detached AST fragment.
-
getParentNodeForChildren
Description copied from interface:HasParentNode
Returns the parent node from the perspective of the children of this node.That is, this method returns
this
for everything exceptNodeList
. ANodeList
returns its parent node instead. This is because aNodeList
sets the parent of all its children to its own parent node (seeNodeList
for details).- Specified by:
getParentNodeForChildren
in interfaceHasParentNode<Node>
-
setAsParentNodeOf
-
notifyPropertyChange
-
unregister
Description copied from interface:Observable
Unregister an observer. If the given observer was not registered there are no effects.- Specified by:
unregister
in interfaceObservable
-
register
Description copied from interface:Observable
Register an observer.- Specified by:
register
in interfaceObservable
-
register
Register a new observer for the given node. Depending on the mode specified also descendants, existing and new, could be observed. For more details see ObserverRegistrationMode. -
registerForSubtree
Register the observer for the current node and all the contained node and nodelists, recursively. -
isRegistered
Description copied from interface:Observable
Was this observer registered? Note that equals is used to determine if the given observer was registered.- Specified by:
isRegistered
in interfaceObservable
-
remove
-
removeComment
-
clone
-
getMetaModel
- Returns:
- get JavaParser specific node introspection information.
-
getParsed
- Returns:
- whether this node was successfully parsed or not. If it was not, only the range and tokenRange fields will be valid.
-
setParsed
Used by the parser to flag unparsable nodes. -
replace
-
findRootNode
Finds the root node of this AST by finding the topmost parent. -
findCompilationUnit
- Returns:
- the containing CompilationUnit, or empty if this node is not inside a compilation unit.
-
getLineEndingStyleOrDefault
-
getLineEndingStyle
-
getSymbolResolver
-
stream
Make a stream of nodes using traversal algorithm "traversal". -
stream
Make a stream of nodes using pre-order traversal. -
walk
Walks the AST, calling the consumer for every node, with traversal algorithm "traversal".
This is the most general walk method. All other walk and findAll methods are based on this. -
walk
Walks the AST, calling the consumer for every node with pre-order traversal. -
walk
Walks the AST with pre-order traversal, calling the consumer for every node of type "nodeType". -
findAll
Walks the AST with pre-order traversal, returning all nodes of type "nodeType". -
findAll
Walks the AST with specified traversal order, returning all nodes of type "nodeType". -
findAll
Walks the AST with pre-order traversal, returning all nodes of type "nodeType" that match the predicate. -
findFirst
public <T> Optional<T> findFirst(Node.TreeTraversal traversal, Function<Node,Optional<T>> consumer)Walks the AST, applying the function for every node, with traversal algorithm "traversal". If the function returns something else than null, the traversal is stopped and the function result is returned.
This is the most general findFirst method. All other findFirst methods are based on this. -
findFirst
Walks the AST with pre-order traversal, returning the first node of type "nodeType" or empty() if none is found. -
findFirst
Walks the AST with pre-order traversal, returning the first node of type "nodeType" that matches "predicate" or empty() if none is found. -
isAncestorOf
Determines whether this node is an ancestor of the given node. A node is not an ancestor of itself.- Parameters:
descendant
- the node for which to determine whether it has this node as an ancestor.- Returns:
true
if this node is an ancestor of the given node, andfalse
otherwise.- See Also:
HasParentNode.isDescendantOf(Node)
-
hasScope
public boolean hasScope() -
isPhantom
public boolean isPhantom()
-
Position.ABSOLUTE_BEGIN_LINE