1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use std::any::Any;
use std::borrow::BorrowMut;
use std::cell::{Cell, RefCell};
use std::rc::{Rc, Weak};
use crate::atn::INVALID_ALT;
use crate::parser_rule_context::{BaseParserRuleContext, ParserRuleContext, ParserRuleContextType};
pub trait RuleContext {
fn get_invoking_state(&self) -> isize;
fn set_invoking_state(&self, t: isize);
fn is_empty(&self) -> bool {
self.get_invoking_state() == -1
}
fn get_parent_ctx(&self) -> Option<Rc<dyn ParserRuleContext>>;
fn set_parent(&self, parent: &Option<Rc<dyn ParserRuleContext>>);
}
pub struct EmptyCustomRuleContext;
impl CustomRuleContext for EmptyCustomRuleContext {
fn get_rule_index(&self) -> usize {
usize::max_value()
}
}
pub trait CustomRuleContext: 'static {
fn get_rule_index(&self) -> usize;
fn get_alt_number(&self) -> isize { INVALID_ALT }
fn set_alt_number(&self, _alt_number: isize) {}
fn enter(_ctx: &BaseParserRuleContext<Self>, _listener: &mut dyn Any) where Self: Sized {}
fn exit(_ctx: &BaseParserRuleContext<Self>, _listener: &mut dyn Any) where Self: Sized {}
}
pub struct BaseRuleContext<Ctx: CustomRuleContext> {
pub(crate) parent_ctx: RefCell<Option<Weak<dyn ParserRuleContext>>>,
invoking_state: Cell<isize>,
pub(crate) ext: Ctx,
}
impl<Ctx: CustomRuleContext> BaseRuleContext<Ctx> {
pub(crate) fn new_ctx(parent_ctx: Option<ParserRuleContextType>, invoking_state: isize, ext: Ctx) -> Self {
BaseRuleContext {
parent_ctx: RefCell::new(parent_ctx.as_ref().map(Rc::downgrade)),
invoking_state: Cell::new(invoking_state),
ext,
}
}
}
impl<Ctx: CustomRuleContext> RuleContext for BaseRuleContext<Ctx> {
fn get_invoking_state(&self) -> isize {
self.invoking_state.get()
}
fn set_invoking_state(&self, t: isize) {
self.invoking_state.set(t)
}
fn get_parent_ctx(&self) -> Option<Rc<dyn ParserRuleContext>> {
self.parent_ctx.borrow().as_ref().map(Weak::upgrade).flatten()
}
fn set_parent(&self, parent: &Option<Rc<dyn ParserRuleContext>>) {
*self.parent_ctx.borrow_mut() = parent.as_ref().map(Rc::downgrade);
}
}