Make exhaustive_enums only warn on exported items
This commit is contained in:
parent
dc93188805
commit
f6cb96ef07
@ -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) {
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user