1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule ANTLR3
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule Debug
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Debug::TreeAdaptor
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAdds debugging event hooks to TreeAdaptor objects
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule TreeAdaptor
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.wrap( adaptor, debug_listener = nil )
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    adaptor.extend( self )
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    adaptor.debug_listener = debug_listener
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( adaptor )
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :debug_listener
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def create_with_payload( payload )
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = super
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.create_node( node, payload )
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return node
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def create_from_token( token_type, from_token, text = nil )
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = super
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.create_node( node )
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return node
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def create_from_type( token_type, text )
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = super
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.create_node( node )
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return node
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def create_error_node( input, start, stop, exc )
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = super
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node.nil? or @debug_listener.error_node( node )
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return node
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def copy_tree( tree )
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    t = super
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    simulate_tree_construction( t )
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return t
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def simulate_tree_construction( tree )
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.create_node( tree )
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    child_count( tree ).times do |i|
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      child = self.child_of( tree, i )
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      simulate_tree_construction( child )
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @debug_listener.add_child( tree, child )
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def copy_node( tree_node )
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    duplicate = super
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.create_node duplicate
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return duplicate
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def create_flat_list
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = super
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.flat_node( node )
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return node
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def add_child( tree, child )
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    case child
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    when Token
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      node = create_with_payload( child )
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      add_child( tree, node )
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree.nil? || child.nil? and return
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      super( tree, child )
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @debug_listener.add_child( tree, child )
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def become_root( new_root, old_root )
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    case new_root
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    when Token
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      n = create_with_payload( new_root )
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      super( n, old_root )
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    else
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      n = super( new_root, old_root )
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.become_root( new_root, old_root )
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return n
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def set_token_boundaries( tree, start_token, stop_token )
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( tree, start_token, stop_token )
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return unless tree && start_token && stop_token
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.set_token_boundaries( tree,
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      start_token.token_index, stop_token.token_index )
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin rdoc ANTLR3::Debug::TreeNodeStream
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverA module that wraps token stream methods with debugging event code. A debuggable
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverparser will <tt>extend</tt> its input stream with this module if the stream is
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernot already a Debug::TreeNodeStream.
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TreeNodeStream
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def self.wrap( stream, debug_listener = nil )
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stream.extend( self )
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stream.debug_listener ||= debug_listener
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  attr_accessor :debug_listener
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def consume
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = @input >> 1
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.consume_node( node )
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def look( i = 1 )
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = super
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    id = @adaptor.unique_id( node )
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text = @adaptor.text_of( node )
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = @adaptor.type_of( node )
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.look( i, node )
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( node )
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def peek( i = 1 )
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    node = self >> 1
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    id = @adaptor.unique_id( node )
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    text = @adaptor.text_of( node )
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type = @adaptor.type_of( node )
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.look( i, node )
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( type )
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def mark
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @last_marker = super
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.mark( @last_marker )
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( @last_marker )
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def rewind( marker = nil )
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @debug_listener.rewind( marker )
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    super( marker || @last_marker )
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=begin   This actually differs with reset in CommonTreeNodeStream -- why is this one blank?
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def reset
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # do nothing
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver=end
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
165