Class AstNode
- All Implemented Interfaces:
Comparable<AstNode>
,Iterable<Node>
- Direct Known Subclasses:
ArrayLiteral
,BigIntLiteral
,Block
,CatchClause
,Comment
,ComputedPropertyKey
,ConditionalExpression
,ElementGet
,EmptyExpression
,EmptyStatement
,ErrorNode
,ExpressionStatement
,FunctionCall
,IfStatement
,InfixExpression
,Jump
,KeywordLiteral
,LabeledStatement
,Name
,NumberLiteral
,ObjectLiteral
,ParenthesizedExpression
,RegExpLiteral
,ReturnStatement
,StringLiteral
,SwitchCase
,TaggedTemplateLiteral
,TemplateCharacters
,TemplateLiteral
,ThrowStatement
,TryStatement
,UnaryExpression
,UpdateExpression
,VariableDeclaration
,VariableInitializer
,WithStatement
,XmlFragment
,XmlLiteral
,XmlRef
,Yield
The AstNode
hierarchy sits atop the older Node
class, which was designed for
code generation. The Node
class is a flexible, weakly-typed class suitable for creating
and rewriting code trees, but using it requires you to remember the exact ordering of the child
nodes, which are kept in a linked list. The AstNode
hierarchy is a strongly-typed facade
with named accessors for children and common properties, but under the hood it's still using a
linked list of child nodes. It isn't a very good idea to use the child list directly unless you
know exactly what you're doing. Note that AstNode
records additional information,
including the node's position, length, and parent node. Also, some AstNode
subclasses
record some of their child nodes in instance members, since they are not needed for code
generation. In a nutshell, only the code generator should be mixing and matching AstNode
and Node
objects.
All offset fields in all subclasses of AstNode are relative to their parent. For things like paren, bracket and keyword positions, the position is relative to the current node. The node start position is relative to the parent node.
During the actual parsing, node positions are absolute; adding the node to its parent fixes up
the offsets to be relative. By the time you see the AST (e.g. using the Visitor
interface), the offsets are relative.
AstNode
objects have property lists accessible via the Node.getProp(int)
and Node.putProp(int, java.lang.Object)
methods. The property lists are integer-keyed with arbitrary Object
values. For
the most part the parser generating the AST avoids using properties, preferring fields for
elements that are always set. Property lists are intended for user-defined annotations to the
tree. The Rhino code generator acts as a client and uses node properties extensively. You are
welcome to use the property-list API for anything your client needs.
This hierarchy does not have separate branches for expressions and statements, as the distinction in JavaScript is not as clear-cut as in Java or C++.
-
Nested Class Summary
Modifier and TypeClassDescriptionprotected static class
static class
Nested classes/interfaces inherited from class org.mozilla.javascript.Node
Node.NodeIterator
-
Field Summary
Fields inherited from class org.mozilla.javascript.Node
ARROW_FUNCTION_PROP, ATTRIBUTE_FLAG, BOTH, CASEARRAY_PROP, CATCH_SCOPE_PROP, CONTROL_BLOCK_PROP, DECR_FLAG, DESCENDANTS_FLAG, DESTRUCTURING_ARRAY_LENGTH, DESTRUCTURING_NAMES, DESTRUCTURING_PARAMS, DIRECTCALL_PROP, END_DROPS_OFF, END_RETURNS, END_RETURNS_VALUE, END_UNREACHED, END_YIELDS, EXPRESSION_CLOSURE_PROP, first, FUNCTION_PROP, GENERATOR_END_PROP, INCRDECR_PROP, ISNUMBER_PROP, JSDOC_PROP, LABEL_ID_PROP, last, LAST_PROP, LEFT, lineno, LOCAL_BLOCK_PROP, LOCAL_PROP, MEMBER_TYPE_PROP, NAME_PROP, next, NON_SPECIALCALL, OBJECT_IDS_PROP, OBJECT_LITERAL_DESTRUCTURING, OPTIONAL_CHAINING, PARENTHESIZED_PROP, POST_FLAG, PROPERTY_FLAG, propListHead, REGEXP_PROP, RIGHT, SKIP_INDEXES_PROP, SPECIALCALL_EVAL, SPECIALCALL_PROP, SPECIALCALL_WITH, TARGETBLOCK_PROP, TEMPLATE_LITERAL_PROP, TRAILING_COMMA, type, VARIABLE_PROP
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionvoid
Adds a child or function to the end of the block.protected void
assertNotNull
(Object arg) Bounces an IllegalArgumentException up if arg isnull
.static RuntimeException
codeBug()
int
Permits AST nodes to be sorted based on start position and length.Returns a debugging representation of the parse tree starting at this node.int
depth()
Returns the depth of this node.int
Returns the absolute document position of the node.Returns the root of the tree containing this node.Returns the innermost enclosing function, ornull
if not in a function.Returns the innermost enclosingScope
node, ornull
if we're not nested in a scope.int
Returns node lengthint
Return the line number recorded for this node.Returns the node parent, ornull
if it has noneint
Returns relative position in parentboolean
makeIndent
(int indent) Constructs an indentation string.static String
operatorToString
(int op) Returns the string name for this operator.protected <T extends AstNode>
voidprintList
(List<T> items, StringBuilder sb) Prints a comma-separated item list into aStringBuilder
.void
setBounds
(int position, int end) Sets the node start and end positions.void
setInlineComment
(AstNode inlineComment) void
setLength
(int length) Sets node lengthvoid
Sets the node parent.void
setPosition
(int position) Sets relative position in parentvoid
setRelative
(int parentPosition) Make this node's position relative to a parent.Returns a short, descriptive name for the node, such as "ArrayComprehension".toSource()
Prints the source indented to depth 0.abstract String
toSource
(int depth) Emits source code for this node.abstract void
visit
(NodeVisitor visitor) Visits this node and its children in an arbitrary order.Methods inherited from class org.mozilla.javascript.Node
addChildAfter, addChildBefore, addChildrenToBack, addChildrenToFront, addChildToBack, addChildToFront, getBigInt, getChildBefore, getColumn, getDouble, getExistingIntProp, getFirstChild, getIntProp, getJsDoc, getJsDocNode, getLastChild, getLastSibling, getNext, getProp, getScope, getString, getType, hasChildren, hasConsistentReturnUsage, iterator, labelId, labelId, newNumber, newString, newString, newTarget, putIntProp, putProp, removeChild, removeChildren, removeProp, replaceChild, replaceChildAfter, resetTargets, setBigInt, setDouble, setJsDocNode, setLineColumnNumber, setScope, setString, setType, toString, toStringTree
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
Methods inherited from interface java.lang.Iterable
forEach, spliterator
-
Field Details
-
position
protected int position -
length
protected int length -
parent
-
inlineComment
-
-
Constructor Details
-
AstNode
public AstNode() -
AstNode
public AstNode(int pos) Constructs a new AstNode- Parameters:
pos
- the start position
-
AstNode
public AstNode(int pos, int len) Constructs a new AstNode- Parameters:
pos
- the start positionlen
- the number of characters spanned by the node in the source text
-
-
Method Details
-
getPosition
public int getPosition()Returns relative position in parent -
setPosition
public void setPosition(int position) Sets relative position in parent -
getAbsolutePosition
public int getAbsolutePosition()Returns the absolute document position of the node. Computes it by adding the node's relative position to the relative positions of all its parents. -
getLength
public int getLength()Returns node length -
setLength
public void setLength(int length) Sets node length -
setBounds
public void setBounds(int position, int end) Sets the node start and end positions. Computes the length as (end
-position
). -
setRelative
public void setRelative(int parentPosition) Make this node's position relative to a parent. Typically only used by the parser when constructing the node.- Parameters:
parentPosition
- the absolute parent position; the current node position is assumed to be absolute and is decremented by parentPosition.
-
getParent
Returns the node parent, ornull
if it has none -
setParent
Sets the node parent. This method automatically adjusts the current node's start position to be relative to the new parent.- Parameters:
parent
- the new parent. Can benull
.
-
addChild
Adds a child or function to the end of the block. Sets the parent of the child to this node, and fixes up the start position of the child to be relative to this node. Sets the length of this node to include the new child.- Parameters:
kid
- the child- Throws:
IllegalArgumentException
- if kid isnull
-
getAstRoot
Returns the root of the tree containing this node.- Returns:
- the
AstRoot
at the root of this node's parent chain, ornull
if the topmost parent is not anAstRoot
.
-
toSource
Emits source code for this node. Callee is responsible for calling this function recursively on children, incrementing indent as appropriate.Note: if the parser was in error-recovery mode, some AST nodes may have
null
children that are expected to be non-null
when no errors are present. In this situation, the behavior of thetoSource
method is undefined:toSource
implementations may assume that the AST node is error-free, since it is intended to be invoked only at runtime after a successful parse.- Parameters:
depth
- the current recursion depth, typically beginning at 0 when called on the root node.
-
toSource
Prints the source indented to depth 0. -
makeIndent
Constructs an indentation string.- Parameters:
indent
- the number of indentation steps
-
shortName
Returns a short, descriptive name for the node, such as "ArrayComprehension". -
operatorToString
Returns the string name for this operator.- Parameters:
op
- the token type, e.g.Token.ADD
orToken.TYPEOF
- Returns:
- the source operator string, such as "+" or "typeof"
-
visit
Visits this node and its children in an arbitrary order.It's up to each node subclass to decide the order for processing its children. The subclass also decides (and should document) which child nodes are not passed to the
NodeVisitor
. For instance, nodes representing keywords likeeach
orin
may not be passed to the visitor object. The visitor can simply query the current node for these children if desired.Generally speaking, the order will be deterministic; the order is whatever order is decided by each child node. Normally child nodes will try to visit their children in lexical order, but there may be exceptions to this rule.
- Parameters:
visitor
- the object to call with this node and its children
-
hasSideEffects
public boolean hasSideEffects()- Overrides:
hasSideEffects
in classNode
-
assertNotNull
Bounces an IllegalArgumentException up if arg isnull
.- Parameters:
arg
- any method argument- Throws:
IllegalArgumentException
- if the argument isnull
-
printList
Prints a comma-separated item list into aStringBuilder
.- Parameters:
items
- a list to printsb
- aStringBuilder
into which to print
-
codeBug
- Throws:
RuntimeException
- See Also:
-
getEnclosingFunction
Returns the innermost enclosing function, ornull
if not in a function. Begins the search with this node's parent.- Returns:
- the
FunctionNode
enclosing this node, elsenull
-
getEnclosingScope
Returns the innermost enclosingScope
node, ornull
if we're not nested in a scope. Begins the search with this node's parent. Note that this is not the same as the defining scope for aName
.- Returns:
- the
Scope
enclosing this node, elsenull
-
compareTo
Permits AST nodes to be sorted based on start position and length. This makes it easy to sort Comment and Error nodes into a set of other AST nodes: just put them all into aSortedSet
, for instance.- Specified by:
compareTo
in interfaceComparable<AstNode>
- Parameters:
other
- another node- Returns:
- -1 if this node's start position is less than
other
's start position. If tied, -1 if this node's length is less thanother
's length. If the lengths are equal, sorts arbitrarily on hashcode unless the nodes are the same perObject.equals(java.lang.Object)
.
-
depth
public int depth()Returns the depth of this node. The root is depth 0, its children are depth 1, and so on.- Returns:
- the node depth in the tree
-
getLineno
public int getLineno()Return the line number recorded for this node. If no line number was recorded, searches the parent chain. -
debugPrint
Returns a debugging representation of the parse tree starting at this node.- Returns:
- a very verbose indented printout of the tree. The format of each line is: abs-pos name position length [identifier]
-
getInlineComment
-
setInlineComment
-