Add flag to forbid recovery in the parser

This commit is contained in:
Nilstrieb 2022-10-25 21:24:01 +02:00
parent 85d089b41e
commit ed14202864
No known key found for this signature in database
3 changed files with 24 additions and 2 deletions

View file

@ -115,6 +115,12 @@ macro_rules! maybe_recover_from_interpolated_ty_qpath {
};
}
#[derive(Clone, Copy)]
pub enum Recovery {
Allowed,
Forbidden,
}
#[derive(Clone)]
pub struct Parser<'a> {
pub sess: &'a ParseSess,
@ -152,12 +158,15 @@ pub struct Parser<'a> {
/// This allows us to recover when the user forget to add braces around
/// multiple statements in the closure body.
pub current_closure: Option<ClosureSpans>,
/// Whether the parser is allowed to recover and parse invalid code successfully (and emit a diagnostic as a side effect).
/// This is disabled when parsing macro arguments, see #103534
pub recovery: Recovery,
}
// This type is used a lot, e.g. it's cloned when matching many declarative macro rules. Make sure
// This type is used a lot, e.g. it's cloned when matching many declarative macro rules with nonterminals. Make sure
// it doesn't unintentionally get bigger.
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
rustc_data_structures::static_assert_size!(Parser<'_>, 328);
rustc_data_structures::static_assert_size!(Parser<'_>, 336);
/// Stores span information about a closure.
#[derive(Clone)]
@ -483,6 +492,7 @@ impl<'a> Parser<'a> {
inner_attr_ranges: Default::default(),
},
current_closure: None,
recovery: Recovery::Allowed,
};
// Make parser point to the first token.
@ -491,6 +501,15 @@ impl<'a> Parser<'a> {
parser
}
pub fn forbid_recovery(mut self) -> Self {
self.recovery = Recovery::Forbidden;
self
}
fn may_recover(&self) -> bool {
matches!(self.recovery, Recovery::Allowed)
}
pub fn unexpected<T>(&mut self) -> PResult<'a, T> {
match self.expect_one_of(&[], &[]) {
Err(e) => Err(e),