Rewrite registered lint collection

This commit is contained in:
flip1995 2018-10-29 20:37:47 +01:00
parent 267d5d3433
commit a7fc6799df
No known key found for this signature in database
GPG Key ID: E8E897A5870E41C2
3 changed files with 26 additions and 16 deletions

View File

@ -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>,

View File

@ -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"];

View File

@ -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() {
}