summaryrefslogtreecommitdiffstats
path: root/src/test/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs
blob: a3b570ad8c40c5e572ba483eb4963980dfda68af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// force-host

#![feature(rustc_private)]

extern crate rustc_driver;
extern crate rustc_hir;
extern crate rustc_lint;
extern crate rustc_span;
#[macro_use]
extern crate rustc_session;
extern crate rustc_ast;

use rustc_ast::attr;
use rustc_driver::plugin::Registry;
use rustc_lint::{LateContext, LateLintPass, LintContext, LintPass};
use rustc_span::def_id::CRATE_DEF_ID;
use rustc_span::symbol::Symbol;

macro_rules! fake_lint_pass {
    ($struct:ident, $($attr:expr),*) => {
        struct $struct;

        impl LintPass for $struct {
            fn name(&self) -> &'static str {
                stringify!($struct)
            }
        }

        impl LateLintPass<'_> for $struct {
            fn check_crate(&mut self, cx: &LateContext) {
                let attrs = cx.tcx.hir().attrs(rustc_hir::CRATE_HIR_ID);
                let span = cx.tcx.def_span(CRATE_DEF_ID);
                $(
                    if !cx.sess().contains_name(attrs, $attr) {
                        cx.lint(CRATE_NOT_OKAY, |lint| {
                             let msg = format!("crate is not marked with #![{}]", $attr);
                             lint.build(&msg).set_span(span).emit();
                        });
                    }
                )*
            }
        }

    }
}

declare_lint!(CRATE_NOT_OKAY, Warn, "crate not marked with #![crate_okay]");
declare_lint!(CRATE_NOT_RED, Warn, "crate not marked with #![crate_red]");
declare_lint!(CRATE_NOT_BLUE, Warn, "crate not marked with #![crate_blue]");
declare_lint!(CRATE_NOT_GREY, Warn, "crate not marked with #![crate_grey]");
declare_lint!(CRATE_NOT_GREEN, Warn, "crate not marked with #![crate_green]");

fake_lint_pass! {
    PassOkay,
    Symbol::intern("crate_okay")
}

fake_lint_pass! {
    PassRedBlue,
    Symbol::intern("crate_red"), Symbol::intern("crate_blue")
}

fake_lint_pass! {
    PassGreyGreen,
    Symbol::intern("crate_grey"), Symbol::intern("crate_green")
}

#[no_mangle]
fn __rustc_plugin_registrar(reg: &mut Registry) {
    reg.lint_store.register_lints(&[
        &CRATE_NOT_OKAY,
        &CRATE_NOT_RED,
        &CRATE_NOT_BLUE,
        &CRATE_NOT_GREY,
        &CRATE_NOT_GREEN,
    ]);
    reg.lint_store.register_late_pass(|_| Box::new(PassOkay));
    reg.lint_store.register_late_pass(|_| Box::new(PassRedBlue));
    reg.lint_store.register_late_pass(|_| Box::new(PassGreyGreen));
}