about summary refs log tree commit diff
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2023-05-03 10:40:08 +0800
committeryukang <moorekang@gmail.com>2023-05-08 14:58:09 +0800
commit6b76588222eb1a69f681c00f9d073edb43401ba7 (patch)
treec8ef38f46d6e423f3bfb7e9edcdeba8fe82d7f65
parent04c53444dff325a0a3a4cb88cb952fbf341861ec (diff)
downloadrust-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.rs9
-rw-r--r--tests/ui/structs-enums/issue-103869.fixed13
-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