lib_ruby_parser/
variables_stack.rs

1use std::cell::RefCell;
2use std::collections::BTreeSet;
3use std::rc::Rc;
4
5#[derive(Debug, Clone, Default)]
6pub(crate) struct VariablesStack {
7    stack: Rc<RefCell<Vec<BTreeSet<String>>>>,
8}
9
10impl VariablesStack {
11    pub(crate) fn new() -> Self {
12        Self {
13            stack: Rc::new(RefCell::new(vec![])),
14        }
15    }
16
17    pub(crate) fn is_empty(&self) -> bool {
18        self.stack.borrow().is_empty()
19    }
20
21    pub(crate) fn push(&self) {
22        self.stack.borrow_mut().push(BTreeSet::new())
23    }
24
25    pub(crate) fn pop(&self) {
26        self.stack.borrow_mut().pop();
27    }
28
29    pub(crate) fn declare(&self, name: &str) {
30        self.stack
31            .borrow_mut()
32            .last_mut()
33            .expect("expected variables_stack to have at least 1 layer")
34            .insert(name.to_string());
35    }
36
37    pub(crate) fn is_declared(&self, name: &str) -> bool {
38        self.stack
39            .borrow()
40            .last()
41            .expect("expected variables_stack to have at least 1 layer")
42            .contains(name)
43    }
44}