1
Fork 0

Refactor, handle fields better, add field tests

This commit is contained in:
Noah Lev 2022-02-17 12:28:07 -08:00
parent 80e57e223e
commit 67a9adbb54
7 changed files with 66 additions and 22 deletions

View file

@ -156,10 +156,15 @@ impl AttemptLocalParseRecovery {
}
}
/// Information for emitting suggestions and recovering from
/// C-style `i++`, `--i`, etc.
#[derive(Debug, Copy, Clone)]
struct IncDecRecovery {
/// This increment/decrement is not a subexpression.
standalone: bool,
/// Is this an increment or decrement?
op: IncOrDec,
/// Is this pre- or postfix?
fixity: UnaryFixity,
}
@ -1278,20 +1283,16 @@ impl<'a> Parser<'a> {
}
if kind.standalone {
self.inc_dec_standalone_recovery(base, err, kind, ident, spans)
self.inc_dec_standalone_recovery(base, err, kind, spans)
} else {
match kind.fixity {
UnaryFixity::Pre => {
self.prefix_inc_dec_suggest_and_recover(base, err, kind, ident, spans)
}
UnaryFixity::Post => {
self.postfix_inc_dec_suggest_and_recover(base, err, kind, ident, spans)
}
UnaryFixity::Pre => self.prefix_inc_dec_suggest(base, err, kind, ident, spans),
UnaryFixity::Post => self.postfix_inc_dec_suggest(base, err, kind, ident, spans),
}
}
}
fn prefix_inc_dec_suggest_and_recover(
fn prefix_inc_dec_suggest(
&mut self,
_base: P<Expr>,
mut err: DiagnosticBuilder<'a>,
@ -1310,7 +1311,7 @@ impl<'a> Parser<'a> {
Err(err)
}
fn postfix_inc_dec_suggest_and_recover(
fn postfix_inc_dec_suggest(
&mut self,
_base: P<Expr>,
mut err: DiagnosticBuilder<'a>,
@ -1334,7 +1335,6 @@ impl<'a> Parser<'a> {
_base: P<Expr>,
mut err: DiagnosticBuilder<'a>,
kind: IncDecRecovery,
_ident: Ident,
(pre_span, post_span): (Span, Span),
) -> PResult<'a, P<Expr>> {
err.multipart_suggestion(

View file

@ -592,13 +592,7 @@ impl<'a> Parser<'a> {
this.bump();
this.parse_prefix_expr(None)
} // `+expr`
token::Ident(..) if this.token.is_keyword(kw::Box) => {
make_it!(this, attrs, |this, _| this.parse_box_expr(lo))
}
token::Ident(..) if this.is_mistaken_not_ident_negation() => {
make_it!(this, attrs, |this, _| this.recover_not_expr(lo))
}
// Recover from `++x`
// Recover from `++x`:
token::BinOp(token::Plus)
if this.look_ahead(1, |t| *t == token::BinOp(token::Plus)) =>
{
@ -608,9 +602,15 @@ impl<'a> Parser<'a> {
this.bump();
this.bump();
let operand_expr = this.parse_path_start_expr(Default::default())?;
let operand_expr = this.parse_dot_or_call_expr(Default::default())?;
this.maybe_recover_from_prefix_increment(operand_expr, pre_span, prev_is_semi)
}
token::Ident(..) if this.token.is_keyword(kw::Box) => {
make_it!(this, attrs, |this, _| this.parse_box_expr(lo))
}
token::Ident(..) if this.is_mistaken_not_ident_negation() => {
make_it!(this, attrs, |this, _| this.recover_not_expr(lo))
}
_ => return this.parse_dot_or_call_expr(Some(attrs)),
}
}