use leo_ast::{DefinitionPlace, DefinitionStatement, 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_definition(&self, identifier: Identifier, value: Expression, id: NodeID) -> Statement {
self.inner.borrow_mut().simple_definition(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_definition(&mut self, identifier: Identifier, value: Expression, id: NodeID) -> Statement {
DefinitionStatement {
place: DefinitionPlace::Single(identifier),
type_: None,
value,
span: Default::default(),
id,
}
.into()
}
}