• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1org.antlr.runtime.tree.RewriteRuleSubtreeStream = function() {
2    var sup = org.antlr.runtime.tree.RewriteRuleSubtreeStream.superclass;
3    sup.constructor.apply(this, arguments);
4};
5
6org.antlr.lang.extend(org.antlr.runtime.tree.RewriteRuleSubtreeStream,
7                  org.antlr.runtime.tree.RewriteRuleElementStream, {
8	/** Treat next element as a single node even if it's a subtree.
9	 *  This is used instead of next() when the result has to be a
10	 *  tree root node.  Also prevents us from duplicating recently-added
11	 *  children; e.g., ^(type ID)+ adds ID to type and then 2nd iteration
12	 *  must dup the type node, but ID has been added.
13	 *
14	 *  Referencing a rule result twice is ok; dup entire tree as
15	 *  we can't be adding trees as root; e.g., expr expr.
16	 *
17	 *  Hideous code duplication here with super.next().  Can't think of
18	 *  a proper way to refactor.  This needs to always call dup node
19	 *  and super.next() doesn't know which to call: dup node or dup tree.
20	 */
21    nextNode: function() {
22		var n = this.size(),
23            el;
24		if ( this.dirty || (this.cursor>=n && n===1) ) {
25			// if out of elements and size is 1, dup (at most a single node
26			// since this is for making root nodes).
27			el = this._next();
28			return this.adaptor.dupNode(el);
29		}
30		// test size above then fetch
31		el = this._next();
32		return el;
33	},
34
35    dup: function(el) {
36		return this.adaptor.dupTree(el);
37	}
38});