Skip to content

Commit 6b76588

Browse files
committed
suggest struct when we get colon in fileds in enum
1 parent 04c5344 commit 6b76588

File tree

4 files changed

+37
-5
lines changed

4 files changed

+37
-5
lines changed

compiler/rustc_parse/src/parser/item.rs

+9
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()?;
@@ -1275,6 +1276,14 @@ impl<'a> Parser<'a> {
12751276
self.parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()).map_err(
12761277
|mut e| {
12771278
e.span_label(id.span, "while parsing this enum");
1279+
if self.token == token::Colon {
1280+
e.span_suggestion_verbose(
1281+
prev_span,
1282+
"perhaps you meant to use `struct` here",
1283+
"struct".to_string(),
1284+
Applicability::MaybeIncorrect,
1285+
);
1286+
}
12781287
self.recover_stmt();
12791288
e
12801289
},
+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)