From 1fab03e90810d2290e8632e99f36f553fc717817 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Mon, 30 Dec 2019 19:02:52 +0100 Subject: [PATCH] Move lint levels machanism in librustc_lint. --- src/librustc/lint/levels.rs | 2 +- src/librustc/lint/mod.rs | 121 +----------------------------- src/librustc_interface/passes.rs | 1 - src/librustc_lint/levels.rs | 125 +++++++++++++++++++++++++++++++ src/librustc_lint/lib.rs | 2 + 5 files changed, 129 insertions(+), 122 deletions(-) create mode 100644 src/librustc_lint/levels.rs diff --git a/src/librustc/lint/levels.rs b/src/librustc/lint/levels.rs index edf7df16c87..97211f70824 100644 --- a/src/librustc/lint/levels.rs +++ b/src/librustc/lint/levels.rs @@ -155,7 +155,7 @@ pub struct LintLevelsBuilder<'a> { pub struct BuilderPush { prev: u32, - pub(super) changed: bool, + pub changed: bool, } impl<'a> LintLevelsBuilder<'a> { diff --git a/src/librustc/lint/mod.rs b/src/librustc/lint/mod.rs index ba9076f2e35..31f3f0d1737 100644 --- a/src/librustc/lint/mod.rs +++ b/src/librustc/lint/mod.rs @@ -24,11 +24,8 @@ pub use self::LintSource::*; use rustc_data_structures::sync; use crate::hir; -use crate::hir::def_id::{CrateNum, LOCAL_CRATE}; -use crate::hir::intravisit; use crate::lint::builtin::BuiltinLintDiagnostics; use crate::session::{DiagnosticMessageId, Session}; -use crate::ty::query::Providers; use crate::ty::TyCtxt; use crate::util::nodemap::NodeMap; use errors::{DiagnosticBuilder, DiagnosticId}; @@ -375,7 +372,7 @@ mod context; pub mod internal; mod levels; -pub use self::levels::{LintLevelMap, LintLevelSets}; +pub use self::levels::{LintLevelMap, LintLevelSets, LintLevelsBuilder}; #[derive(Default)] pub struct LintBuffer { @@ -563,122 +560,6 @@ pub fn maybe_lint_level_root(tcx: TyCtxt<'_>, id: hir::HirId) -> bool { attrs.iter().any(|attr| Level::from_symbol(attr.name_or_empty()).is_some()) } -fn lint_levels(tcx: TyCtxt<'_>, cnum: CrateNum) -> &LintLevelMap { - assert_eq!(cnum, LOCAL_CRATE); - let store = &tcx.lint_store; - let mut builder = LintLevelMapBuilder { - levels: LintLevelSets::builder(tcx.sess, false, &store), - tcx: tcx, - store: store, - }; - let krate = tcx.hir().krate(); - - let push = builder.levels.push(&krate.attrs, &store); - builder.levels.register_id(hir::CRATE_HIR_ID); - for macro_def in krate.exported_macros { - builder.levels.register_id(macro_def.hir_id); - } - intravisit::walk_crate(&mut builder, krate); - builder.levels.pop(push); - - tcx.arena.alloc(builder.levels.build_map()) -} - -struct LintLevelMapBuilder<'a, 'tcx> { - levels: levels::LintLevelsBuilder<'tcx>, - tcx: TyCtxt<'tcx>, - store: &'a LintStore, -} - -impl LintLevelMapBuilder<'_, '_> { - fn with_lint_attrs(&mut self, id: hir::HirId, attrs: &[ast::Attribute], f: F) - where - F: FnOnce(&mut Self), - { - let push = self.levels.push(attrs, self.store); - if push.changed { - self.levels.register_id(id); - } - f(self); - self.levels.pop(push); - } -} - -impl intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> { - fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'tcx> { - intravisit::NestedVisitorMap::All(&self.tcx.hir()) - } - - fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { - self.with_lint_attrs(param.hir_id, ¶m.attrs, |builder| { - intravisit::walk_param(builder, param); - }); - } - - fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { - self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { - intravisit::walk_item(builder, it); - }); - } - - fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) { - self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { - intravisit::walk_foreign_item(builder, it); - }) - } - - fn visit_expr(&mut self, e: &'tcx hir::Expr<'tcx>) { - self.with_lint_attrs(e.hir_id, &e.attrs, |builder| { - intravisit::walk_expr(builder, e); - }) - } - - fn visit_struct_field(&mut self, s: &'tcx hir::StructField<'tcx>) { - self.with_lint_attrs(s.hir_id, &s.attrs, |builder| { - intravisit::walk_struct_field(builder, s); - }) - } - - fn visit_variant( - &mut self, - v: &'tcx hir::Variant<'tcx>, - g: &'tcx hir::Generics<'tcx>, - item_id: hir::HirId, - ) { - self.with_lint_attrs(v.id, &v.attrs, |builder| { - intravisit::walk_variant(builder, v, g, item_id); - }) - } - - fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) { - self.with_lint_attrs(l.hir_id, &l.attrs, |builder| { - intravisit::walk_local(builder, l); - }) - } - - fn visit_arm(&mut self, a: &'tcx hir::Arm<'tcx>) { - self.with_lint_attrs(a.hir_id, &a.attrs, |builder| { - intravisit::walk_arm(builder, a); - }) - } - - fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { - self.with_lint_attrs(trait_item.hir_id, &trait_item.attrs, |builder| { - intravisit::walk_trait_item(builder, trait_item); - }); - } - - fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { - self.with_lint_attrs(impl_item.hir_id, &impl_item.attrs, |builder| { - intravisit::walk_impl_item(builder, impl_item); - }); - } -} - -pub fn provide(providers: &mut Providers<'_>) { - providers.lint_levels = lint_levels; -} - /// Returns whether `span` originates in a foreign crate's external macro. /// /// This is used to test whether a lint should not even begin to figure out whether it should diff --git a/src/librustc_interface/passes.rs b/src/librustc_interface/passes.rs index a796408491f..22dc0b2de8b 100644 --- a/src/librustc_interface/passes.rs +++ b/src/librustc_interface/passes.rs @@ -692,7 +692,6 @@ pub fn default_provide(providers: &mut ty::query::Providers<'_>) { rustc_resolve::provide(providers); rustc_traits::provide(providers); rustc_metadata::provide(providers); - lint::provide(providers); rustc_lint::provide(providers); rustc_codegen_utils::provide(providers); rustc_codegen_ssa::provide(providers); diff --git a/src/librustc_lint/levels.rs b/src/librustc_lint/levels.rs new file mode 100644 index 00000000000..c148d39c80c --- /dev/null +++ b/src/librustc_lint/levels.rs @@ -0,0 +1,125 @@ +use rustc::hir; +use rustc::hir::def_id::{CrateNum, LOCAL_CRATE}; +use rustc::hir::intravisit; +use rustc::lint::{LintLevelMap, LintLevelSets, LintLevelsBuilder, LintStore}; +use rustc::ty::query::Providers; +use rustc::ty::TyCtxt; +use syntax::ast; + +pub use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintId}; + +fn lint_levels(tcx: TyCtxt<'_>, cnum: CrateNum) -> &LintLevelMap { + assert_eq!(cnum, LOCAL_CRATE); + let store = &tcx.lint_store; + let mut builder = LintLevelMapBuilder { + levels: LintLevelSets::builder(tcx.sess, false, &store), + tcx: tcx, + store: store, + }; + let krate = tcx.hir().krate(); + + let push = builder.levels.push(&krate.attrs, &store); + builder.levels.register_id(hir::CRATE_HIR_ID); + for macro_def in krate.exported_macros { + builder.levels.register_id(macro_def.hir_id); + } + intravisit::walk_crate(&mut builder, krate); + builder.levels.pop(push); + + tcx.arena.alloc(builder.levels.build_map()) +} + +struct LintLevelMapBuilder<'a, 'tcx> { + levels: LintLevelsBuilder<'tcx>, + tcx: TyCtxt<'tcx>, + store: &'a LintStore, +} + +impl LintLevelMapBuilder<'_, '_> { + fn with_lint_attrs(&mut self, id: hir::HirId, attrs: &[ast::Attribute], f: F) + where + F: FnOnce(&mut Self), + { + let push = self.levels.push(attrs, self.store); + if push.changed { + self.levels.register_id(id); + } + f(self); + self.levels.pop(push); + } +} + +impl<'tcx> intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> { + fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'tcx> { + intravisit::NestedVisitorMap::All(&self.tcx.hir()) + } + + fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { + self.with_lint_attrs(param.hir_id, ¶m.attrs, |builder| { + intravisit::walk_param(builder, param); + }); + } + + fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { + self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { + intravisit::walk_item(builder, it); + }); + } + + fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) { + self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { + intravisit::walk_foreign_item(builder, it); + }) + } + + fn visit_expr(&mut self, e: &'tcx hir::Expr<'tcx>) { + self.with_lint_attrs(e.hir_id, &e.attrs, |builder| { + intravisit::walk_expr(builder, e); + }) + } + + fn visit_struct_field(&mut self, s: &'tcx hir::StructField<'tcx>) { + self.with_lint_attrs(s.hir_id, &s.attrs, |builder| { + intravisit::walk_struct_field(builder, s); + }) + } + + fn visit_variant( + &mut self, + v: &'tcx hir::Variant<'tcx>, + g: &'tcx hir::Generics<'tcx>, + item_id: hir::HirId, + ) { + self.with_lint_attrs(v.id, &v.attrs, |builder| { + intravisit::walk_variant(builder, v, g, item_id); + }) + } + + fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) { + self.with_lint_attrs(l.hir_id, &l.attrs, |builder| { + intravisit::walk_local(builder, l); + }) + } + + fn visit_arm(&mut self, a: &'tcx hir::Arm<'tcx>) { + self.with_lint_attrs(a.hir_id, &a.attrs, |builder| { + intravisit::walk_arm(builder, a); + }) + } + + fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { + self.with_lint_attrs(trait_item.hir_id, &trait_item.attrs, |builder| { + intravisit::walk_trait_item(builder, trait_item); + }); + } + + fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { + self.with_lint_attrs(impl_item.hir_id, &impl_item.attrs, |builder| { + intravisit::walk_impl_item(builder, impl_item); + }); + } +} + +pub fn provide(providers: &mut Providers<'_>) { + providers.lint_levels = lint_levels; +} diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 42fc353b2b0..2a3b90f8c93 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -26,6 +26,7 @@ mod array_into_iter; pub mod builtin; mod early; mod late; +mod levels; mod non_ascii_idents; mod nonstandard_style; mod redundant_semicolon; @@ -63,6 +64,7 @@ pub use early::check_ast_crate; pub use late::check_crate; pub fn provide(providers: &mut Providers<'_>) { + levels::provide(providers); *providers = Providers { lint_mod, ..*providers }; }