use super::super::form::SsaExpr;
use super::super::variable::SsaVariable;
pub(super) fn collect_expr_uses(expr: &SsaExpr) -> Vec<SsaVariable> {
let mut out = Vec::new();
collect_expr_uses_into(expr, &mut out);
out
}
fn collect_expr_uses_into(expr: &SsaExpr, out: &mut Vec<SsaVariable>) {
match expr {
SsaExpr::Variable(v) => out.push(v.clone()),
SsaExpr::Binary { left, right, .. } => {
collect_expr_uses_into(left, out);
collect_expr_uses_into(right, out);
}
SsaExpr::Unary { operand, .. } => collect_expr_uses_into(operand, out),
SsaExpr::Call { args, .. } => {
for arg in args {
collect_expr_uses_into(arg, out);
}
}
SsaExpr::Index { base, index } => {
collect_expr_uses_into(base, out);
collect_expr_uses_into(index, out);
}
SsaExpr::Member { base, .. } => collect_expr_uses_into(base, out),
SsaExpr::Cast { expr, .. } => collect_expr_uses_into(expr, out),
SsaExpr::Array(elements) => {
for element in elements {
collect_expr_uses_into(element, out);
}
}
SsaExpr::Map(pairs) => {
for (key, value) in pairs {
collect_expr_uses_into(key, out);
collect_expr_uses_into(value, out);
}
}
SsaExpr::Ternary {
condition,
then_expr,
else_expr,
} => {
collect_expr_uses_into(condition, out);
collect_expr_uses_into(then_expr, out);
collect_expr_uses_into(else_expr, out);
}
SsaExpr::Literal(_) => {}
}
}