Skip to content

Commit 5d9cd4b

Browse files
committed
Suggest i += 1 when we see i++ or ++i
1 parent 6970f88 commit 5d9cd4b

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

compiler/rustc_parse/src/parser/diagnostics.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,6 +1882,49 @@ impl<'a> Parser<'a> {
18821882
self.sess.expr_parentheses_needed(&mut err, *sp);
18831883
}
18841884
err.span_label(span, "expected expression");
1885+
if self.prev_token.kind == TokenKind::BinOp(token::Plus)
1886+
&& self.token.kind == TokenKind::BinOp(token::Plus)
1887+
&& self.look_ahead(1, |t| !t.is_lit())
1888+
{
1889+
let span = self.prev_token.span.to(self.token.span);
1890+
err.note("Rust has no dedicated increment operator");
1891+
err.span_suggestion_verbose(
1892+
span,
1893+
"try using `+= 1` instead",
1894+
" += 1".into(),
1895+
Applicability::Unspecified,
1896+
);
1897+
} else if self.token.kind == TokenKind::BinOp(token::Plus)
1898+
&& self.look_ahead(1, |t| t.kind == TokenKind::BinOp(token::Plus))
1899+
&& self.look_ahead(2, |t| !t.is_lit())
1900+
{
1901+
let target_span = self.look_ahead(2, |t| t.span);
1902+
let left_brace_span = target_span.shrink_to_lo();
1903+
let pre_span = self.token.span.to(self.look_ahead(1, |t| t.span));
1904+
let post_span = target_span.shrink_to_hi();
1905+
1906+
err.note("Rust has no dedicated increment operator");
1907+
1908+
if self.prev_token.kind == TokenKind::Semi {
1909+
err.multipart_suggestion(
1910+
"try using `+= 1` instead",
1911+
vec![(pre_span, String::new()), (post_span, " += 1".into())],
1912+
Applicability::MachineApplicable,
1913+
);
1914+
} else if let Ok(target_snippet) = self.span_to_snippet(target_span) {
1915+
err.multipart_suggestion(
1916+
"try using `+= 1` instead",
1917+
vec![
1918+
(left_brace_span, "{ ".to_string()),
1919+
(pre_span, String::new()),
1920+
(post_span, format!(" += 1; {} }}", target_snippet)),
1921+
],
1922+
Applicability::MachineApplicable,
1923+
);
1924+
} else {
1925+
err.span_help(pre_span.to(target_span), "try using `+= 1` instead");
1926+
}
1927+
}
18851928
err
18861929
}
18871930

src/test/ui/parser/increment.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
fn post_regular() {
2+
let i = 0;
3+
i++; //~ ERROR
4+
}
5+
6+
fn post_while() {
7+
let i = 0;
8+
while i++ < 5 {
9+
//~^ ERROR
10+
println!("{}", i);
11+
}
12+
}
13+
14+
fn pre_regular() {
15+
let i = 0;
16+
++i; //~ ERROR
17+
}
18+
19+
fn pre_while() {
20+
let i = 0;
21+
while ++i < 5 {
22+
//~^ ERROR
23+
println!("{}", i);
24+
}
25+
}
26+
27+
fn main() {}

src/test/ui/parser/increment.stderr

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
error: expected expression, found `+`
2+
--> $DIR/increment.rs:3:7
3+
|
4+
LL | i++;
5+
| ^ expected expression
6+
|
7+
= note: Rust has no dedicated increment operator
8+
help: try using `+= 1` instead
9+
|
10+
LL | i += 1;
11+
| ~~~~
12+
13+
error: expected expression, found `+`
14+
--> $DIR/increment.rs:8:13
15+
|
16+
LL | while i++ < 5 {
17+
| ^ expected expression
18+
|
19+
= note: Rust has no dedicated increment operator
20+
help: try using `+= 1` instead
21+
|
22+
LL | while i += 1 < 5 {
23+
| ~~~~
24+
25+
error: expected expression, found `+`
26+
--> $DIR/increment.rs:16:5
27+
|
28+
LL | ++i;
29+
| ^ expected expression
30+
|
31+
= note: Rust has no dedicated increment operator
32+
help: try using `+= 1` instead
33+
|
34+
LL - ++i;
35+
LL + i += 1;
36+
|
37+
38+
error: expected expression, found `+`
39+
--> $DIR/increment.rs:21:11
40+
|
41+
LL | while ++i < 5 {
42+
| ^ expected expression
43+
|
44+
= note: Rust has no dedicated increment operator
45+
help: try using `+= 1` instead
46+
|
47+
LL - while ++i < 5 {
48+
LL + while { i += 1; i } < 5 {
49+
|
50+
51+
error: aborting due to 4 previous errors
52+

0 commit comments

Comments
 (0)