Skip to main content

dbt_antlr4/
lib.rs

1#![crate_type = "lib"]
2// #![warn(missing_docs)] // warn if there is missing docs
3// #![warn(missing_debug_implementations)]
4// #![warn(trivial_numeric_casts)]
5
6//! # dbt-antlr4 runtime
7//!
8//! This is a Rust runtime for [ANTLR4] parser generator.
9//! It is required to use parsers and lexers generated by [ANTLR4] parser generator
10//!
11//! This documentation refers to particular api used by generated parsers,lexers and syntax trees.
12//!
13//! For info on what is [ANTLR4] and how to generate parser please refer to:
14//!  - [ANTLR4] main repository
15//!  - [README] for Rust target
16//!
17//! [ANTLR4]: https://github.com/antlr/antlr4
18//! [README]: https://github.com/sdf-labs/antlr4/blob/dev/runtime/Rust/README.md
19//!
20//! Documentation for this crate is still a work in progress, but you can find
21//! some docs in the source code, and also refer to the Java runtime
22//! documentation for general concepts and architecture of the runtime, as well
23//! as for documentation of internal modules that are not yet documented in
24//! Rust.
25//!
26//! [`CharStream`]: crate::char_stream::CharStream
27//! [`TokenFactory`]: crate::token_factory::TokenFactory
28//! [`Token`]: crate::token::Token
29//! [`TokenStream`]: crate::token_stream::TokenStream
30//! [`ParserRuleContext`]: crate::parser_rule_context::ParserRuleContext
31
32#[doc(inline)]
33pub use error_strategy::{BailErrorStrategy, DefaultErrorStrategy, ErrorStrategy};
34
35pub use input_stream::InputStream;
36
37#[doc(inline)]
38pub use lexer::{BaseLexer, Lexer};
39#[doc(inline)]
40pub use parser::{BaseParser, ListenerId, Parser};
41#[doc(inline)]
42pub use token_source::TokenSource;
43//extern crate uuid;
44#[doc(hidden)]
45pub use prediction_context::PredictionContextCache;
46
47#[doc(inline)]
48pub use prediction_mode::PredictionMode;
49
50#[doc(inline)]
51pub use arena::Arena;
52#[cfg(feature = "arena-allocation-limit")]
53#[doc(inline)]
54pub use arena::{get_default_arena_alloc_limit, set_default_arena_alloc_limit};
55
56mod arena;
57#[doc(hidden)]
58pub mod atn_config;
59#[doc(hidden)]
60pub mod atn_simulator;
61pub mod int_stream;
62mod lexer_action;
63mod ll1_analyzer;
64#[doc(hidden)]
65pub mod recognizer;
66pub mod token_factory;
67//pub mod tokenstream_rewriter;
68#[doc(hidden)]
69pub mod atn_deserialization_options;
70#[doc(hidden)]
71pub mod atn_state;
72pub mod char_stream;
73#[doc(hidden)]
74pub mod interval_set;
75pub mod parser_rule_context;
76mod prediction_context;
77#[doc(hidden)]
78pub mod semantic_context;
79mod token_source;
80pub mod token_stream;
81//pub mod trace_listener;
82#[doc(hidden)]
83pub mod dfa;
84#[doc(hidden)]
85pub mod transition;
86pub mod tree;
87//pub mod file_stream;
88#[doc(hidden)]
89pub mod atn;
90#[doc(hidden)]
91pub mod atn_config_set;
92#[doc(hidden)]
93pub mod atn_deserializer;
94pub mod common_token_stream;
95pub mod error_listener;
96pub mod error_strategy;
97pub mod errors;
98pub mod input_stream;
99pub mod lexer;
100#[doc(hidden)]
101pub mod lexer_action_executor;
102pub mod lexer_atn_simulator;
103pub mod parser;
104pub mod parser_atn_simulator;
105mod prediction_mode;
106pub mod token;
107pub mod trees;
108mod utils;
109//pub mod tokenstream_rewriter_test;
110mod atn_type;
111// mod context_factory;
112pub mod rule_context;
113pub mod vocabulary;
114
115// ======= Re-exports ========
116#[cfg(feature = "stacker")]
117pub use stacker;
118
119pub const VERSION_MAJOR: &str = env!("CARGO_PKG_VERSION_MAJOR");
120pub const VERSION_MINOR: &str = env!("CARGO_PKG_VERSION_MINOR");
121
122// ======= Macros =======
123
124pub const fn version_str_eq(a: &str, b: &str) -> bool {
125    if a.len() != b.len() {
126        return false;
127    }
128    let (a, b) = (a.as_bytes(), b.as_bytes());
129    let mut i = 0;
130    while i < a.len() {
131        if a[i] != b[i] {
132            return false;
133        }
134        i += 1;
135    }
136    true
137}
138
139#[macro_export]
140macro_rules! check_version {
141    ($major:literal, $minor:literal) => {
142        const _: () = assert!(
143            $crate::version_str_eq($major, $crate::VERSION_MAJOR)
144                && $crate::version_str_eq($minor, $crate::VERSION_MINOR),
145            "Generated parser is not compatible with current runtime version, \
146             please regenerate using the matching ANTLR tool version, \
147             or update the runtime to match the version used for generation."
148        );
149    };
150}
151
152#[macro_export]
153macro_rules! impl_tree {
154    // Pattern: EnumName { Variant1, Variant2, ... }
155    ($enum_name:ident { $($variant:ident,)+ }) => {
156        impl<'input, 'arena> Tree<'arena> for $enum_name<'input, 'arena> {
157            fn get_parent(&self) -> Option<&'arena Self> {
158                match self {
159                    $( $enum_name::$variant(inner) => inner.get_parent(), )+
160                    _ => None,
161                }
162            }
163
164            fn has_parent(&self) -> bool {
165                match self {
166                    $( $enum_name::$variant(inner) => inner.has_parent(), )+
167                    _ => false,
168                }
169            }
170
171            // fn get_payload(&self) -> Box<dyn std::any::Any> {
172            //     match self {
173            //         $( $enum_name::$variant(inner) => Tree::get_payload(inner), )+
174            //     }
175            // }
176
177            fn get_child(&self, i: usize) -> Option<&'arena Self> {
178                match self {
179                    $( $enum_name::$variant(inner) => inner.get_child(i), )+
180                    _ => None,
181                }
182            }
183
184            fn get_child_count(&self) -> usize {
185                match self {
186                    $( $enum_name::$variant(inner) => inner.get_child_count(), )+
187                    _ => 0,
188                }
189            }
190
191            fn get_children<'a>(&'a self) -> Box<dyn Iterator<Item = &'arena Self> + 'a> {
192                match self {
193                    $( $enum_name::$variant(inner) => inner.get_children(), )+
194                    _ => Box::new(std::iter::empty()) as Box<dyn Iterator<Item = &'arena Self>>,
195                }
196            }
197
198            // fn to_string_tree(&self) -> String {
199            //     match self {
200            //         $( $enum_name::$variant(inner) => Tree::to_string_tree(inner), )+
201            //     }
202            // }
203        }
204    };
205}
206
207#[macro_export]
208macro_rules! impl_node_kind_common {
209    // Pattern: EnumName { Variant1, Variant2, ... }
210    ($node_kind:ident { $($labeled_variant:ident($inner:ident),)* ; $($variant:ident),* }) => {
211        fn cast_to_ctx<'n, 'input: 'arena>(
212            node: &'n TreeNode<'input, 'arena, Self, Tok>,
213        ) -> &'n dyn ParserRuleContext<'input, 'arena> {
214            match node.node_tag() {
215                $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>), )*
216                $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>), )*
217                $node_kind::Terminal => $crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>),
218                $node_kind::Error => $crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>),
219            }
220        }
221
222        fn cast_to_ctx_mut<'n, 'input: 'arena>(
223            node: &'n mut TreeNode<'input, 'arena, Self, Tok>,
224        ) -> &'n mut dyn ParserRuleContext<'input, 'arena> {
225            match node.node_tag() {
226                $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => mut $inner<'input, 'arena, Tok>), )*
227                $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => mut $variant<'input, 'arena, Tok>), )*
228                $node_kind::Terminal => $crate::cast_unchecked!(node.ctx_ptr() => mut TerminalNode<'input, 'arena, Tok>),
229                $node_kind::Error => $crate::cast_unchecked!(node.ctx_ptr() => mut ErrorNode<'input, 'arena, Tok>),
230            }
231        }
232
233        fn set_alt_number<'input: 'arena>(node: &mut TreeNode<'input, 'arena, Self, Tok>, alt_number: i32) {
234            match node.node_tag() {
235                $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => mut $inner<'input, 'arena, Tok>).set_alt_number(alt_number), )*
236                $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => mut $variant<'input, 'arena, Tok>).set_alt_number(alt_number), )*
237                _ => {}
238            }
239        }
240
241        fn get_rule_index<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>) -> usize {
242            match node.node_tag() {
243                $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).get_rule_index(), )*
244                $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>).get_rule_index(), )*
245                _ => 0,
246            }
247        }
248
249        fn get_alt_number<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>) -> i32 {
250            match node.node_tag() {
251                $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).get_alt_number(), )*
252                $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>).get_alt_number(), )*
253                _ => INVALID_ALT,
254            }
255        }
256
257        #[inline]
258        fn terminal() -> Self {
259            Self::Terminal
260        }
261
262        #[inline]
263        fn error() -> Self {
264            Self::Error
265        }
266
267        #[inline]
268        fn is_context(&self) -> bool {
269            !matches!(self, Self::Terminal | Self::Error)
270        }
271    };
272}
273
274#[macro_export]
275macro_rules! impl_node_kind {
276    // No Listener and no Visitor
277    ($enum_name:ident { $($labeled_variant:ident($inner:ident),)* ; $($variant:ident),* }; ) => {
278        impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
279            type Listener = dyn ParseTreeListener<'arena, Self, Tok>;
280
281            $crate::impl_node_kind_common! { $enum_name { $($labeled_variant($inner),)* ; $($variant),* } }
282
283            fn enter_rule<'input: 'arena>(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
284                Ok(())
285            }
286
287            fn exit_rule<'input: 'arena>(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
288                Ok(())
289            }
290        }
291    };
292
293    // Just Visitor
294    ($enum_name:ident { $($labeled_variant:ident($inner:ident),)*; $($variant:ident($visit_method:ident),)* }; visitor = $visitor:ty, ) => {
295        impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
296            type Listener = dyn ParseTreeListener<'arena, Self, Tok>;
297
298            $crate::impl_node_kind_common! { $enum_name { $( $labeled_variant($inner),)*; $($variant),* } }
299
300            fn enter_rule(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
301                Ok(())
302            }
303
304            fn exit_rule(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
305                Ok(())
306            }
307
308            // fn accept(&self, visitor: &mut Self::Visitor) -> Result<<Self::Visitor as ParseTreeVisitor<'input, 'arena, Self>>::Return, ANTLRError>
309            // {
310            //     match self {
311            //         $( $enum_name::$labeled_variant(inner) => inner.dispatch_visit(visitor), )*
312            //         $( $enum_name::$variant(inner) => visitor.$visit_method(inner), )*
313            //         $enum_name::Terminal(inner) => { visitor.visit_terminal(inner) },
314            //         $enum_name::Error(inner) => { visitor.visit_error_node(inner) },
315            //     }
316            // }
317        }
318    };
319
320    // Just Listener
321    ($enum_name:ident { $($labeled_variant:ident($inner:ident),)*; $($variant:ident($enter_method:ident, $exit_method:ident, ),)* }; listener = $listener:ty, ) => {
322        impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
323            type Listener = $listener;
324
325            $crate::impl_node_kind_common! { $enum_name { $( $labeled_variant($inner),)*; $($variant),* } }
326
327            fn enter_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
328                match node.node_tag() {
329                    $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_enter(listener), )*
330                    $( $enum_name::$variant => listener.$enter_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
331                    $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
332                    $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
333                }
334            }
335
336            fn exit_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
337                match node.node_tag() {
338                    $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_exit(listener), )*
339                    $( $enum_name::$variant => listener.$exit_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
340                    $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
341                    $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
342                }
343            }
344        }
345    };
346
347    // Both listener and visitor
348    ($enum_name:ident { $($labeled_variant:ident($inner:ident),)*; $($variant:ident($enter_method:ident, $exit_method:ident, $visit_method:ident),)* }; listener = $listener:ty, visitor = $visitor:ident, ) => {
349        impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
350            type Listener = $listener;
351
352            $crate::impl_node_kind_common! { $enum_name { $($labeled_variant($inner),)*; $($variant),* } }
353
354            fn enter_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
355                match node.node_tag() {
356                    $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_enter(listener), )*
357                    $( $enum_name::$variant => listener.$enter_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
358                    $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
359                    $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
360                }
361            }
362
363            fn exit_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
364                match node.node_tag() {
365                    $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_exit(listener), )*
366                    $( $enum_name::$variant => listener.$exit_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
367                    $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
368                    $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
369                }
370            }
371        }
372
373        impl<'input, 'arena, Tok: Token + 'arena> Visitable<'input, 'arena, Tok> for TreeNode<'input, 'arena, $enum_name, Tok>
374        where
375            'input: 'arena,
376        {
377            fn accept<V>(&'arena self, visitor: &mut V) -> Result<V::Return, ANTLRError>
378            where
379                V: $visitor<'input, 'arena, Tok> + ?Sized,
380            {
381                match self.node_tag() {
382                    $( $enum_name::$labeled_variant => $crate::cast_unchecked!(self => $inner<'input, 'arena, Tok>).accept(visitor), )*
383                    $( $enum_name::$variant => visitor.$visit_method($crate::cast_unchecked!(self.ctx_ptr() => $variant<'input, 'arena, Tok>)), )+
384                    $enum_name::Terminal => { visitor.visit_terminal($crate::cast_unchecked!(self.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
385                    $enum_name::Error => { visitor.visit_error_node($crate::cast_unchecked!(self.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
386                }
387            }
388        }
389    };
390}
391
392#[macro_export]
393macro_rules! impl_listener_dispatch {
394    // Pattern: EnumName { Variant1, Variant2, ... }
395    ($listener:ident::$node_name:ident::$enum_name:ident { $($variant:ident($enter_method:ident, $exit_method:ident),)+ }) => {
396        impl<'input, 'arena, Tok: Token + 'input> $enum_name<'input, 'arena, Tok>
397        where
398            'input: 'arena,
399        {
400            fn dispatch_enter(&self, listener: &mut (dyn $listener<'arena, Tok> + 'static)) -> Result<(), ANTLRError>
401            {
402                match self {
403                    $( $enum_name::$variant(inner) => listener.$enter_method(inner), )+
404                    $enum_name::Error(_) => Ok(()),
405                }
406            }
407
408            fn dispatch_exit(&self, listener: &mut (dyn $listener<'arena, Tok> + 'static)) -> Result<(), ANTLRError>
409            {
410                match self {
411                    $( $enum_name::$variant(inner) => listener.$exit_method(inner), )+
412                    $enum_name::Error(_) => Ok(()),
413                }
414            }
415        }
416    };
417}
418
419#[macro_export]
420macro_rules! impl_visitable {
421    // Pattern: EnumName { Variant1, Variant2, ... }
422    ($visitor:ident::$enum_name:ident { $($variant:ident($visit_method:ident),)+ }) => {
423        impl<'input, 'arena, Tok: Token + 'input> Visitable<'input, 'arena, Tok> for $enum_name<'input, 'arena, Tok> {
424            fn accept<V>(&'arena self, visitor: &mut V) -> Result<V::Return, ANTLRError>
425            where
426                V: $visitor<'input, 'arena, Tok> + ?Sized,
427            {
428                match self {
429                    $( $enum_name::$variant(inner) => visitor.$visit_method(inner), )+
430                    $enum_name::Error(_) => Ok(Default::default()),
431                }
432            }
433        }
434    };
435    ($visitor:ident::$ctx_name:ident($visit_method:ident)) => {
436        impl<'input, 'arena, Tok: Token + 'input> Visitable<'input, 'arena, Tok> for $ctx_name<'input, 'arena, Tok> {
437            fn accept<V>(&'arena self, visitor: &mut V) -> Result<V::Return, ANTLRError>
438            where
439                V: $visitor<'input, 'arena, Tok> + ?Sized,
440            {
441                visitor.$visit_method(self)
442            }
443        }
444    };
445}
446
447#[macro_export]
448macro_rules! impl_rule_context {
449    // Pattern: EnumName { Variant1, Variant2, ... }
450    ($enum_name:ident { $($ref_variant:ident,)* } $({ $($inline_variant:ident,)+ })?) => {
451        impl<'input, 'arena, Tok> RuleContext<'arena> for $enum_name<'input, 'arena, Tok>
452        where
453            'input: 'arena,
454            Tok: Token + 'input,
455        {
456            fn get_rule_index(&self) -> usize {
457                match self {
458                    // Generate a match arm for every variant
459                    $( $enum_name::$ref_variant(inner) => RuleContext::get_rule_index(&**inner), )*
460                    $($( $enum_name::$inline_variant(inner) => RuleContext::get_rule_index(inner), )+)?
461                }
462            }
463
464            fn get_alt_number(&self) -> i32 {
465                match self {
466                    $( $enum_name::$ref_variant(inner) => RuleContext::get_alt_number(&**inner), )*
467                    $($( $enum_name::$inline_variant(inner) => RuleContext::get_alt_number(inner), )+)?
468                }
469            }
470
471            fn get_invoking_state(&self) -> i32 {
472                match self {
473                    $( $enum_name::$ref_variant(inner) => RuleContext::get_invoking_state(&**inner), )*
474                    $($( $enum_name::$inline_variant(inner) => RuleContext::get_invoking_state(inner), )+)?
475                }
476            }
477
478            fn get_parent_ctx(&self) -> Option<&'arena dyn RuleContext<'arena>> {
479                match self {
480                    $( $enum_name::$ref_variant(inner) => RuleContext::get_parent_ctx(&**inner), )*
481                    $($( $enum_name::$inline_variant(inner) => RuleContext::get_parent_ctx(inner), )+)?
482                }
483            }
484
485            fn get_node_text(&self, rule_names: &[&str]) -> String {
486                match self {
487                    $( $enum_name::$ref_variant(inner) => RuleContext::get_node_text(&**inner, rule_names), )*
488                    $($( $enum_name::$inline_variant(inner) => RuleContext::get_node_text(inner, rule_names), )+)?
489                }
490            }
491
492        }
493    };
494}
495
496#[macro_export]
497macro_rules! impl_parser_rule_context {
498    // Pattern: EnumName { Variant1, Variant2, ... }
499    ($enum_name:ident { $($ref_variant:ident,)* } $({ $($inline_variant:ident,)+ })?) => {
500        impl<'input, 'arena, Tok> ParserRuleContext<'input, 'arena> for $enum_name<'input, 'arena, Tok>
501        where
502            'input: 'arena,
503            Tok: Token + 'input,
504        {
505            fn start(&self) -> &'arena dyn $crate::token::Token {
506                match self {
507                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::start(&**inner), )*
508                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::start(inner), )+)?
509                }
510            }
511
512            fn stop(&self) -> &'arena dyn $crate::token::Token {
513                match self {
514                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::stop(&**inner), )*
515                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::stop(inner), )+)?
516                }
517            }
518
519            fn get_parent_ctx(&self) -> Option<&'arena dyn ParserRuleContext<'input, 'arena>> {
520                match self {
521                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_parent_ctx(&**inner), )*
522                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_parent_ctx(inner), )+)?
523                }
524            }
525
526            fn get_child_ctx(&self, _i: usize) -> Option<&'arena dyn ParserRuleContext<'input, 'arena>> {
527                match self {
528                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_child_ctx(&**inner, _i), )*
529                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_child_ctx(inner, _i), )+)?
530                }
531            }
532
533            fn get_child_count(&self) -> usize {
534                match self {
535                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_child_count(&**inner), )*
536                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_child_count(inner), )+)?
537                }
538            }
539
540            fn iter_children<'a>(
541                &'a self,
542            ) -> Box<dyn Iterator<Item = &'arena dyn ParserRuleContext<'input, 'arena>> + 'a>
543            where
544                'input: 'a,
545                'arena: 'a,
546            {
547                match self {
548                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::iter_children(&**inner), )*
549                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::iter_children(inner), )+)?
550                }
551            }
552
553            fn get_token(&self, _ttype: i32, _pos: usize) -> Option<&dyn $crate::token::Token> {
554                match self {
555                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_token(&**inner, _ttype, _pos), )*
556                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_token(inner, _ttype, _pos), )+)?
557                }
558            }
559
560            fn get_tokens(&self, _ttype: i32) -> Vec<&dyn $crate::token::Token> {
561                match self {
562                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_tokens(&**inner, _ttype), )*
563                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_tokens(inner, _ttype), )+)?
564                }
565            }
566
567            fn get_text(&self) -> String {
568                match self {
569                    $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_text(&**inner), )*
570                    $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_text(inner), )+)?
571                }
572            }
573       }
574    };
575}
576
577#[macro_export]
578macro_rules! impl_tree_trait_delegates {
579    ($node_kind:ident::$enum_name:ident { $($variant:ident),+ $(,)? }) => {
580        impl<'input, 'arena, Tok> $enum_name<'input, 'arena, Tok>
581        where
582            'input: 'arena,
583            Tok: Token + 'input,
584        {
585            // fn get_parent(&self) -> Option<&'arena TreeNode<'input, 'arena, $node_kind>> {
586            //     match self {
587            //         $( $enum_name::$variant(inner) => inner.get_parent(), )+
588            //     }
589            // }
590
591            // fn has_parent(&self) -> bool {
592            //     match self {
593            //         $( $enum_name::$variant(inner) => inner.has_parent(), )+
594            //     }
595            // }
596
597            // fn get_child(&self, i: usize) -> Option<&'arena TreeNode<'input, 'arena, $node_kind>> {
598            //     match self {
599            //         $( $enum_name::$variant(inner) => inner.get_child(i), )+
600            //     }
601            // }
602
603            // fn get_child_count(&self) -> usize {
604            //     match self {
605            //         $( $enum_name::$variant(inner) => inner.get_child_count(), )+
606            //     }
607            // }
608
609            // fn get_children<'a>(&'a self) -> Box<dyn Iterator<Item = &'arena TreeNode<'input, 'arena, $node_kind>> + 'a> {
610            //     match self {
611            //         $( $enum_name::$variant(inner) => inner.get_children(), )+
612            //     }
613            // }
614
615            // fn set_start(&mut self, t: Option<&'arena dyn $crate::token::Token>) {
616            //     match self {
617            //         $( $enum_name::$variant(inner) => inner.set_start(t), )+
618            //     }
619            // }
620
621            // fn set_stop(&mut self, t: Option<&'arena dyn $crate::token::Token>) {
622            //     match self {
623            //         $( $enum_name::$variant(inner) => inner.set_stop(t), )+
624            //     }
625            // }
626
627            // fn set_parent(&mut self, parent: Option<&'arena TreeNode<'input, 'arena, $node_kind>>) {
628            //     match self {
629            //         $( $enum_name::$variant(inner) => inner.set_parent(parent), )+
630            //     }
631            // }
632
633            // fn set_invoking_state(&mut self, t: i32) {
634            //     match self {
635            //         $( $enum_name::$variant(inner) => inner.set_invoking_state(t), )+
636            //     }
637            // }
638
639            fn set_alt_number(&mut self, alt_number: i32) {
640                match self {
641                    $( $enum_name::$variant(inner) => inner.set_alt_number(alt_number), )+
642                }
643            }
644
645            // fn set_exception(&self, e: $crate::errors::ANTLRError, arena: &'arena $crate::Arena) {
646            //     match self {
647            //         $( $enum_name::$variant(inner) => inner.set_exception(e, arena), )+
648            //     }
649            // }
650
651            // fn remove_last_child(&mut self) {
652            //     match self {
653            //         $( $enum_name::$variant(inner) => inner.remove_last_child(), )+
654            //     }
655            // }
656
657            // fn add_child(&mut self, child: &'arena TreeNode<'input, 'arena, $node_kind>) {
658            //     match self {
659            //         $( $enum_name::$variant(inner) => inner.add_child(child), )+
660            //     }
661            // }
662        }
663    };
664}
665
666#[macro_export]
667macro_rules! impl_node_inner {
668    ($node_kind:ident::$node_variant:ident::$context_all:ident { $($variant:ident),+ $(,)? }) => {
669        impl<'input, 'arena, Tok> NodeInner<'input, 'arena, $node_kind, Tok>
670            for $context_all<'input, 'arena, Tok>
671        where
672            'input: 'arena,
673            Tok: Token + 'input,
674        {
675            fn cast_from<'a>(node: &'a TreeNode<'input, 'arena, $node_kind, Tok>) -> Option<&'a Self> {
676                match node.node_tag() {
677                    $node_kind::$node_variant => Some($crate::cast_unchecked!(node => Self)),
678                    _ => None,
679                }
680            }
681
682            fn cast_from_mut<'a>(node: &'a mut TreeNode<'input, 'arena, $node_kind, Tok>) -> Option<&'a mut Self>
683            where
684                Self: Sized,
685            {
686                match node.node_tag() {
687                    $node_kind::$node_variant => Some($crate::cast_unchecked!(node => mut Self)),
688                    _ => None,
689                }
690            }
691
692            fn as_node(&self) -> &TreeNode<'input, 'arena, $node_kind, Tok> {
693                $crate::cast_unchecked!(self => TreeNode<'input, 'arena, $node_kind, Tok>)
694            }
695
696            fn as_node_mut(&mut self) -> &mut TreeNode<'input, 'arena, $node_kind, Tok> {
697                $crate::cast_unchecked!(self => mut TreeNode<'input, 'arena, $node_kind, Tok>)
698            }
699
700            fn iter_child_nodes<'a>(&'a self) -> Box<dyn Iterator<Item = &'arena TreeNode<'input, 'arena, $node_kind, Tok>> + 'a> {
701                match self {
702                    $( $context_all::$variant(inner) => inner.get_children(), )+
703                }
704            }
705        }
706    };
707}
708
709#[macro_export]
710macro_rules! impl_token_source {
711    ($lexer:ident) => {
712        impl<'input, 'arena, Input, TF> $crate::TokenSource<'input, 'arena, TF>
713            for $lexer<'input, 'arena, Input, TF>
714        where
715            TF: $crate::token_factory::TokenFactory<'input, 'arena> + 'arena,
716            Input: $crate::char_stream::CharStream<'input>,
717        {
718            fn next_token(&mut self) -> &'arena mut TF::Tok {
719                self.base.next_token()
720            }
721
722            fn get_line(&self) -> u32 {
723                self.base.get_line()
724            }
725
726            fn get_char_position_in_line(&self) -> i32 {
727                self.base.get_char_position_in_line()
728            }
729
730            fn get_input_stream(&mut self) -> Option<&mut dyn $crate::int_stream::IntStream> {
731                self.base.get_input_stream()
732            }
733
734            fn get_source_name(&self) -> String {
735                self.base.get_source_name()
736            }
737
738            fn get_token_factory(&self) -> &TF {
739                self.base.get_token_factory()
740            }
741
742            fn get_dfa_string(&self) -> String {
743                self.base.get_dfa_string()
744            }
745        }
746    };
747}
748
749#[macro_export]
750macro_rules! impl_deref {
751    (parser => $parser_name:ident) => {
752        impl<'input, 'arena, Input, TF> Deref for $parser_name<'input, 'arena, Input, TF>
753        where
754            'input: 'arena,
755            TF: TokenFactory<'input, 'arena> + 'arena,
756            Input: TokenStream<'input, 'arena, TF> + 'arena,
757        {
758            type Target = BaseParserType<'input, 'arena, Input, TF>;
759            fn deref(&self) -> &Self::Target {
760                &self.base
761            }
762        }
763
764        impl<'input, 'arena, Input, TF> DerefMut for $parser_name<'input, 'arena, Input, TF>
765        where
766            'input: 'arena,
767            TF: TokenFactory<'input, 'arena> + 'arena,
768            Input: TokenStream<'input, 'arena, TF> + 'arena,
769        {
770            fn deref_mut(&mut self) -> &mut Self::Target {
771                &mut self.base
772            }
773        }
774    };
775    (lexer => $lexer_name:ident) => {
776        impl<'input, 'arena, Input, TF> Deref for $lexer_name<'input, 'arena, Input, TF>
777        where
778            'input: 'arena,
779            TF: TokenFactory<'input, 'arena> + 'arena,
780            Input: CharStream<'input> + 'arena,
781        {
782            type Target = BaseLexerType<'input, 'arena, Input, TF>;
783            fn deref(&self) -> &Self::Target {
784                &self.base
785            }
786        }
787
788        impl<'input, 'arena, Input, TF> DerefMut for $lexer_name<'input, 'arena, Input, TF>
789        where
790            'input: 'arena,
791            TF: TokenFactory<'input, 'arena> + 'arena,
792            Input: CharStream<'input> + 'arena,
793        {
794            fn deref_mut(&mut self) -> &mut Self::Target {
795                &mut self.base
796            }
797        }
798    };
799}
800
801pub const STACKER_RED_ZONE_BYTES: usize = 64 * 1024;
802pub const STACKER_GROWTH_BYTES: usize = 1024 * 1024;
803
804#[cfg(feature = "stacker")]
805#[macro_export]
806macro_rules! maybe_grow_stack {
807    ($body:block) => {
808        $crate::stacker::maybe_grow(
809            $crate::STACKER_RED_ZONE_BYTES,
810            $crate::STACKER_GROWTH_BYTES,
811            || $body,
812        )
813    };
814}
815#[cfg(not(feature = "stacker"))]
816#[macro_export]
817macro_rules! maybe_grow_stack {
818    ($body:block) => {
819        $body
820    };
821}
822
823#[macro_export]
824macro_rules! cast_unchecked {
825    ($ptr:expr => $target:ty) => {{
826        let ptr = ($ptr as *const _ as *const ()).cast::<$target>();
827        unsafe { &*ptr }
828    }};
829    ($ptr:expr => mut $target:ty) => {{
830        let ptr = ($ptr as *mut _ as *mut ()).cast::<$target>();
831        unsafe { &mut *ptr }
832    }};
833}