use super::DeadCodeEliminatingVisitor;
use leo_ast::*;
impl AstReconstructor for DeadCodeEliminatingVisitor<'_> {
type AdditionalInput = ();
type AdditionalOutput = ();
fn reconstruct_path(&mut self, input: Path, _additional: &()) -> (Expression, Self::AdditionalOutput) {
self.used_variables.insert(input.identifier().name);
(input.into(), Default::default())
}
fn reconstruct_composite_init(
&mut self,
mut input: leo_ast::CompositeExpression,
_additional: &(),
) -> (Expression, Self::AdditionalOutput) {
for member in input.members.iter_mut() {
if let Some(expr) = std::mem::take(&mut member.expression) {
member.expression = Some(self.reconstruct_expression(expr, &()).0);
} else {
self.reconstruct_path(Path::from(member.identifier).to_local(), &());
}
}
(input.into(), Default::default())
}
fn reconstruct_assign(&mut self, _input: AssignStatement) -> (Statement, Self::AdditionalOutput) {
panic!("`AssignStatement`s should not exist in the AST at this phase of compilation.")
}
fn reconstruct_block(&mut self, block: Block) -> (Block, Self::AdditionalOutput) {
self.statements_before += block.statements.iter().filter(|stmt| !stmt.is_empty()).count() as u32;
let mut statements: Vec<Statement> =
block.statements.into_iter().rev().map(|statement| self.reconstruct_statement(statement).0).collect();
statements.retain(|stmt| !stmt.is_empty());
statements.reverse();
self.statements_after += statements.len() as u32;
(Block { statements, span: block.span, id: block.id }, Default::default())
}
fn reconstruct_definition(&mut self, mut input: DefinitionStatement) -> (Statement, Self::AdditionalOutput) {
let lhs_is_used = match &input.place {
DefinitionPlace::Single(identifier) => self.used_variables.contains(&identifier.name),
DefinitionPlace::Multiple(identifiers) => {
identifiers.iter().any(|identifier| self.used_variables.contains(&identifier.name))
}
};
if !lhs_is_used && self.is_pure(&input.value) {
(Statement::dummy(), Default::default())
} else {
input.value = self.reconstruct_expression(input.value, &()).0;
(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.");
}
fn reconstruct_expression_statement(&mut self, input: ExpressionStatement) -> (Statement, Self::AdditionalOutput) {
if self.is_pure(&input.expression) {
(Statement::dummy(), Default::default())
} else {
(
ExpressionStatement { expression: self.reconstruct_expression(input.expression, &()).0, ..input }
.into(),
Default::default(),
)
}
}
}