Detect tuple variants used as struct pattern and suggest correct pattern
This commit is contained in:
parent
4b9ac51617
commit
17ada052e7
6 changed files with 43 additions and 14 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue