diff options
| author | yukang <moorekang@gmail.com> | 2022-10-14 06:52:23 +0800 |
|---|---|---|
| committer | yukang <moorekang@gmail.com> | 2022-11-04 19:32:32 +0800 |
| commit | 4b77e730b5c9e5126abf12ccca5e36f2a2c66868 (patch) | |
| tree | c6ba20116cf2f207af73d2e528c7ab11966a0289 /compiler/rustc_parse/src | |
| parent | 1e25882944aabcf0c871182b887cd4ffe9c7b330 (diff) | |
| download | rust-4b77e730b5c9e5126abf12ccca5e36f2a2c66868.tar.gz rust-4b77e730b5c9e5126abf12ccca5e36f2a2c66868.zip | |
fake a base to suppress later extra error message
Diffstat (limited to 'compiler/rustc_parse/src')
| -rw-r--r-- | compiler/rustc_parse/src/errors.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_parse/src/parser/expr.rs | 29 |
2 files changed, 14 insertions, 17 deletions
diff --git a/compiler/rustc_parse/src/errors.rs b/compiler/rustc_parse/src/errors.rs index b02bd664533..0924c853715 100644 --- a/compiler/rustc_parse/src/errors.rs +++ b/compiler/rustc_parse/src/errors.rs @@ -373,7 +373,7 @@ pub(crate) struct MissingSemicolonBeforeArray { pub(crate) struct MissingDotDot { #[primary_span] pub token_span: Span, - #[suggestion_verbose(applicability = "maybe-incorrect", code = "..")] + #[suggestion(applicability = "maybe-incorrect", code = "..", style = "verbose")] pub sugg_span: Span, } diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 7de025e7860..338e6a8e289 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -2880,7 +2880,7 @@ impl<'a> Parser<'a> { }; while self.token != token::CloseDelim(close_delim) { - if self.eat(&token::DotDot) { + if self.eat(&token::DotDot) || self.recover_struct_fileds_dots(close_delim) { let exp_span = self.prev_token.span; // We permit `.. }` on the left-hand side of a destructuring assignment. if self.check(&token::CloseDelim(close_delim)) { @@ -2897,21 +2897,6 @@ impl<'a> Parser<'a> { } self.recover_struct_comma_after_dotdot(exp_span); break; - } else if self.token == token::DotDotDot { - // suggest `..v` instead of `...v` - let snapshot = self.create_snapshot_for_diagnostic(); - let span = self.token.span; - self.bump(); - match self.parse_expr() { - Ok(_p) => { - self.sess.emit_err(MissingDotDot { token_span: span, sugg_span: span }); - break; - } - Err(inner_err) => { - inner_err.cancel(); - self.restore_snapshot(snapshot); - } - } } let recovery_field = self.find_struct_error_after_field_looking_code(); @@ -3042,6 +3027,18 @@ impl<'a> Parser<'a> { self.recover_stmt(); } + fn recover_struct_fileds_dots(&mut self, close_delim: Delimiter) -> bool { + if !self.look_ahead(1, |t| *t == token::CloseDelim(close_delim)) + && self.eat(&token::DotDotDot) + { + // recover from typo of `...`, suggest `..` + let span = self.prev_token.span; + self.sess.emit_err(MissingDotDot { token_span: span, sugg_span: span }); + return true; + } + false + } + /// Parses `ident (COLON expr)?`. fn parse_expr_field(&mut self) -> PResult<'a, ExprField> { let attrs = self.parse_outer_attributes()?; |
