fake a base to suppress later extra error message
This commit is contained in:
parent
1e25882944
commit
4b77e730b5
4 changed files with 36 additions and 42 deletions
|
@ -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,
|
||||
}
|
||||
|
||||
|
|
|
@ -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()?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue