Top Description Fields Constructors Methods
org.antlr.runtime.tree

public abstract Class RewriteRuleElementStream

extends Object
Class Inheritance
Known Direct Subclasses
org.antlr.runtime.tree.RewriteRuleNodeStream, org.antlr.runtime.tree.RewriteRuleSubtreeStream, org.antlr.runtime.tree.RewriteRuleTokenStream
Imports
java.util.ArrayList, .List

A generic list of elements tracked in an alternative to be used in a -> rewrite rule. We need to subclass to fill in the next() method, which returns either an AST node wrapped around a token payload or an existing subtree. Once you start next()ing, do not try to add more elements. It will break the cursor tracking I believe.
See Also
org.antlr.runtime.tree.RewriteRuleSubtreeStream, TODO: add mechanism to detect/puke on modification after reading from stream

Field Summary

Modifier and TypeField and Description
protected TreeAdaptor
protected int
cursor

Cursor 0..n-1.

protected boolean
dirty

Once a node / subtree has been used in a stream, it must be dup'd from then on.

protected String
elementDescription

The element or stream description; usually has name of the token or rule reference that this list tracks.

protected List<Object>
elements

The list of tokens or subtrees we are tracking

protected Object
singleElement

Track single elements w/o creating a list.

Constructor Summary

AccessConstructor and Description
public
RewriteRuleElementStream(TreeAdaptor adaptor, String elementDescription)

public
RewriteRuleElementStream(TreeAdaptor adaptor, String elementDescription, Object oneElement)

Create a stream with one element

public
RewriteRuleElementStream(TreeAdaptor adaptor, String elementDescription, List<Object> elements)

Create a stream, but feed off an existing list

Method Summary

Modifier and TypeMethod and Description
protected Object
_next()

do the work of getting the next element, making sure that it's a tree node or subtree.

public void
add(Object el)

protected abstract Object
dup(Object el)

When constructing trees, sometimes we need to dup a token or AST subtree.

public String
public boolean
public Object
nextTree()

Return the next element in the stream.

public void
reset()

Reset the condition of this stream so that it appears we have not consumed any of its elements.

public int
size()

protected Object
toTree(Object el)

Ensure stream emits trees; tokens must be converted to AST nodes.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

adaptorback to summary
protected TreeAdaptor adaptor
cursorback to summary
protected int cursor

Cursor 0..n-1. If singleElement!=null, cursor is 0 until you next(), which bumps it to 1 meaning no more elements.

dirtyback to summary
protected boolean dirty

Once a node / subtree has been used in a stream, it must be dup'd from then on. Streams are reset after subrules so that the streams can be reused in future subrules. So, reset must set a dirty bit. If dirty, then next() always returns a dup. I wanted to use "naughty bit" here, but couldn't think of a way to use "naughty". TODO: unused?

elementDescriptionback to summary
protected String elementDescription

The element or stream description; usually has name of the token or rule reference that this list tracks. Can include rulename too, but the exception would track that info.

elementsback to summary
protected List<Object> elements

The list of tokens or subtrees we are tracking

singleElementback to summary
protected Object singleElement

Track single elements w/o creating a list. Upon 2nd add, alloc list

Constructor Detail

RewriteRuleElementStreamback to summary
public RewriteRuleElementStream(TreeAdaptor adaptor, String elementDescription)
RewriteRuleElementStreamback to summary
public RewriteRuleElementStream(TreeAdaptor adaptor, String elementDescription, Object oneElement)

Create a stream with one element

Annotations
@SuppressWarnings:OverridableMethodCallInConstructor
RewriteRuleElementStreamback to summary
public RewriteRuleElementStream(TreeAdaptor adaptor, String elementDescription, List<Object> elements)

Create a stream, but feed off an existing list

Method Detail

_nextback to summary
protected Object _next()

do the work of getting the next element, making sure that it's a tree node or subtree. Deal with the optimization of single- element list versus list of size > 1. Throw an exception if the stream is empty or we're out of elements and size>1. protected so you can override in a subclass if necessary.

addback to summary
public void add(Object el)
dupback to summary
protected abstract Object dup(Object el)

When constructing trees, sometimes we need to dup a token or AST subtree. Dup'ing a token means just creating another AST node around it. For trees, you must call the adaptor.dupTree() unless the element is for a tree root; then it must be a node dup.

getDescriptionback to summary
public String getDescription()
hasNextback to summary
public boolean hasNext()
nextTreeback to summary
public Object nextTree()

Return the next element in the stream. If out of elements, throw an exception unless size()==1. If size is 1, then return elements[0]. Return a duplicate node/subtree if stream is out of elements and size==1. If we've already used the element, dup (dirty bit set).

resetback to summary
public void reset()

Reset the condition of this stream so that it appears we have not consumed any of its elements. Elements themselves are untouched. Once we reset the stream, any future use will need duplicates. Set the dirty bit.

sizeback to summary
public int size()
toTreeback to summary
protected Object toTree(Object el)

Ensure stream emits trees; tokens must be converted to AST nodes. AST nodes can be passed through unmolested.