use leo_span::Symbol;
use indexmap::IndexMap;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct RenameTable {
pub(crate) parent: Option<Box<RenameTable>>,
mapping: IndexMap<Symbol, Symbol>,
}
impl RenameTable {
pub(crate) fn new(parent: Option<Box<RenameTable>>) -> Self {
Self {
parent,
mapping: IndexMap::new(),
}
}
pub(crate) fn local_names(&self) -> impl Iterator<Item = &Symbol> {
self.mapping.keys()
}
pub(crate) fn update(&mut self, symbol: Symbol, new_symbol: Symbol) {
self.mapping.insert(symbol, new_symbol);
}
pub(crate) fn lookup(&self, symbol: Symbol) -> Option<&Symbol> {
if let Some(var) = self.mapping.get(&symbol) {
Some(var)
} else if let Some(parent) = &self.parent {
parent.lookup(symbol)
} else {
None
}
}
}