1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2008 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#:
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc.
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved.
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met:
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer.
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    notice, this list of conditions and the following disclaimer in the
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    documentation and/or other materials provided with the distribution.
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *    derived from this software without specific prior written permission.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime.Debug
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using Obsolete = System.ObsoleteAttribute;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using ITreeAdaptor = Antlr.Runtime.Tree.ITreeAdaptor;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    using ITreeNodeStream = Antlr.Runtime.Tree.ITreeNodeStream;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /** <summary>
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  Debug any tree node stream.  The constructor accepts the stream
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  and a debug listener.  As node stream calls come in, debug events
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  are triggered.
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *  </summary>
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public class DebugTreeNodeStream : ITreeNodeStream
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    {
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected IDebugEventListener dbg;
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected ITreeAdaptor adaptor;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected ITreeNodeStream input;
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected bool initialStreamState = true;
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>Track the last mark() call result value for use in rewind().</summary> */
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        protected int lastMarker;
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public DebugTreeNodeStream( ITreeNodeStream input,
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                   IDebugEventListener dbg )
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.input = input;
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.adaptor = input.TreeAdaptor;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            this.input.UniqueNavigationNodes = true;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            DebugListener = dbg;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #region Properties
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual IDebugEventListener DebugListener
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return dbg;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            set
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                dbg = value;
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual int Index
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return input.Index;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual ITokenStream TokenStream
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return input.TokenStream;
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual ITreeAdaptor TreeAdaptor
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return adaptor;
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual object TreeSource
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return input;
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        /** <summary>
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  It is normally this object that instructs the node stream to
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  create unique nav nodes, but to satisfy interface, we have to
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  define it.  It might be better to ignore the parameter but
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  there might be a use for it later, so I'll leave.
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         *  </summary>
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver         */
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public bool UniqueNavigationNodes
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return input.UniqueNavigationNodes;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            set
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                input.UniqueNavigationNodes = value;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        #endregion
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Consume()
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            object node = input.LT( 1 );
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input.Consume();
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dbg.ConsumeNode( node );
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual object this[int i]
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return input[i];
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual object LT( int i )
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            object node = input.LT( i );
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID( node );
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = adaptor.GetText( node );
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type = adaptor.GetType( node );
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dbg.LT( i, node );
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return node;
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual int LA( int i )
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            object node = input.LT( i );
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int ID = adaptor.GetUniqueID( node );
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            string text = adaptor.GetText( node );
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            int type = adaptor.GetType( node );
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dbg.LT( i, node );
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return type;
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual int Mark()
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            lastMarker = input.Mark();
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dbg.Mark( lastMarker );
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return lastMarker;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Rewind( int marker )
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dbg.Rewind( marker );
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input.Rewind( marker );
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Rewind()
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            dbg.Rewind();
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input.Rewind( lastMarker );
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Release( int marker )
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void Seek( int index )
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // TODO: implement seek in dbg interface
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            // db.seek(index);
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input.Seek( index );
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual int Count
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return input.Count;
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual string SourceName
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            get
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            {
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return TokenStream.SourceName;
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual void ReplaceChildren( object parent, int startChildIndex, int stopChildIndex, object t )
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            input.ReplaceChildren( parent, startChildIndex, stopChildIndex, t );
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        public virtual string ToString( object start, object stop )
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        {
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return input.ToString( start, stop );
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
217