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
use std::cell::RefCell; use std::collections::HashSet; use std::rc::Rc; #[derive(Debug, Clone, Default)] pub(crate) struct VariablesStack { stack: Rc<RefCell<Vec<HashSet<String>>>>, } impl VariablesStack { pub(crate) fn new() -> Self { let instance = Self { stack: Rc::new(RefCell::new(vec![])), }; instance.push(); instance } pub(crate) fn push(&self) { self.stack.borrow_mut().push(HashSet::new()) } pub(crate) fn pop(&self) { self.stack.borrow_mut().pop(); } #[allow(dead_code)] pub(crate) fn reset(&self) { self.stack.borrow_mut().clear() } pub(crate) fn declare(&self, name: &str) { self.stack .borrow_mut() .last_mut() .expect("expected variables_stack to have at least 1 layer") .insert(name.to_owned()); } pub(crate) fn is_declared(&self, name: &str) -> bool { self.stack .borrow() .last() .expect("expected variables_stack to have at least 1 layer") .contains(name) } }