1use std::any::Any;
3use std::borrow::Borrow;
4
5use std::fmt::{Debug, Formatter};
6use std::iter::from_fn;
7use std::marker::PhantomData;
8use std::ops::Deref;
9use std::rc::Rc;
10
11use crate::atn::INVALID_ALT;
12use crate::char_stream::InputData;
13use crate::int_stream::EOF;
14use crate::interval_set::Interval;
15use crate::parser::ParserNodeType;
16use crate::parser_rule_context::{ParserRuleContext, RuleContextExt};
17use crate::recognizer::Recognizer;
18use crate::rule_context::{CustomRuleContext, RuleContext};
19use crate::token::Token;
20use crate::token_factory::TokenFactory;
21use crate::{interval_set, trees, CoerceTo};
22use better_any::{Tid, TidAble};
23use std::mem;
24
25#[allow(missing_docs)]
27pub trait Tree<'input>: RuleContext<'input> {
28 fn get_parent(&self) -> Option<Rc<<Self::Ctx as ParserNodeType<'input>>::Type>> {
29 None
30 }
31 fn has_parent(&self) -> bool {
32 false
33 }
34 fn get_payload(&self) -> Box<dyn Any> {
35 unimplemented!()
36 }
37 fn get_child(&self, _i: usize) -> Option<Rc<<Self::Ctx as ParserNodeType<'input>>::Type>> {
38 None
39 }
40 fn get_child_count(&self) -> usize {
41 0
42 }
43 fn get_children<'a>(
44 &'a self,
45 ) -> Box<dyn Iterator<Item = Rc<<Self::Ctx as ParserNodeType<'input>>::Type>> + 'a>
46 where
47 'input: 'a,
48 {
49 let mut index = 0;
50 let iter = from_fn(move || {
51 if index < self.get_child_count() {
52 index += 1;
53 self.get_child(index - 1)
54 } else {
55 None
56 }
57 });
58
59 Box::new(iter)
60 }
61 }
63
64pub trait ParseTree<'input>: Tree<'input> {
66 fn get_source_interval(&self) -> Interval {
71 interval_set::INVALID
72 }
73
74 fn get_text(&self) -> String {
82 String::new()
83 }
84
85 fn to_string_tree(
89 &self,
90 r: &dyn Recognizer<'input, TF = Self::TF, Node = Self::Ctx>,
91 ) -> String {
92 trees::string_tree(self, r.get_rule_names())
93 }
94}
95
96#[doc(hidden)]
119#[derive(Debug)]
120pub struct NoError;
121
122#[doc(hidden)]
123#[derive(Debug)]
124pub struct IsError;
125
126pub struct LeafNode<'input, Node: ParserNodeType<'input>, T: 'static> {
128 pub symbol: <Node::TF as TokenFactory<'input>>::Tok,
130 iserror: PhantomData<T>,
131}
132better_any::tid! { impl <'input, Node, T:'static> TidAble<'input> for LeafNode<'input, Node, T> where Node:ParserNodeType<'input> }
133
134impl<'input, Node: ParserNodeType<'input>, T: 'static> CustomRuleContext<'input>
135 for LeafNode<'input, Node, T>
136{
137 type TF = Node::TF;
138 type Ctx = Node;
139
140 fn get_rule_index(&self) -> usize {
141 usize::max_value()
142 }
143
144 fn get_node_text(&self, rule_names: &[&str]) -> String {
145 self.symbol.borrow().get_text().to_display()
146 }
147}
148
149impl<'input, Node: ParserNodeType<'input>, T: 'static> ParserRuleContext<'input>
150 for LeafNode<'input, Node, T>
151{
152}
153
154impl<'input, Node: ParserNodeType<'input>, T: 'static> Tree<'input> for LeafNode<'input, Node, T> {}
155
156impl<'input, Node: ParserNodeType<'input>, T: 'static> RuleContext<'input>
157 for LeafNode<'input, Node, T>
158{
159}
160
161impl<'input, Node: ParserNodeType<'input>, T: 'static> ParseTree<'input>
168 for LeafNode<'input, Node, T>
169{
170 fn get_source_interval(&self) -> Interval {
171 let i = self.symbol.borrow().get_token_index();
172 Interval { a: i, b: i }
173 }
174
175 fn get_text(&self) -> String {
176 self.symbol.borrow().get_text().to_display()
177 }
178}
179
180impl<'input, Node: ParserNodeType<'input>, T: 'static> Debug for LeafNode<'input, Node, T> {
181 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
182 if self.symbol.borrow().get_token_type() == EOF {
183 f.write_str("<EOF>")
184 } else {
185 let a = self.symbol.borrow().get_text().to_display();
186 f.write_str(&a)
187 }
188 }
189}
190
191impl<'input, Node: ParserNodeType<'input>, T: 'static> LeafNode<'input, Node, T> {
192 pub fn new(symbol: <Node::TF as TokenFactory<'input>>::Tok) -> Self {
194 Self {
195 symbol,
196 iserror: Default::default(),
197 }
198 }
199}
200
201pub type TerminalNode<'input, NodeType> = LeafNode<'input, NodeType, NoError>;
203
204impl<'input, Node: ParserNodeType<'input>, Listener: ParseTreeListener<'input, Node> + ?Sized>
205 Listenable<Listener> for TerminalNode<'input, Node>
206{
207 fn enter(&self, listener: &mut Listener) {
208 listener.visit_terminal(self)
209 }
210
211 fn exit(&self, _listener: &mut Listener) {
212 }
214}
215
216impl<'input, Node: ParserNodeType<'input>, R: Sized, Visitor: ParseTreeVisitor<'input, Node, R> + ?Sized>
217 Visitable<Visitor, R> for TerminalNode<'input, Node>
218{
219 fn accept(&self, visitor: &mut Visitor) -> R {
220 visitor.visit_terminal(self)
221 }
222}
223
224pub type ErrorNode<'input, NodeType> = LeafNode<'input, NodeType, IsError>;
227
228impl<'input, Node: ParserNodeType<'input>, Listener: ParseTreeListener<'input, Node> + ?Sized>
229 Listenable<Listener> for ErrorNode<'input, Node>
230{
231 fn enter(&self, listener: &mut Listener) {
232 listener.visit_error_node(self)
233 }
234
235 fn exit(&self, _listener: &mut Listener) {
236 }
238}
239
240impl<'input, Node: ParserNodeType<'input>, R: Sized, Visitor: ParseTreeVisitor<'input, Node, R> + ?Sized>
241 Visitable<Visitor, R> for ErrorNode<'input, Node>
242{
243 fn accept(&self, visitor: &mut Visitor) -> R {
244 visitor.visit_error_node(self)
245 }
246}
247
248pub trait ParseTreeVisitorCompat<'input>: VisitChildren<'input, Self::Node, Self::Return> {
249 type Node: ParserNodeType<'input>;
250 type Return: Default;
251
252 fn visit(&mut self, node: &<Self::Node as ParserNodeType<'input>>::Type) -> Self::Return {
253 return self.visit_node(&node);
254 }
255
256 fn visit_terminal(&mut self, _node: &TerminalNode<'input, Self::Node>) -> Self::Return {
258 Self::Return::default()
259 }
260 fn visit_error_node(&mut self, _node: &ErrorNode<'input, Self::Node>) -> Self::Return {
262 Self::Return::default()
263 }
264
265 fn visit_children(
266 &mut self,
267 node: &<Self::Node as ParserNodeType<'input>>::Type,
268 ) -> Self::Return {
269 let mut result = Self::Return::default();
270 for node in node.get_children() {
271 if !self.should_visit_next_child(&node, &result) {
272 break;
273 }
274
275 let child_result = self.visit(&node);
276 result = self.aggregate_results(result, child_result);
277 }
278 return result;
279 }
280
281 fn aggregate_results(&self, aggregate: Self::Return, next: Self::Return) -> Self::Return {
282 next
283 }
284
285 fn should_visit_next_child(
286 &self,
287 node: &<Self::Node as ParserNodeType<'input>>::Type,
288 current: &Self::Return,
289 ) -> bool {
290 true
291 }
292}
293
294impl<'input, Node, T, R: Sized> ParseTreeVisitor<'input, Node, R> for T
301where
302 Node: ParserNodeType<'input>,
303 Node::Type: VisitableDyn<Self, R>,
304 T: ParseTreeVisitorCompat<'input, Node = Node, Return = R>,
305{
306 fn visit_terminal(&mut self, node: &TerminalNode<'input, Node>) -> R {
307 <Self as ParseTreeVisitorCompat>::visit_terminal(self, node)
308 }
309
310 fn visit_error_node(&mut self, node: &ErrorNode<'input, Node>) -> R {
311 <Self as ParseTreeVisitorCompat>::visit_error_node(self, node)
312 }
313
314 fn visit_children(&mut self, node: &Node::Type) -> R {
315 <Self as ParseTreeVisitorCompat>::visit_children(self, node)
316 }
317}
318
319pub trait ParseTreeVisitor<'input, Node: ParserNodeType<'input>, T: Sized>:
321 VisitChildren<'input, Node, T>
322{
323 fn visit_terminal(&mut self, _node: &TerminalNode<'input, Node>) -> T {
328 unreachable!()
329 }
330 fn visit_error_node(&mut self, _node: &ErrorNode<'input, Node>) -> T {
332 unreachable!()
333 }
334 fn visit_children(&mut self, node: &Node::Type) -> T {
336 unreachable!()
337 }
338}
339
340pub trait VisitChildren<'input, Node: ParserNodeType<'input>, T: ?Sized> {
345 fn visit_node(&mut self, node: &Node::Type) -> T;
347}
348
349impl<'input, Node, T, R: Sized> VisitChildren<'input, Node, R> for T
350where
351 Node: ParserNodeType<'input>,
352 T: ParseTreeVisitor<'input, Node, R> + ?Sized,
353 Node::Type: VisitableDyn<T, R>,
355{
356 fn visit_node(&mut self, node: &Node::Type) -> R {
363 node.accept_dyn(self)
364 }
365}
366
367pub trait Visitable<Vis: ?Sized, T: Sized> {
370 fn accept(&self, _visitor: &mut Vis) -> T {
372 unreachable!("should have been properly implemented by generated context when reachable")
373 }
374}
375
376#[doc(hidden)]
378pub trait VisitableDyn<Vis: ?Sized, R: Sized> {
379 fn accept_dyn(&self, _visitor: &mut Vis) -> R {
380 unreachable!("should have been properly implemented by generated context when reachable")
381 }
382}
383
384pub trait ParseTreeListener<'input, Node: ParserNodeType<'input>> {
386 fn visit_terminal(&mut self, _node: &TerminalNode<'input, Node>) {}
388 fn visit_error_node(&mut self, _node: &ErrorNode<'input, Node>) {}
390 fn enter_every_rule(&mut self, _ctx: &Node::Type) {}
392 fn exit_every_rule(&mut self, _ctx: &Node::Type) {}
394}
395
396pub trait Listenable<T: ?Sized> {
399 fn enter(&self, _listener: &mut T) {}
401 fn exit(&self, _listener: &mut T) {}
403}
404
405#[derive(Debug)]
413pub struct ParseTreeWalker<'input, 'a, Node, T = dyn ParseTreeListener<'input, Node> + 'a>(
414 PhantomData<fn(&'a T) -> &'input Node::Type>,
415)
416where
417 Node: ParserNodeType<'input>,
418 T: ParseTreeListener<'input, Node> + ?Sized;
419
420impl<'input, 'a, Node, T> ParseTreeWalker<'input, 'a, Node, T>
421where
422 Node: ParserNodeType<'input>,
423 T: ParseTreeListener<'input, Node> + 'a + ?Sized,
424 Node::Type: Listenable<T>,
425{
426 pub fn walk<Listener, Ctx>(mut listener: Box<Listener>, t: &Ctx) -> Box<Listener>
428 where
429 Listener: CoerceTo<T>,
432 Ctx: CoerceTo<Node::Type>,
433 {
434 Self::walk_inner(listener.as_mut().coerce_mut_to(), t.coerce_ref_to());
436
437 listener
440 }
441
442 fn walk_inner(listener: &mut T, t: &Node::Type) {
443 t.enter(listener);
444
445 for child in t.get_children() {
446 Self::walk_inner(listener, child.deref())
447 }
448
449 t.exit(listener);
450 }
451}