use crate::syntax::ast::AstPayload;
use crate::syntax::ast::AstStmtP;
use crate::syntax::ast::StmtP;
pub fn top_level_stmts<P: AstPayload>(top: &AstStmtP<P>) -> Vec<&AstStmtP<P>> {
fn f<'a, P: AstPayload>(ast: &'a AstStmtP<P>, res: &mut Vec<&'a AstStmtP<P>>) {
match &**ast {
StmtP::Statements(xs) => {
for x in xs {
f(x, res);
}
}
_ => res.push(ast),
}
}
let mut res = Vec::new();
f(top, &mut res);
res
}
pub fn top_level_stmts_mut<P: AstPayload>(top: &mut AstStmtP<P>) -> Vec<&mut AstStmtP<P>> {
fn f<'a, P: AstPayload>(ast: &'a mut AstStmtP<P>, res: &mut Vec<&'a mut AstStmtP<P>>) {
match &mut **ast {
StmtP::Statements(_) => {
if let StmtP::Statements(xs) = &mut **ast {
for x in xs {
f(x, res);
}
} else {
unreachable!("Work around borrow checker");
}
}
_ => res.push(ast),
}
}
let mut res = Vec::new();
f(top, &mut res);
res
}