Make exhaustive_enums only warn on exported items

This commit is contained in:
Manish Goregaokar 2021-01-21 13:34:44 -08:00
parent dc93188805
commit f6cb96ef07
4 changed files with 44 additions and 7 deletions

View File

@ -7,7 +7,7 @@
use rustc_span::sym; use rustc_span::sym;
declare_clippy_lint! { declare_clippy_lint! {
/// **What it does:** Warns on any `enum`s that are not tagged `#[non_exhaustive]` /// **What it does:** Warns on any exported `enum`s that are not tagged `#[non_exhaustive]`
/// ///
/// **Why is this bad?** Exhaustive enums are typically fine, but a project which does /// **Why is this bad?** Exhaustive enums are typically fine, but a project which does
/// not wish to make a stability commitment around enums may wish to disable them by default. /// not wish to make a stability commitment around enums may wish to disable them by default.
@ -40,6 +40,7 @@ impl LateLintPass<'_> for ExhaustiveEnums {
fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) { fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
if_chain! { if_chain! {
if let ItemKind::Enum(..) = item.kind; if let ItemKind::Enum(..) = item.kind;
if cx.access_levels.is_exported(item.hir_id);
if !item.attrs.iter().any(|a| a.has_name(sym::non_exhaustive)); if !item.attrs.iter().any(|a| a.has_name(sym::non_exhaustive));
then { then {
if let Some(snippet) = snippet_opt(cx, item.span) { if let Some(snippet) = snippet_opt(cx, item.span) {

View File

@ -8,15 +8,33 @@ fn main() {
} }
#[non_exhaustive] #[non_exhaustive]
enum Exhaustive { pub enum Exhaustive {
Foo, Foo,
Bar, Bar,
Baz, Baz,
Quux(String), Quux(String),
} }
// no warning, already non_exhaustive
#[non_exhaustive] #[non_exhaustive]
enum NonExhaustive { pub enum NonExhaustive {
Foo,
Bar,
Baz,
Quux(String),
}
// no warning, private
enum ExhaustivePrivate {
Foo,
Bar,
Baz,
Quux(String),
}
// no warning, private
#[non_exhaustive]
enum NonExhaustivePrivate {
Foo, Foo,
Bar, Bar,
Baz, Baz,

View File

@ -7,15 +7,33 @@ fn main() {
// nop // nop
} }
enum Exhaustive { pub enum Exhaustive {
Foo, Foo,
Bar, Bar,
Baz, Baz,
Quux(String), Quux(String),
} }
// no warning, already non_exhaustive
#[non_exhaustive] #[non_exhaustive]
enum NonExhaustive { pub enum NonExhaustive {
Foo,
Bar,
Baz,
Quux(String),
}
// no warning, private
enum ExhaustivePrivate {
Foo,
Bar,
Baz,
Quux(String),
}
// no warning, private
#[non_exhaustive]
enum NonExhaustivePrivate {
Foo, Foo,
Bar, Bar,
Baz, Baz,

View File

@ -1,7 +1,7 @@
error: enums should not be exhaustive error: enums should not be exhaustive
--> $DIR/exhaustive_enums.rs:10:1 --> $DIR/exhaustive_enums.rs:10:1
| |
LL | / enum Exhaustive { LL | / pub enum Exhaustive {
LL | | Foo, LL | | Foo,
LL | | Bar, LL | | Bar,
LL | | Baz, LL | | Baz,
@ -17,7 +17,7 @@ LL | #![deny(clippy::exhaustive_enums)]
help: try adding #[non_exhaustive] help: try adding #[non_exhaustive]
| |
LL | #[non_exhaustive] LL | #[non_exhaustive]
LL | enum Exhaustive { LL | pub enum Exhaustive {
LL | Foo, LL | Foo,
LL | Bar, LL | Bar,
LL | Baz, LL | Baz,