1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** A generic tree implementation with no payload.  You must subclass to
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  actually have any user data.  ANTLR v3 uses a list of children approach
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  instead of the child-sibling approach in v2.  A flat tree (a list) is
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  an empty node whose children represent the list.  An empty, but
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  non-null node is called "nil".
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.runtime.tree.BaseTree = function() {};
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverorg.antlr.lang.extend(org.antlr.runtime.tree.BaseTree,
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                      org.antlr.runtime.tree.Tree,
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getChild: function(i) {
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.children || i>=this.children.length ) {
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return this.children[i];
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Get the children internal List; note that if you directly mess with
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  the list, do so at your own risk.
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getChildren: function() {
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return this.children;
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getFirstChildWithType: function(type) {
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var i, t;
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (i = 0; this.children && i < this.children.length; i++) {
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t = this.children[i];
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( t.getType()===type ) {
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return t;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return null;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getChildCount: function() {
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.children ) {
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return 0;
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return this.children.length;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Add t as child of this node.
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  Warning: if t has no children, but child does
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  and child isNil then this routine moves children to t via
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  t.children = child.children; i.e., without copying the array.
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    addChild: function(t) {
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !org.antlr.lang.isValue(t) ) {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return; // do nothing upon addChild(null)
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var childTree = t, n, i, c;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( childTree.isNil() ) { // t is an empty node possibly with children
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( this.children && this.children == childTree.children ) {
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                throw new Error("attempt to add child list to itself");
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // just add all of childTree's children to this
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( childTree.children ) {
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ( this.children ) { // must copy, this has children already
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    n = childTree.children.length;
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    for (i = 0; i < n; i++) {
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        c = childTree.children[i];
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        this.children.push(c);
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        // handle double-link stuff for each child of nil root
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        c.setParent(this);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        c.setChildIndex(this.children.length-1);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                else {
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // no children for this but t has children; just set pointer
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    // call general freshener routine
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    this.children = childTree.children;
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    this.freshenParentAndChildIndexes();
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else { // child is not nil (don't care about children)
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( !this.children ) {
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.children = this.createChildrenList(); // create children list on demand
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.children.push(t);
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            childTree.setParent(this);
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            childTree.setChildIndex(this.children.length-1);
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Add all elements of kids list as children of this node */
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    addChildren: function(kids) {
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var i, t;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (i = 0; i < kids.length; i++) {
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t = kids[i];
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.addChild(t);
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    setChild: function(i, t) {
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !t ) {
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( t.isNil() ) {
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new Error("Can't set single child to a list");
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.children ) {
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.children = this.createChildrenList();
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        this.children[i] = t;
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.setParent(this);
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        t.setChildIndex(i);
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    deleteChild: function(i) {
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.children ) {
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return null;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (i<0 || i>=this.children.length) {
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new Error("Index out of bounds.");
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var killed = this.children.splice(i, 1)[0];
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // walk rest and decrement their child indexes
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        this.freshenParentAndChildIndexes(i);
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return killed;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Delete children from start to stop and replace with t even if t is
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  a list (nil-root tree).  num of children can increase or decrease.
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  For huge child lists, inserting children can force walking rest of
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  children to set their childindex; could be slow.
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    replaceChildren: function(startChildIndex, stopChildIndex, t) {
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.children ) {
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new Error("indexes invalid; no children in list");
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var replacingHowMany = stopChildIndex - startChildIndex + 1;
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var replacingWithHowMany;
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var newTree = t;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var newChildren = null;
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // normalize to a list of children to add: newChildren
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( newTree.isNil() ) {
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            newChildren = newTree.children;
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else {
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            newChildren = [];
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            newChildren.push(newTree);
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        replacingWithHowMany = newChildren.length;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var numNewChildren = newChildren.length;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var delta = replacingHowMany - replacingWithHowMany;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var j, i, child, indexToDelete, c, killed, numToInsert;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // if same number of nodes, do direct replace
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( delta === 0 ) {
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            j = 0; // index into new children
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (i=startChildIndex; i<=stopChildIndex; i++) {
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                child = newChildren[j];
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.children[i] = child;
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                child.setParent(this);
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                child.setChildIndex(i);
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                j++;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else if ( delta > 0 ) { // fewer new nodes than there were
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // set children and then delete extra
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (j=0; j<numNewChildren; j++) {
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.children[startChildIndex+j] = newChildren[j];
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            indexToDelete = startChildIndex+numNewChildren;
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (c=indexToDelete; c<=stopChildIndex; c++) {
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                // delete same index, shifting everybody down each time
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                killed = this.children.splice(indexToDelete, 1)[0];
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.freshenParentAndChildIndexes(startChildIndex);
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        else { // more new nodes than were there before
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // fill in as many children as we can (replacingHowMany) w/o moving data
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (j=0; j<replacingHowMany; j++) {
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.children[startChildIndex+j] = newChildren[j];
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            numToInsert = replacingWithHowMany-replacingHowMany;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            for (j=replacingHowMany; j<replacingWithHowMany; j++) {
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                this.children.splice(startChildIndex+j, 0, newChildren[j]);
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.freshenParentAndChildIndexes(startChildIndex);
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Override in a subclass to change the impl of children list */
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    createChildrenList: function() {
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return [];
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isNil: function() {
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return false;
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    freshenParentAndChildIndexes: function(offset) {
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (!org.antlr.lang.isNumber(offset)) {
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            offset = 0;
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var n = this.getChildCount(),
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            c,
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child;
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (c = offset; c < n; c++) {
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child = this.getChild(c);
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child.setChildIndex(c);
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child.setParent(this);
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    sanityCheckParentAndChildIndexes: function(parent, i) {
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (arguments.length===0) {
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            parent = null;
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            i = -1;
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( parent!==this.getParent() ) {
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new Error("parents don't match; expected "+parent+" found "+this.getParent());
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( i!==this.getChildIndex() ) {
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            throw new Error("child indexes don't match; expected "+i+" found "+this.getChildIndex());
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var n = this.getChildCount(),
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            c,
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child;
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (c = 0; c < n; c++) {
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child = this.getChild(c);
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            child.sanityCheckParentAndChildIndexes(this, c);
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** BaseTree doesn't track child indexes. */
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getChildIndex: function() {
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return 0;
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    setChildIndex: function(index) {
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** BaseTree doesn't track parent pointers. */
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getParent: function() {
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return null;
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    setParent: function(t) {
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getTree: function() {
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return this;
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** Print out a whole tree not just a node */
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    toStringTree: function() {
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.children || this.children.length===0 ) {
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return this.toString();
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        var buf = "",
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            i,
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t;
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.isNil() ) {
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf += "(";
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf += this.toString();
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf += ' ';
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (i = 0; this.children && i < this.children.length; i++) {
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            t = this.children[i];
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ( i>0 ) {
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                buf += ' ';
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf += t.toStringTree();
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ( !this.isNil() ) {
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            buf += ")";
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return buf;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getLine: function() {
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return 0;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    },
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    getCharPositionInLine: function() {
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return 0;
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver});
283