diff options
| author | Noah Lev <camelidcamel@gmail.com> | 2022-02-17 12:28:07 -0800 |
|---|---|---|
| committer | Noah Lev <camelidcamel@gmail.com> | 2022-03-23 22:31:57 -0700 |
| commit | 67a9adbb541f7c62e993d05ff3687a8695d5d349 (patch) | |
| tree | 3a957fdbde1fdef634d6ea682feaf686f0015616 | |
| parent | 80e57e223e98f7075cc4af83fa0eef948493d0df (diff) | |
| download | rust-67a9adbb541f7c62e993d05ff3687a8695d5d349.tar.gz rust-67a9adbb541f7c62e993d05ff3687a8695d5d349.zip | |
Refactor, handle fields better, add field tests
| -rw-r--r-- | compiler/rustc_parse/src/parser/diagnostics.rs | 20 | ||||
| -rw-r--r-- | compiler/rustc_parse/src/parser/expr.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/parser/increment-autofix.fixed (renamed from src/test/ui/parser/increment.fixed) | 0 | ||||
| -rw-r--r-- | src/test/ui/parser/increment-autofix.rs (renamed from src/test/ui/parser/increment.rs) | 0 | ||||
| -rw-r--r-- | src/test/ui/parser/increment-autofix.stderr (renamed from src/test/ui/parser/increment.stderr) | 8 | ||||
| -rw-r--r-- | src/test/ui/parser/increment-notfixed.rs | 26 | ||||
| -rw-r--r-- | src/test/ui/parser/increment-notfixed.stderr | 18 |
7 files changed, 66 insertions, 22 deletions
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 89cb1c89f81..38e67790d74 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -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( diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 39d96b8a9e3..34ccd167e4e 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -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)), } } diff --git a/src/test/ui/parser/increment.fixed b/src/test/ui/parser/increment-autofix.fixed index ad61c4e66d2..ad61c4e66d2 100644 --- a/src/test/ui/parser/increment.fixed +++ b/src/test/ui/parser/increment-autofix.fixed diff --git a/src/test/ui/parser/increment.rs b/src/test/ui/parser/increment-autofix.rs index f31031fed3a..f31031fed3a 100644 --- a/src/test/ui/parser/increment.rs +++ b/src/test/ui/parser/increment-autofix.rs diff --git a/src/test/ui/parser/increment.stderr b/src/test/ui/parser/increment-autofix.stderr index 6a2b37e3ddc..46ab48f3684 100644 --- a/src/test/ui/parser/increment.stderr +++ b/src/test/ui/parser/increment-autofix.stderr @@ -1,5 +1,5 @@ error: Rust has no postfix increment operator - --> $DIR/increment.rs:5:6 + --> $DIR/increment-autofix.rs:5:6 | LL | i++; | ^^ not a valid postfix operator @@ -10,7 +10,7 @@ LL | { let tmp = i; i += 1; tmp }; | +++++++++++ ~~~~~~~~~~~~~~~ error: Rust has no postfix increment operator - --> $DIR/increment.rs:11:12 + --> $DIR/increment-autofix.rs:11:12 | LL | while i++ < 5 { | ^^ not a valid postfix operator @@ -21,7 +21,7 @@ LL | while { let tmp = i; i += 1; tmp } < 5 { | +++++++++++ ~~~~~~~~~~~~~~~ error: Rust has no prefix increment operator - --> $DIR/increment.rs:19:5 + --> $DIR/increment-autofix.rs:19:5 | LL | ++i; | ^^ not a valid prefix operator @@ -33,7 +33,7 @@ LL + i += 1; | error: Rust has no prefix increment operator - --> $DIR/increment.rs:25:11 + --> $DIR/increment-autofix.rs:25:11 | LL | while ++i < 5 { | ^^ not a valid prefix operator diff --git a/src/test/ui/parser/increment-notfixed.rs b/src/test/ui/parser/increment-notfixed.rs new file mode 100644 index 00000000000..d0efe952982 --- /dev/null +++ b/src/test/ui/parser/increment-notfixed.rs @@ -0,0 +1,26 @@ +struct Foo { + bar: Bar, +} + +struct Bar { + qux: i32, +} + +fn post_field() { + let foo = Foo { bar: Bar { qux: 0 } }; + foo.bar.qux++; + //~^ ERROR Rust has no postfix increment operator + println!("{}", foo.bar.qux); +} + +fn pre_field() { + let foo = Foo { bar: Bar { qux: 0 } }; + ++foo.bar.qux; + //~^ ERROR Rust has no prefix increment operator + println!("{}", foo.bar.qux); +} + +fn main() { + post_field(); + pre_field(); +} diff --git a/src/test/ui/parser/increment-notfixed.stderr b/src/test/ui/parser/increment-notfixed.stderr new file mode 100644 index 00000000000..cf60075d00c --- /dev/null +++ b/src/test/ui/parser/increment-notfixed.stderr @@ -0,0 +1,18 @@ +error: Rust has no postfix increment operator + --> $DIR/increment-notfixed.rs:11:16 + | +LL | foo.bar.qux++; + | ^^ not a valid postfix operator + | + = help: use `+= 1` instead + +error: Rust has no prefix increment operator + --> $DIR/increment-notfixed.rs:18:5 + | +LL | ++foo.bar.qux; + | ^^ not a valid prefix operator + | + = help: use `+= 1` instead + +error: aborting due to 2 previous errors + |
