use leo_ast::{AssignStatement, Expression, Identifier, Statement};
use leo_span::Symbol;
use std::fmt::Display;
#[derive(Default)]
pub struct Assigner {
pub(crate) counter: usize,
}
impl Assigner {
pub(crate) fn unique_symbol(&mut self, arg: impl Display, separator: impl Display) -> Symbol {
self.counter += 1;
Symbol::intern(&format!("{}{}{}", arg, separator, self.counter - 1))
}
pub(crate) fn simple_assign_statement(&mut self, identifier: Identifier, value: Expression) -> Statement {
Statement::Assign(Box::new(AssignStatement {
place: Expression::Identifier(identifier),
value,
span: Default::default(),
}))
}
pub(crate) fn unique_simple_assign_statement(&mut self, expr: Expression) -> (Identifier, Statement) {
let name = self.unique_symbol("$var", "$");
let place = Identifier {
name,
span: Default::default(),
};
(place, self.simple_assign_statement(place, expr))
}
}