diff options
Diffstat (limited to 'tests/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs')
-rw-r--r-- | tests/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/tests/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs b/tests/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs new file mode 100644 index 000000000..a3b570ad8 --- /dev/null +++ b/tests/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs @@ -0,0 +1,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)); +} |