use super::CommonSubexpressionEliminatingVisitor;
use leo_ast::*;
impl AstReconstructor for CommonSubexpressionEliminatingVisitor<'_> {
type AdditionalInput = ();
type AdditionalOutput = ();
fn reconstruct_expression(&mut self, input: Expression, _additional: &()) -> (Expression, Self::AdditionalOutput) {
(self.try_expr(input, None).expect("CSE Error: Error reconstructing expression").0, Default::default())
}
fn reconstruct_block(&mut self, mut block: Block) -> (Block, Self::AdditionalOutput) {
self.in_scope(|slf| {
block.statements = block.statements.into_iter().map(|s| slf.reconstruct_statement(s).0).collect();
(block, Default::default())
})
}
fn reconstruct_definition(&mut self, mut input: DefinitionStatement) -> (Statement, Self::AdditionalOutput) {
match input.place {
DefinitionPlace::Single(place) => {
let (value, definition_not_needed) = self
.try_expr(input.value, Some(place.name))
.expect("CSE Error: Error reconstructing single definition");
if definition_not_needed {
(Statement::dummy(), Default::default())
} else {
input.value = value;
(input.into(), Default::default())
}
}
DefinitionPlace::Multiple(_) => {
let (value, _) =
self.try_expr(input.value, None).expect("CSE Error: Error reconstructing multiple definitions");
input.value = value;
(input.into(), Default::default())
}
}
}
fn reconstruct_iteration(&mut self, _: IterationStatement) -> (Statement, Self::AdditionalOutput) {
panic!("`IterationStatement`s should not be in the AST at this phase of compilation.");
}
}