use leo_ast::{AssignStatement, Expression, Identifier, NodeID, Statement};
use leo_span::Symbol;
use std::{cell::RefCell, fmt::Display};
#[derive(Debug, Default, Clone)]
pub struct Assigner {
inner: RefCell<AssignerInner>,
}
impl Assigner {
pub fn unique_symbol(&self, arg: impl Display, separator: impl Display) -> Symbol {
self.inner.borrow_mut().unique_symbol(arg, separator)
}
pub fn simple_assign_statement(&self, identifier: Identifier, value: Expression, id: NodeID) -> Statement {
self.inner.borrow_mut().simple_assign_statement(identifier, value, id)
}
}
#[derive(Debug, Default, Clone)]
pub struct AssignerInner {
pub(crate) counter: usize,
}
impl AssignerInner {
fn unique_symbol(&mut self, arg: impl Display, separator: impl Display) -> Symbol {
self.counter += 1;
Symbol::intern(&format!("{}{}{}", arg, separator, self.counter - 1))
}
fn simple_assign_statement(&mut self, identifier: Identifier, value: Expression, id: NodeID) -> Statement {
Statement::Assign(Box::new(AssignStatement {
place: Expression::Identifier(identifier),
value,
span: Default::default(),
id,
}))
}
}