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