use crate::Destructurer;
use leo_ast::{
AccessExpression,
ArrayAccess,
Expression,
ExpressionReconstructor,
IntegerType,
Literal,
Statement,
TupleAccess,
Type,
};
impl ExpressionReconstructor for Destructurer<'_> {
type AdditionalOutput = Vec<Statement>;
fn reconstruct_tuple_access(&mut self, input: TupleAccess) -> (Expression, Self::AdditionalOutput) {
let Expression::Identifier(identifier) = input.tuple.as_ref() else {
panic!("SSA guarantees that subexpressions are identifiers or literals.");
};
match self.tuples.get(&identifier.name).and_then(|tuple_expr| tuple_expr.elements.get(input.index.value())) {
Some(element) => (element.clone(), Default::default()),
None => {
if matches!(self.type_table.get(&identifier.id), Some(Type::Future(_))) {
(
Expression::Access(AccessExpression::Array(ArrayAccess {
array: Box::new(Expression::Identifier(*identifier)),
index: Box::new(Expression::Literal(Literal::Integer(
IntegerType::U32,
input.index.to_string(),
input.span,
Default::default(),
))),
span: input.span,
id: input.id,
})),
Default::default(),
)
} else {
panic!("SSA guarantees that all tuple accesses are declared and indices are valid.")
}
}
}
}
}