diff options
| author | yukang <moorekang@gmail.com> | 2023-05-03 10:40:08 +0800 |
|---|---|---|
| committer | yukang <moorekang@gmail.com> | 2023-05-08 14:58:09 +0800 |
| commit | 6b76588222eb1a69f681c00f9d073edb43401ba7 (patch) | |
| tree | c8ef38f46d6e423f3bfb7e9edcdeba8fe82d7f65 | |
| parent | 04c53444dff325a0a3a4cb88cb952fbf341861ec (diff) | |
| download | rust-6b76588222eb1a69f681c00f9d073edb43401ba7.tar.gz rust-6b76588222eb1a69f681c00f9d073edb43401ba7.zip | |
suggest struct when we get colon in fileds in enum
| -rw-r--r-- | compiler/rustc_parse/src/parser/item.rs | 9 | ||||
| -rw-r--r-- | tests/ui/structs-enums/issue-103869.fixed | 13 | ||||
| -rw-r--r-- | tests/ui/structs-enums/issue-103869.rs (renamed from tests/ui/parser/issue-103869.rs) | 11 | ||||
| -rw-r--r-- | tests/ui/structs-enums/issue-103869.stderr (renamed from tests/ui/parser/issue-103869.stderr) | 9 |
4 files changed, 37 insertions, 5 deletions
diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs index 6ca88200dc5..2a47711a8d3 100644 --- a/compiler/rustc_parse/src/parser/item.rs +++ b/compiler/rustc_parse/src/parser/item.rs @@ -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()?; @@ -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 }, diff --git a/tests/ui/structs-enums/issue-103869.fixed b/tests/ui/structs-enums/issue-103869.fixed new file mode 100644 index 00000000000..49fe32c7109 --- /dev/null +++ b/tests/ui/structs-enums/issue-103869.fixed @@ -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); +} diff --git a/tests/ui/parser/issue-103869.rs b/tests/ui/structs-enums/issue-103869.rs index 9213437458a..729079e0501 100644 --- a/tests/ui/parser/issue-103869.rs +++ b/tests/ui/structs-enums/issue-103869.rs @@ -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); +} diff --git a/tests/ui/parser/issue-103869.stderr b/tests/ui/structs-enums/issue-103869.stderr index 9eb20e2005a..4665ebf89a3 100644 --- a/tests/ui/parser/issue-103869.stderr +++ b/tests/ui/structs-enums/issue-103869.stderr @@ -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 |
