about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/utils/internal_lints.rs23
-rw-r--r--clippy_lints/src/utils/paths.rs2
-rw-r--r--tests/ui/lint_without_lint_pass.rs17
3 files changed, 26 insertions, 16 deletions
diff --git a/clippy_lints/src/utils/internal_lints.rs b/clippy_lints/src/utils/internal_lints.rs
index e89c2d28953..879157ec8a4 100644
--- a/clippy_lints/src/utils/internal_lints.rs
+++ b/clippy_lints/src/utils/internal_lints.rs
@@ -9,7 +9,7 @@
 
 
 use crate::utils::{
-    match_def_path, match_qpath, match_type, paths, span_help_and_lint, span_lint, span_lint_and_sugg, walk_ptrs_ty,
+    match_def_path, match_type, paths, span_help_and_lint, span_lint, span_lint_and_sugg, walk_ptrs_ty,
 };
 use if_chain::if_chain;
 use crate::rustc::hir;
@@ -161,16 +161,21 @@ impl LintPass for LintWithoutLintPass {
 
 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LintWithoutLintPass {
     fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx Item) {
-        if let hir::ItemKind::Static(ref ty, MutImmutable, body_id) = item.node {
-
+        if let hir::ItemKind::Static(ref ty, MutImmutable, _) = item.node {
             if is_lint_ref_type(cx, ty) {
                 self.declared_lints.insert(item.name, item.span);
-            } else if is_lint_array_type(ty) && item.name == "ARRAY" {
-                if let VisibilityKind::Inherited = item.vis.node {
+            }
+        } else if let hir::ItemKind::Impl(.., Some(ref trait_ref), _, ref impl_item_refs) = item.node {
+            if_chain! {
+                if let hir::TraitRef{path, ..} = trait_ref;
+                if let Def::Trait(def_id) = path.def;
+                if match_def_path(cx.tcx, def_id, &paths::LINT_PASS);
+                then {
                     let mut collector = LintCollector {
                         output: &mut self.registered_lints,
                         cx,
                     };
+                    let body_id = cx.tcx.hir.body_owned_by(impl_item_refs[0].id.node_id);
                     collector.visit_expr(&cx.tcx.hir.body(body_id).value);
                 }
             }
@@ -223,14 +228,6 @@ fn is_lint_ref_type<'tcx>(cx: &LateContext<'_, 'tcx>, ty: &Ty) -> bool {
     false
 }
 
-fn is_lint_array_type(ty: &Ty) -> bool {
-    if let TyKind::Path(ref path) = ty.node {
-        match_qpath(path, &paths::LINT_ARRAY)
-    } else {
-        false
-    }
-}
-
 struct LintCollector<'a, 'tcx: 'a> {
     output: &'a mut FxHashSet<Name>,
     cx: &'a LateContext<'a, 'tcx>,
diff --git a/clippy_lints/src/utils/paths.rs b/clippy_lints/src/utils/paths.rs
index 8941d303156..107a8eea15d 100644
--- a/clippy_lints/src/utils/paths.rs
+++ b/clippy_lints/src/utils/paths.rs
@@ -56,7 +56,7 @@ pub const ITERATOR: [&str; 4] = ["core", "iter", "iterator", "Iterator"];
 pub const LATE_CONTEXT: [&str; 4] = ["rustc", "lint", "context", "LateContext"];
 pub const LINKED_LIST: [&str; 4] = ["alloc", "collections", "linked_list", "LinkedList"];
 pub const LINT: [&str; 3] = ["rustc", "lint", "Lint"];
-pub const LINT_ARRAY: [&str; 3] = ["rustc", "lint", "LintArray"];
+pub const LINT_PASS: [&str; 3] = ["rustc", "lint", "LintPass"];
 pub const MEM_DISCRIMINANT: [&str; 3] = ["core", "mem", "discriminant"];
 pub const MEM_FORGET: [&str; 3] = ["core", "mem", "forget"];
 pub const MEM_REPLACE: [&str; 3] = ["core", "mem", "replace"];
diff --git a/tests/ui/lint_without_lint_pass.rs b/tests/ui/lint_without_lint_pass.rs
index 41e7fea1abe..c7e11840a37 100644
--- a/tests/ui/lint_without_lint_pass.rs
+++ b/tests/ui/lint_without_lint_pass.rs
@@ -4,16 +4,29 @@
 
 #[macro_use]
 extern crate rustc;
+use rustc::lint;
 
 #[macro_use]
 extern crate clippy_lints;
 
-declare_clippy_lint!
-{
+declare_clippy_lint! {
     pub TEST_LINT,
     correctness,
     ""
 }
 
+declare_clippy_lint! {
+    pub TEST_LINT_REGISTERED,
+    correctness,
+    ""
+}
+
+pub struct Pass;
+impl lint::LintPass for Pass {
+    fn get_lints(&self) -> lint::LintArray {
+        lint_array!(TEST_LINT_REGISTERED)
+    }
+}
+
 fn main() {
 }