use rustc_span::sym;
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
/// not wish to make a stability commitment around enums may wish to disable them by default.
fn check_item(&mut self, cx: &LateContext<'_>, item: &Item<'_>) {
if_chain! {
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));
then {
if let Some(snippet) = snippet_opt(cx, item.span) {
}
#[non_exhaustive]
-enum Exhaustive {
+pub enum Exhaustive {
Foo,
Bar,
Baz,
Quux(String),
}
+// no warning, already 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,
Bar,
Baz,
// nop
}
-enum Exhaustive {
+pub enum Exhaustive {
Foo,
Bar,
Baz,
Quux(String),
}
+// no warning, already 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,
Bar,
Baz,
error: enums should not be exhaustive
--> $DIR/exhaustive_enums.rs:10:1
|
-LL | / enum Exhaustive {
+LL | / pub enum Exhaustive {
LL | | Foo,
LL | | Bar,
LL | | Baz,
help: try adding #[non_exhaustive]
|
LL | #[non_exhaustive]
-LL | enum Exhaustive {
+LL | pub enum Exhaustive {
LL | Foo,
LL | Bar,
LL | Baz,