Skip to content

Commit

Permalink
suggest struct when we get colon in fileds in enum
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyukang committed May 8, 2023
1 parent 04c5344 commit 6b76588
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 5 deletions.
9 changes: 9 additions & 0 deletions compiler/rustc_parse/src/parser/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1262,6 +1262,7 @@ impl<'a> Parser<'a> {
}
}

let prev_span = self.prev_token.span;
let id = self.parse_ident()?;
let mut generics = self.parse_generics()?;
generics.where_clause = self.parse_where_clause()?;
Expand All @@ -1275,6 +1276,14 @@ impl<'a> Parser<'a> {
self.parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()).map_err(
|mut e| {
e.span_label(id.span, "while parsing this enum");
if self.token == token::Colon {
e.span_suggestion_verbose(
prev_span,
"perhaps you meant to use `struct` here",
"struct".to_string(),
Applicability::MaybeIncorrect,
);
}
self.recover_stmt();
e
},
Expand Down
13 changes: 13 additions & 0 deletions tests/ui/structs-enums/issue-103869.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// run-rustfix

struct VecOrMap {
//~^ HELP: perhaps you meant to use `struct` here
vec: Vec<usize>,
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
//~| HELP: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
}

fn main() {
let o = VecOrMap { vec: vec![1, 2, 3] };
println!("{:?}", o.vec);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
enum VecOrMap{
// run-rustfix

enum VecOrMap {
//~^ HELP: perhaps you meant to use `struct` here
vec: Vec<usize>,
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found `:`
//~| HELP: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
map: HashMap<String,usize>
}

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

error: aborting due to previous error

0 comments on commit 6b76588

Please sign in to comment.