ast: Avoid aborts on fatal errors thrown from mutable AST visitor

Set the node to some dummy value and rethwor the error instead.
This commit is contained in:
Vadim Petrochenkov 2021-10-17 19:32:34 +03:00
parent 887999d163
commit bdb851f567
2 changed files with 127 additions and 21 deletions

View file

@ -1160,13 +1160,18 @@ macro_rules! assign_id {
impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
fn visit_crate(&mut self, krate: &mut ast::Crate) {
let span = krate.span;
let empty_crate =
|| ast::Crate { attrs: Vec::new(), items: Vec::new(), span, is_placeholder: None };
let mut fold_crate = |krate: ast::Crate| {
visit_clobber(krate, |krate| {
let span = krate.span;
let mut krate = match self.configure(krate) {
Some(krate) => krate,
None => return empty_crate(),
None => {
return ast::Crate {
attrs: Vec::new(),
items: Vec::new(),
span,
is_placeholder: None,
};
}
};
if let Some(attr) = self.take_first_attr(&mut krate) {
@ -1177,10 +1182,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
noop_visit_crate(&mut krate, self);
krate
};
// Cannot use `visit_clobber` here, see the FIXME on it.
*krate = fold_crate(mem::replace(krate, empty_crate()));
})
}
fn visit_expr(&mut self, expr: &mut P<ast::Expr>) {