wildcard_enum_match_arm lint takes the enum origin into account
Signed-off-by: Tyler Weaver <maybe@tylerjw.dev>
This commit is contained in:
parent
d020fd7fe6
commit
2432e97d6a
@ -45,8 +45,12 @@ pub(crate) fn check(cx: &LateContext<'_>, ex: &Expr<'_>, arms: &[Arm<'_>]) {
|
|||||||
|
|
||||||
// Accumulate the variants which should be put in place of the wildcard because they're not
|
// Accumulate the variants which should be put in place of the wildcard because they're not
|
||||||
// already covered.
|
// already covered.
|
||||||
let has_hidden = adt_def.variants().iter().any(|x| is_hidden(cx, x));
|
let has_hidden_external = adt_def.variants().iter().any(|x| is_hidden_and_external(cx, x));
|
||||||
let mut missing_variants: Vec<_> = adt_def.variants().iter().filter(|x| !is_hidden(cx, x)).collect();
|
let mut missing_variants: Vec<_> = adt_def
|
||||||
|
.variants()
|
||||||
|
.iter()
|
||||||
|
.filter(|x| !is_hidden_and_external(cx, x))
|
||||||
|
.collect();
|
||||||
|
|
||||||
let mut path_prefix = CommonPrefixSearcher::None;
|
let mut path_prefix = CommonPrefixSearcher::None;
|
||||||
for arm in arms {
|
for arm in arms {
|
||||||
@ -133,7 +137,7 @@ pub(crate) fn check(cx: &LateContext<'_>, ex: &Expr<'_>, arms: &[Arm<'_>]) {
|
|||||||
|
|
||||||
match missing_variants.as_slice() {
|
match missing_variants.as_slice() {
|
||||||
[] => (),
|
[] => (),
|
||||||
[x] if !adt_def.is_variant_list_non_exhaustive() && !has_hidden => span_lint_and_sugg(
|
[x] if !adt_def.is_variant_list_non_exhaustive() && !has_hidden_external => span_lint_and_sugg(
|
||||||
cx,
|
cx,
|
||||||
MATCH_WILDCARD_FOR_SINGLE_VARIANTS,
|
MATCH_WILDCARD_FOR_SINGLE_VARIANTS,
|
||||||
wildcard_span,
|
wildcard_span,
|
||||||
@ -144,7 +148,7 @@ pub(crate) fn check(cx: &LateContext<'_>, ex: &Expr<'_>, arms: &[Arm<'_>]) {
|
|||||||
),
|
),
|
||||||
variants => {
|
variants => {
|
||||||
let mut suggestions: Vec<_> = variants.iter().copied().map(format_suggestion).collect();
|
let mut suggestions: Vec<_> = variants.iter().copied().map(format_suggestion).collect();
|
||||||
let message = if adt_def.is_variant_list_non_exhaustive() || has_hidden {
|
let message = if adt_def.is_variant_list_non_exhaustive() || has_hidden_external {
|
||||||
suggestions.push("_".into());
|
suggestions.push("_".into());
|
||||||
"wildcard matches known variants and will also match future added variants"
|
"wildcard matches known variants and will also match future added variants"
|
||||||
} else {
|
} else {
|
||||||
@ -191,6 +195,7 @@ fn with_prefix(&mut self, path: &'a [PathSegment<'a>]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_hidden(cx: &LateContext<'_>, variant_def: &VariantDef) -> bool {
|
fn is_hidden_and_external(cx: &LateContext<'_>, variant_def: &VariantDef) -> bool {
|
||||||
cx.tcx.is_doc_hidden(variant_def.def_id) || cx.tcx.has_attr(variant_def.def_id, sym::unstable)
|
(cx.tcx.is_doc_hidden(variant_def.def_id) || cx.tcx.has_attr(variant_def.def_id, sym::unstable))
|
||||||
|
&& variant_def.def_id.as_local().is_none()
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ fn main() {
|
|||||||
Enum::A => (),
|
Enum::A => (),
|
||||||
Enum::B => (),
|
Enum::B => (),
|
||||||
Enum::C => (),
|
Enum::C => (),
|
||||||
_ => (),
|
Enum::__Private => (),
|
||||||
}
|
}
|
||||||
match Enum::A {
|
match Enum::A {
|
||||||
Enum::A => (),
|
Enum::A => (),
|
||||||
|
@ -48,11 +48,17 @@ error: wildcard matches only a single variant and will also match any future add
|
|||||||
LL | _ => (),
|
LL | _ => (),
|
||||||
| ^ help: try this: `Color::Blue`
|
| ^ help: try this: `Color::Blue`
|
||||||
|
|
||||||
|
error: wildcard matches only a single variant and will also match any future added variants
|
||||||
|
--> $DIR/match_wildcard_for_single_variants.rs:126:13
|
||||||
|
|
|
||||||
|
LL | _ => (),
|
||||||
|
| ^ help: try this: `Enum::__Private`
|
||||||
|
|
||||||
error: wildcard matches only a single variant and will also match any future added variants
|
error: wildcard matches only a single variant and will also match any future added variants
|
||||||
--> $DIR/match_wildcard_for_single_variants.rs:153:13
|
--> $DIR/match_wildcard_for_single_variants.rs:153:13
|
||||||
|
|
|
|
||||||
LL | _ => 2,
|
LL | _ => 2,
|
||||||
| ^ help: try this: `Foo::B`
|
| ^ help: try this: `Foo::B`
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ fn main() {
|
|||||||
}
|
}
|
||||||
match Enum::A {
|
match Enum::A {
|
||||||
Enum::A => (),
|
Enum::A => (),
|
||||||
Enum::B | _ => (),
|
Enum::B | Enum::__Private => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,11 +34,11 @@ error: wildcard matches known variants and will also match future added variants
|
|||||||
LL | _ => {},
|
LL | _ => {},
|
||||||
| ^ help: try this: `ErrorKind::PermissionDenied | _`
|
| ^ help: try this: `ErrorKind::PermissionDenied | _`
|
||||||
|
|
||||||
error: wildcard matches known variants and will also match future added variants
|
error: wildcard match will also match any future added variants
|
||||||
--> $DIR/wildcard_enum_match_arm.rs:99:13
|
--> $DIR/wildcard_enum_match_arm.rs:99:13
|
||||||
|
|
|
|
||||||
LL | _ => (),
|
LL | _ => (),
|
||||||
| ^ help: try this: `Enum::B | _`
|
| ^ help: try this: `Enum::B | Enum::__Private`
|
||||||
|
|
||||||
error: aborting due to 6 previous errors
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user