]> git.lizzy.rs Git - rust.git/blob - src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs
fix ui-fulldeps & tests fallout
[rust.git] / src / test / ui-fulldeps / auxiliary / issue-40001-plugin.rs
1 #![feature(box_syntax, plugin, plugin_registrar, rustc_private)]
2 #![crate_type = "dylib"]
3
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;
9 extern crate syntax;
10
11 use rustc_hir::intravisit;
12 use rustc_hir as hir;
13 use rustc_hir::Node;
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;
18
19 #[plugin_registrar]
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);
23 }
24
25 declare_lint! {
26     MISSING_WHITELISTED_ATTR,
27     Deny,
28     "Checks for missing `whitelisted_attr` attribute"
29 }
30
31 declare_lint_pass!(MissingWhitelistedAttrPass => [MISSING_WHITELISTED_ATTR]);
32
33 impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingWhitelistedAttrPass {
34     fn check_fn(&mut self,
35                 cx: &LateContext<'a, 'tcx>,
36                 _: intravisit::FnKind<'tcx>,
37                 _: &'tcx hir::FnDecl,
38                 _: &'tcx hir::Body,
39                 span: source_map::Span,
40                 id: hir::HirId) {
41
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)),
45         };
46
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");
51         }
52     }
53 }