Skip to content

Commit 5368895

Browse files
committed
exhaustive_items: Don't check the item kind twice.
1 parent 5b0dac6 commit 5368895

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

clippy_lints/src/exhaustive_items.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,20 +70,24 @@ declare_lint_pass!(ExhaustiveItems => [EXHAUSTIVE_ENUMS, EXHAUSTIVE_STRUCTS]);
7070

7171
impl LateLintPass<'_> for ExhaustiveItems {
7272
fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
73-
if let ItemKind::Enum(..) | ItemKind::Struct(..) = item.kind
74-
&& cx.effective_visibilities.is_exported(item.owner_id.def_id)
73+
let (lint, msg, fields) = match item.kind {
74+
ItemKind::Enum(..) => (
75+
EXHAUSTIVE_ENUMS,
76+
"exported enums should not be exhaustive",
77+
[].as_slice(),
78+
),
79+
ItemKind::Struct(v, ..) => (
80+
EXHAUSTIVE_STRUCTS,
81+
"exported structs should not be exhaustive",
82+
v.fields(),
83+
),
84+
_ => return,
85+
};
86+
if cx.effective_visibilities.is_exported(item.owner_id.def_id)
7587
&& let attrs = cx.tcx.hir().attrs(item.hir_id())
7688
&& !attrs.iter().any(|a| a.has_name(sym::non_exhaustive))
89+
&& fields.iter().all(|f| cx.tcx.visibility(f.def_id).is_public())
7790
{
78-
let (lint, msg) = if let ItemKind::Struct(ref v, ..) = item.kind {
79-
if v.fields().iter().any(|f| !cx.tcx.visibility(f.def_id).is_public()) {
80-
// skip structs with private fields
81-
return;
82-
}
83-
(EXHAUSTIVE_STRUCTS, "exported structs should not be exhaustive")
84-
} else {
85-
(EXHAUSTIVE_ENUMS, "exported enums should not be exhaustive")
86-
};
8791
let suggestion_span = item.span.shrink_to_lo();
8892
let indent = " ".repeat(indent_of(cx, item.span).unwrap_or(0));
8993
span_lint_and_then(cx, lint, item.span, msg, |diag| {

0 commit comments

Comments
 (0)