use super::ProcessingAsyncVisitor;
use crate::BlockToFunctionRewriter;
use leo_ast::{AstReconstructor, AsyncExpression, Block, Expression, IterationStatement, Node, Statement, Variant};
impl AstReconstructor for ProcessingAsyncVisitor<'_> {
type AdditionalInput = ();
type AdditionalOutput = ();
fn reconstruct_async(&mut self, input: AsyncExpression, _additional: &()) -> (Expression, Self::AdditionalOutput) {
let finalize_fn_name = self.state.assigner.unique_symbol(self.current_function, "$");
let mut block_to_function_rewriter = BlockToFunctionRewriter::new(self.state, self.current_program);
let (function, call_to_finalize) =
block_to_function_rewriter.rewrite_block(&input.block, finalize_fn_name, Variant::AsyncFunction);
if function.input.len() > self.max_inputs {
self.state.handler.emit_err(leo_errors::StaticAnalyzerError::async_block_capturing_too_many_vars(
function.input.len(),
self.max_inputs,
input.span,
));
}
self.new_async_functions.push((finalize_fn_name, function));
self.modified = true;
(call_to_finalize, ())
}
fn reconstruct_block(&mut self, input: Block) -> (Block, Self::AdditionalOutput) {
self.in_scope(input.id(), |slf| {
(
Block {
statements: input.statements.into_iter().map(|s| slf.reconstruct_statement(s).0).collect(),
span: input.span,
id: input.id,
},
Default::default(),
)
})
}
fn reconstruct_iteration(&mut self, input: IterationStatement) -> (Statement, Self::AdditionalOutput) {
self.in_scope(input.id(), |slf| {
(
IterationStatement {
type_: input.type_.map(|ty| slf.reconstruct_type(ty).0),
start: slf.reconstruct_expression(input.start, &()).0,
stop: slf.reconstruct_expression(input.stop, &()).0,
block: slf.reconstruct_block(input.block).0,
..input
}
.into(),
Default::default(),
)
})
}
}