]> git.lizzy.rs Git - rust.git/commitdiff
Make exhaustive_enums only warn on exported items
authorManish Goregaokar <manishsmail@gmail.com>
Thu, 21 Jan 2021 21:34:44 +0000 (13:34 -0800)
committerManish Goregaokar <manishsmail@gmail.com>
Thu, 21 Jan 2021 21:34:44 +0000 (13:34 -0800)
clippy_lints/src/exhaustive_enums.rs
tests/ui/exhaustive_enums.fixed
tests/ui/exhaustive_enums.rs
tests/ui/exhaustive_enums.stderr

index 1391ebd9e3125ae38a13d1dd684475413e118657..2e1c0728d2c3b9e789442cfb50193e7d2e8d05f5 100644 (file)
@@ -7,7 +7,7 @@
 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.
@@ -40,6 +40,7 @@ impl LateLintPass<'_> for ExhaustiveEnums {
     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) {
index 2d5f0474bc0d807a4f8ddfc43d4532aaba919bbf..71c4a251e3b38e99e044f5835ec67638a665453f 100644 (file)
@@ -8,15 +8,33 @@ fn main() {
 }
 
 #[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,
index 5c88454ae6121ec8e2fb8c28f928c0fcfb17f884..45af6851dd1a81b492df9c04710c8638bedfce9c 100644 (file)
@@ -7,15 +7,33 @@ fn main() {
     // 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,
index ee5a1836267eb4360642ddcde1855c3756c5e2d5..280c40b00aa31e69ffe26ab3d0c1067be7939533 100644 (file)
@@ -1,7 +1,7 @@
 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,
@@ -17,7 +17,7 @@ LL | #![deny(clippy::exhaustive_enums)]
 help: try adding #[non_exhaustive]
    |
 LL | #[non_exhaustive]
-LL | enum Exhaustive {
+LL | pub enum Exhaustive {
 LL |     Foo,
 LL |     Bar,
 LL |     Baz,