1 #![feature(box_syntax, plugin, plugin_registrar, rustc_private)]
2 #![crate_type = "dylib"]
6 extern crate rustc_driver;
8 extern crate syntax_expand;
10 use rustc_driver::plugin::Registry;
12 use syntax_expand::base::*;
13 use syntax::feature_gate::AttributeType::Whitelisted;
14 use syntax::symbol::Symbol;
17 use rustc::hir::intravisit;
19 use rustc::lint::{LateContext, LintPass, LintArray, LateLintPass, LintContext};
20 use syntax::source_map;
23 pub fn plugin_registrar(reg: &mut Registry) {
24 reg.lint_store.register_lints(&[&MISSING_WHITELISTED_ATTR]);
25 reg.lint_store.register_late_pass(|| box MissingWhitelistedAttrPass);
26 reg.register_attribute(Symbol::intern("whitelisted_attr"), Whitelisted);
30 MISSING_WHITELISTED_ATTR,
32 "Checks for missing `whitelisted_attr` attribute"
35 declare_lint_pass!(MissingWhitelistedAttrPass => [MISSING_WHITELISTED_ATTR]);
37 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingWhitelistedAttrPass {
38 fn check_fn(&mut self,
39 cx: &LateContext<'a, 'tcx>,
40 _: intravisit::FnKind<'tcx>,
43 span: source_map::Span,
46 let item = match cx.tcx.hir().get(id) {
47 Node::Item(item) => item,
48 _ => cx.tcx.hir().expect_item(cx.tcx.hir().get_parent_item(id)),
51 if !attr::contains_name(&item.attrs, Symbol::intern("whitelisted_attr")) {
52 cx.span_lint(MISSING_WHITELISTED_ATTR, span,
53 "Missing 'whitelisted_attr' attribute");