Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/parser.rs')
-rw-r--r--crates/parser/src/parser.rs19
1 files changed, 11 insertions, 8 deletions
diff --git a/crates/parser/src/parser.rs b/crates/parser/src/parser.rs
index f6b3783d1c..75a75f601c 100644
--- a/crates/parser/src/parser.rs
+++ b/crates/parser/src/parser.rs
@@ -258,22 +258,25 @@ impl<'t> Parser<'t> {
self.err_recover(message, TokenSet::EMPTY);
}
- /// Create an error node and consume the next token.
- pub(crate) fn err_recover(&mut self, message: &str, recovery: TokenSet) {
+ /// Create an error node and consume the next token unless it is in the recovery set.
+ ///
+ /// Returns true if recovery kicked in.
+ pub(crate) fn err_recover(&mut self, message: &str, recovery: TokenSet) -> bool {
if matches!(self.current(), T!['{'] | T!['}']) {
self.error(message);
- return;
+ return true;
}
if self.at_ts(recovery) {
self.error(message);
- return;
+ return true;
}
let m = self.start();
self.error(message);
self.bump_any();
m.complete(self, ERROR);
+ false
}
fn do_bump(&mut self, kind: SyntaxKind, n_raw_tokens: u8) {
@@ -324,10 +327,10 @@ impl Marker {
self.bomb.defuse();
let idx = self.pos as usize;
if idx == p.events.len() - 1 {
- match p.events.pop() {
- Some(Event::Start { kind: TOMBSTONE, forward_parent: None }) => (),
- _ => unreachable!(),
- }
+ assert!(matches!(
+ p.events.pop(),
+ Some(Event::Start { kind: TOMBSTONE, forward_parent: None })
+ ));
}
}
}