Detect tuple variants used as struct pattern and suggest correct pattern

This commit is contained in:
Esteban Küber 2020-08-09 17:52:29 -07:00
parent 4b9ac51617
commit 17ada052e7
6 changed files with 43 additions and 14 deletions

View file

@ -701,7 +701,16 @@ impl<'a> LateResolutionVisitor<'a, '_, '_> {
if let Some(span) = self.def_span(def_id) {
err.span_label(span, &format!("`{}` defined here", path_str));
}
err.span_label(span, format!("did you mean `{}( /* fields */ )`?", path_str));
let fields =
self.r.field_names.get(&def_id).map_or("/* fields */".to_string(), |fields| {
vec!["_"; fields.len()].join(", ")
});
err.span_suggestion(
span,
"use the tuple variant pattern syntax instead",
format!("{}({})", path_str, fields),
Applicability::HasPlaceholders,
);
}
(Res::SelfTy(..), _) if ns == ValueNS => {
err.span_label(span, fallback_label);

View file

@ -23,16 +23,13 @@ LL | Empty4()
| -------- `E::Empty4` defined here
...
LL | E::Empty4 => ()
| ^^^^^^^^^ did you mean `E::Empty4( /* fields */ )`?
| ^^^^^^^^^ help: use the tuple variant pattern syntax instead: `E::Empty4()`
error[E0532]: expected unit struct, unit variant or constant, found tuple variant `XE::XEmpty5`
--> $DIR/empty-struct-tuple-pat.rs:33:9
|
LL | XE::XEmpty5 => (),
| ^^^^-------
| | |
| | help: a unit variant with a similar name exists: `XEmpty4`
| did you mean `XE::XEmpty5( /* fields */ )`?
| ^^^^^^^^^^^
|
::: $DIR/auxiliary/empty-struct.rs:7:5
|
@ -40,6 +37,15 @@ LL | XEmpty4,
| ------- similarly named unit variant `XEmpty4` defined here
LL | XEmpty5(),
| --------- `XE::XEmpty5` defined here
|
help: use the tuple variant pattern syntax instead
|
LL | XE::XEmpty5(/* fields */) => (),
| ^^^^^^^^^^^^^^^^^^^^^^^^^
help: a unit variant with a similar name exists
|
LL | XE::XEmpty4 => (),
| ^^^^^^^
error: aborting due to 4 previous errors

View file

@ -7,10 +7,16 @@ LL | Baz
| --- similarly named unit variant `Baz` defined here
...
LL | Foo::Bar => {}
| ^^^^^---
| | |
| | help: a unit variant with a similar name exists: `Baz`
| did you mean `Foo::Bar( /* fields */ )`?
| ^^^^^^^^
|
help: use the tuple variant pattern syntax instead
|
LL | Foo::Bar(_) => {}
| ^^^^^^^^^^^
help: a unit variant with a similar name exists
|
LL | Foo::Baz => {}
| ^^^
error[E0532]: expected tuple struct or tuple variant, found unit struct `S`
--> $DIR/issue-32004.rs:16:9

View file

@ -5,7 +5,7 @@ LL | Tuple(i32),
| ---------- `MyEnum::Tuple` defined here
...
LL | MyEnum::Tuple => "",
| ^^^^^^^^^^^^^ did you mean `MyEnum::Tuple( /* fields */ )`?
| ^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `MyEnum::Tuple(_)`
error[E0532]: expected unit struct, unit variant or constant, found struct variant `MyEnum::Struct`
--> $DIR/issue-63983.rs:10:9

View file

@ -9,6 +9,7 @@ fn main() {
match x {
Enum::Foo(a, b) => {}
//~^ ERROR expected tuple struct or tuple variant, found struct variant `Enum::Foo`
Enum::Bar(a, b) => {}
Enum::Bar { a, b } => {}
//~^ ERROR tuple variant `Enum::Bar` written as struct variant
}
}

View file

@ -18,6 +18,13 @@ LL | Foo { a: usize, b: usize },
LL | Enum::Foo(a, b) => {}
| ^^^^^^^^^^^^^^^ help: use struct pattern syntax instead: `Enum::Foo { a, b }`
error: aborting due to 2 previous errors
error[E0769]: tuple variant `Enum::Bar` written as struct variant
--> $DIR/recover-from-bad-variant.rs:12:9
|
LL | Enum::Bar { a, b } => {}
| ^^^^^^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `Enum::Bar(a, b)`
For more information about this error, try `rustc --explain E0532`.
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0532, E0769.
For more information about an error, try `rustc --explain E0532`.