Skip to content

Commit beb4967

Browse files
Rollup merge of rust-lang#111118 - chenyukang:yukang-sugg-struct, r=compiler-errors
Suggest struct when we get colon in fileds in enum A follow-up fix for rust-lang#109128 From: rust-lang#109128 (comment) r? `@estebank`
2 parents 6859414 + 0e8703d commit beb4967

File tree

4 files changed

+50
-8
lines changed

4 files changed

+50
-8
lines changed

compiler/rustc_parse/src/parser/item.rs

+22-3
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,7 @@ impl<'a> Parser<'a> {
12621262
}
12631263
}
12641264

1265+
let prev_span = self.prev_token.span;
12651266
let id = self.parse_ident()?;
12661267
let mut generics = self.parse_generics()?;
12671268
generics.where_clause = self.parse_where_clause()?;
@@ -1273,10 +1274,28 @@ impl<'a> Parser<'a> {
12731274
(thin_vec![], false)
12741275
} else {
12751276
self.parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()).map_err(
1276-
|mut e| {
1277-
e.span_label(id.span, "while parsing this enum");
1277+
|mut err| {
1278+
err.span_label(id.span, "while parsing this enum");
1279+
if self.token == token::Colon {
1280+
let snapshot = self.create_snapshot_for_diagnostic();
1281+
self.bump();
1282+
match self.parse_ty() {
1283+
Ok(_) => {
1284+
err.span_suggestion_verbose(
1285+
prev_span,
1286+
"perhaps you meant to use `struct` here",
1287+
"struct".to_string(),
1288+
Applicability::MaybeIncorrect,
1289+
);
1290+
}
1291+
Err(e) => {
1292+
e.cancel();
1293+
}
1294+
}
1295+
self.restore_snapshot(snapshot);
1296+
}
12781297
self.recover_stmt();
1279-
e
1298+
err
12801299
},
12811300
)?
12821301
};
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// run-rustfix
2+
3+
struct VecOrMap {
4+
//~^ HELP: perhaps you meant to use `struct` here
5+
vec: Vec<usize>,
6+
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
7+
//~| HELP: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
8+
}
9+
10+
fn main() {
11+
let o = VecOrMap { vec: vec![1, 2, 3] };
12+
println!("{:?}", o.vec);
13+
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
enum VecOrMap{
1+
// run-rustfix
2+
3+
enum VecOrMap {
4+
//~^ HELP: perhaps you meant to use `struct` here
25
vec: Vec<usize>,
36
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
47
//~| HELP: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
5-
map: HashMap<String,usize>
68
}
79

8-
fn main() {}
10+
fn main() {
11+
let o = VecOrMap { vec: vec![1, 2, 3] };
12+
println!("{:?}", o.vec);
13+
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
error: expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
2-
--> $DIR/issue-103869.rs:2:8
2+
--> $DIR/issue-103869.rs:5:8
33
|
4-
LL | enum VecOrMap{
4+
LL | enum VecOrMap {
55
| -------- while parsing this enum
6+
LL |
67
LL | vec: Vec<usize>,
78
| ^ expected one of `(`, `,`, `=`, `{`, or `}`
89
|
910
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
11+
help: perhaps you meant to use `struct` here
12+
|
13+
LL | struct VecOrMap {
14+
| ~~~~~~
1015

1116
error: aborting due to previous error
1217

0 commit comments

Comments
 (0)