Class Node
- java.lang.Object
-
- com.github.javaparser.ast.Node
-
- All Implemented Interfaces:
NodeWithRange<Node>
,NodeWithTokenRange<Node>
,Observable
,Visitable
,HasParentNode<Node>
,Cloneable
- Direct Known Subclasses:
ArrayCreationLevel
,BodyDeclaration
,CatchClause
,Comment
,CompilationUnit
,Expression
,ImportDeclaration
,MemberValuePair
,ModuleDeclaration
,ModuleStmt
,Name
,PackageDeclaration
,Parameter
,SimpleName
,Statement
,Type
,VariableDeclarator
public abstract class Node extends Object implements Cloneable, HasParentNode<Node>, Visitable, NodeWithRange<Node>, NodeWithTokenRange<Node>
Base class for all nodes of the abstract syntax tree.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 Classes Modifier and Type Class Description static class
Node.ObserverRegistrationMode
Different registration mode for observers on nodes.static class
Node.Parsedness
-
Field Summary
Fields Modifier and Type Field Description static int
ABSOLUTE_BEGIN_LINE
static int
ABSOLUTE_END_LINE
static Comparator<NodeWithRange<?>>
NODE_BY_BEGIN_POSITION
This can be used to sort nodes on position.protected static PrettyPrinterConfiguration
prettyPrinterNoCommentsConfiguration
-
Constructor Summary
Constructors Modifier Constructor Description protected
Node(TokenRange tokenRange)
-
Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description void
addOrphanComment(Comment comment)
Node
clone()
protected void
customInitialization()
Called in every constructor for node specific code.boolean
equals(Object obj)
List<Comment>
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 NodeList<Node>
getChildNodes()
Contains all nodes that have this node set as their parent.<N extends Node>
List<N>getChildNodesByType(Class<N> clazz)
Recursively finds all nodes of a certain type.Optional<Comment>
getComment()
This is a comment associated with this node.<M> M
getData(DataKey<M> key)
Gets data for this component using the given key.NodeMetaModel
getMetaModel()
List<NodeList<?>>
getNodeLists()
The list of NodeLists owned by this node.<N extends Node>
List<N>getNodesByType(Class<N> clazz)
Deprecated.use getChildNodesByTypeList<Comment>
getOrphanComments()
This is a list of Comment which are inside the node and are not associated with any meaningful AST Node.Optional<Node>
getParentNode()
Return the parent node or null, if no parent is set.Node
getParentNodeForChildren()
this for everything except NodeLists.Node.Parsedness
getParsed()
Optional<Range>
getRange()
Optional<TokenRange>
getTokenRange()
boolean
hasComment()
Deprecated.use getComment().isPresent()int
hashCode()
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
remove(Node node)
Node
removeComment()
void
removeForced()
Forcibly removes this node from the AST.boolean
removeOrphanComment(Comment comment)
boolean
replace(Node node)
Try to replace this node in the parent with the supplied node.boolean
replace(Node node, Node replacementNode)
protected void
setAsParentNodeOf(Node childNode)
protected void
setAsParentNodeOf(NodeList<? extends Node> list)
Node
setBlockComment(String comment)
Use this to store additional information to this node.Node
setComment(Comment comment)
Use this to store additional information to this node.<M> void
setData(DataKey<M> key, M object)
Sets data for this component using the given key.Node
setLineComment(String comment)
Use this to store additional information to this node.Node
setParentNode(Node newParentNode)
Assign a new parent to this node, removing it from the list of children of the previous parent, if any.Node
setParsed(Node.Parsedness parsed)
Used by the parser to flag unparsable nodes.Node
setRange(Range range)
Node
setTokenRange(TokenRange tokenRange)
String
toString()
Return the String representation of this node.String
toString(PrettyPrinterConfiguration prettyPrinterConfiguration)
void
tryAddImportToParentCompilationUnit(Class<?> clazz)
void
unregister(AstObserver observer)
Unregister an observer.-
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface com.github.javaparser.HasParentNode
getAncestorOfType
-
Methods inherited from interface com.github.javaparser.ast.nodeTypes.NodeWithRange
containsWithin, getBegin, getEnd, isPositionedAfter, isPositionedBefore
-
-
-
-
Field Detail
-
NODE_BY_BEGIN_POSITION
public static Comparator<NodeWithRange<?>> NODE_BY_BEGIN_POSITION
This can be used to sort nodes on position.
-
prettyPrinterNoCommentsConfiguration
protected static final PrettyPrinterConfiguration prettyPrinterNoCommentsConfiguration
-
ABSOLUTE_BEGIN_LINE
public static final int ABSOLUTE_BEGIN_LINE
- See Also:
- Constant Field Values
-
ABSOLUTE_END_LINE
public static final int ABSOLUTE_END_LINE
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
Node
protected Node(TokenRange tokenRange)
-
-
Method Detail
-
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.
-
getComment
@Generated("com.github.javaparser.generator.core.node.PropertyGenerator") public Optional<Comment> getComment()
This is a comment associated with this node.- Returns:
- comment property
-
getRange
public Optional<Range> getRange()
- Specified by:
getRange
in interfaceNodeWithRange<Node>
- Returns:
- the range of characters in the source code that this node covers.
-
getTokenRange
public Optional<TokenRange> getTokenRange()
- Specified by:
getTokenRange
in interfaceNodeWithTokenRange<Node>
- Returns:
- the range of tokens that this node covers.
-
setTokenRange
public Node setTokenRange(TokenRange tokenRange)
- Specified by:
setTokenRange
in interfaceNodeWithTokenRange<Node>
-
setRange
public Node setRange(Range range)
- 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
public final Node setComment(Comment comment)
Use this to store additional information to this node.- Parameters:
comment
- to be set
-
setLineComment
public final Node setLineComment(String comment)
Use this to store additional information to this node.- Parameters:
comment
- to be set
-
setBlockComment
public final Node setBlockComment(String comment)
Use this to store additional information to this node.- Parameters:
comment
- to be set
-
toString
public final String toString()
Return the String representation of this node.
-
toString
public final String toString(PrettyPrinterConfiguration prettyPrinterConfiguration)
-
getParentNode
public Optional<Node> getParentNode()
Description copied from interface:HasParentNode
Return the parent node or null, if no parent is set.- Specified by:
getParentNode
in interfaceHasParentNode<Node>
-
getChildNodes
public List<Node> getChildNodes()
Contains all nodes that have this node set as their parent. You can add nodes to it by setting a node's parent to this node. You can remove nodes from it by setting a child node's parent to something other than this node.- Returns:
- all nodes that have this node as their parent.
-
addOrphanComment
public void addOrphanComment(Comment comment)
-
removeOrphanComment
public boolean removeOrphanComment(Comment comment)
-
getOrphanComments
public List<Comment> 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
public List<Comment> 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
public Node setParentNode(Node newParentNode)
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
protected void setAsParentNodeOf(Node childNode)
-
hasComment
@Deprecated public boolean hasComment()
Deprecated.use getComment().isPresent()
-
tryAddImportToParentCompilationUnit
public void tryAddImportToParentCompilationUnit(Class<?> clazz)
-
getChildNodesByType
public <N extends Node> List<N> getChildNodesByType(Class<N> clazz)
Recursively finds all nodes of a certain type.- Parameters:
clazz
- the type of node to find.
-
getNodesByType
@Deprecated public <N extends Node> List<N> getNodesByType(Class<N> clazz)
Deprecated.use getChildNodesByType
-
getData
public <M> M getData(DataKey<M> key)
Gets data for this component using the given key.- Type Parameters:
M
- The type of the data.- Parameters:
key
- The key for the data- Returns:
- The data or null of no data was found for the given key
- See Also:
DataKey
-
setData
public <M> void setData(DataKey<M> key, M object)
Sets data for this component 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
-
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
public boolean replace(Node node)
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
public Node getParentNodeForChildren()
Description copied from interface:HasParentNode
this for everything except NodeLists. NodeLists use their parent as their children parent.- Specified by:
getParentNodeForChildren
in interfaceHasParentNode<Node>
-
notifyPropertyChange
public <P> void notifyPropertyChange(ObservableProperty property, P oldValue, P newValue)
-
unregister
public void unregister(AstObserver observer)
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
public void register(AstObserver observer)
Description copied from interface:Observable
Register an observer.- Specified by:
register
in interfaceObservable
-
register
public void register(AstObserver observer, Node.ObserverRegistrationMode mode)
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
public void registerForSubtree(AstObserver observer)
Register the observer for the current node and all the contained node and nodelists, recursively.
-
isRegistered
public boolean isRegistered(AstObserver observer)
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
@Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") public boolean remove(Node node)
-
removeComment
@Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") public Node removeComment()
-
clone
@Generated("com.github.javaparser.generator.core.node.CloneGenerator") public Node clone()
-
getMetaModel
@Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator") public NodeMetaModel getMetaModel()
- Returns:
- get JavaParser specific node introspection information.
-
getParsed
public Node.Parsedness getParsed()
- Returns:
- whether this node was successfully parsed or not. If it was not, only the range and tokenRange fields will be valid.
-
setParsed
public Node setParsed(Node.Parsedness parsed)
Used by the parser to flag unparsable nodes.
-
replace
@Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") public boolean replace(Node node, Node replacementNode)
-
-