diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2021-04-08 19:12:00 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2021-04-09 10:22:41 -0700 |
| commit | 0d7167698fcb957d98ccfb77729196bf33442841 (patch) | |
| tree | be354ce28502b1af078ab19d8b0fbc5f87f7e498 /compiler/rustc_parse/src | |
| parent | 8e8159681f216e74c4e45aaa6440da0ecad8b5c3 (diff) | |
| download | rust-0d7167698fcb957d98ccfb77729196bf33442841.tar.gz rust-0d7167698fcb957d98ccfb77729196bf33442841.zip | |
Avoid `;` -> `,` recovery and unclosed `}` recovery from being too verbose
Those two recovery attempts have a very bad interaction that causes too unnecessary output. Add a simple gate to avoid interpreting a `;` as a `,` when there are unclosed braces.
Diffstat (limited to 'compiler/rustc_parse/src')
| -rw-r--r-- | compiler/rustc_parse/src/parser/mod.rs | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index 748a8e2bb49..2fa25e40c6b 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -703,6 +703,8 @@ impl<'a> Parser<'a> { let mut recovered = false; let mut trailing = false; let mut v = vec![]; + let unclosed_delims = !self.unclosed_delims.is_empty(); + while !self.expect_any_with_type(kets, expect) { if let token::CloseDelim(..) | token::Eof = self.token.kind { break; @@ -723,7 +725,7 @@ impl<'a> Parser<'a> { // Attempt to keep parsing if it was a similar separator. if let Some(ref tokens) = t.similar_tokens() { - if tokens.contains(&self.token.kind) { + if tokens.contains(&self.token.kind) && !unclosed_delims { self.bump(); } } |
