1 #![feature(box_syntax, plugin, plugin_registrar, rustc_private)]
2 #![crate_type = "dylib"]
4 extern crate rustc_driver;
5 extern crate rustc_hir;
6 #[macro_use] extern crate rustc_lint;
7 #[macro_use] extern crate rustc_session;
8 extern crate rustc_span;
11 use rustc_hir::intravisit;
14 use rustc_lint::{LateContext, LintPass, LintArray, LateLintPass, LintContext};
15 use rustc_driver::plugin::Registry;
16 use rustc_span::source_map;
17 use syntax::print::pprust;
20 pub fn plugin_registrar(reg: &mut Registry) {
21 reg.lint_store.register_lints(&[&MISSING_WHITELISTED_ATTR]);
22 reg.lint_store.register_late_pass(|| box MissingWhitelistedAttrPass);
26 MISSING_WHITELISTED_ATTR,
28 "Checks for missing `whitelisted_attr` attribute"
31 declare_lint_pass!(MissingWhitelistedAttrPass => [MISSING_WHITELISTED_ATTR]);
33 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingWhitelistedAttrPass {
34 fn check_fn(&mut self,
35 cx: &LateContext<'a, 'tcx>,
36 _: intravisit::FnKind<'tcx>,
39 span: source_map::Span,
42 let item = match cx.tcx.hir().get(id) {
43 Node::Item(item) => item,
44 _ => cx.tcx.hir().expect_item(cx.tcx.hir().get_parent_item(id)),
47 let whitelisted = |attr| pprust::attribute_to_string(attr).contains("whitelisted_attr");
48 if !item.attrs.iter().any(whitelisted) {
49 cx.span_lint(MISSING_WHITELISTED_ATTR, span,
50 "Missing 'whitelisted_attr' attribute");