diff options
| author | blyxyas <blyxyas@gmail.com> | 2024-09-07 12:13:03 +0200 |
|---|---|---|
| committer | blyxyas <blyxyas@gmail.com> | 2024-10-19 16:20:51 +0200 |
| commit | 637d5cc56fcc11afadd4ffaefa237c11f47cdfee (patch) | |
| tree | 7a7aac9650257f6419d7208b78221db9f74809b6 /compiler/rustc_lint | |
| parent | 71b4d108c7e71c15c0f61d737ebdc0e1cf559d3c (diff) | |
| download | rust-637d5cc56fcc11afadd4ffaefa237c11f47cdfee.tar.gz rust-637d5cc56fcc11afadd4ffaefa237c11f47cdfee.zip | |
Remove module passes filtering
Diffstat (limited to 'compiler/rustc_lint')
| -rw-r--r-- | compiler/rustc_lint/src/builtin.rs | 8 | ||||
| -rw-r--r-- | compiler/rustc_lint/src/internal.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_lint/src/late.rs | 47 | ||||
| -rw-r--r-- | compiler/rustc_lint/src/levels.rs | 126 | ||||
| -rw-r--r-- | compiler/rustc_lint/src/lib.rs | 22 | ||||
| -rw-r--r-- | compiler/rustc_lint/src/passes.rs | 17 |
6 files changed, 65 insertions, 159 deletions
diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs index 33c87bbfb70..b2c7f1d3cec 100644 --- a/compiler/rustc_lint/src/builtin.rs +++ b/compiler/rustc_lint/src/builtin.rs @@ -20,7 +20,6 @@ //! If you define a new `LateLintPass`, you will also need to add it to the //! `late_lint_methods!` invocation in `lib.rs`. -use std::default::Default; use std::fmt::Write; use ast::token::TokenKind; @@ -74,11 +73,6 @@ use crate::{ EarlyContext, EarlyLintPass, LateContext, LateLintPass, Level, LintContext, fluent_generated as fluent, }; -// use std::fmt::Write; - -// hardwired lints from rustc_lint_defs -// pub use rustc_session::lint::builtin::*; - declare_lint! { /// The `while_true` lint detects `while true { }`. /// @@ -247,7 +241,7 @@ declare_lint! { UNSAFE_CODE, Allow, "usage of `unsafe` code and other potentially unsound constructs", - [loadbearing: true] + @eval_always = true } declare_lint_pass!(UnsafeCode => [UNSAFE_CODE]); diff --git a/compiler/rustc_lint/src/internal.rs b/compiler/rustc_lint/src/internal.rs index 0f4f58efd8e..11e9e933dd9 100644 --- a/compiler/rustc_lint/src/internal.rs +++ b/compiler/rustc_lint/src/internal.rs @@ -430,7 +430,7 @@ declare_tool_lint! { Deny, "prevent creation of diagnostics which cannot be translated", report_in_external_macro: true, - [loadbearing: true] + eval_always: true } declare_tool_lint! { @@ -444,7 +444,7 @@ declare_tool_lint! { Deny, "prevent diagnostic creation outside of `Diagnostic`/`Subdiagnostic`/`LintDiagnostic` impls", report_in_external_macro: true, - [loadbearing: true] + eval_always: true } declare_lint_pass!(Diagnostics => [UNTRANSLATABLE_DIAGNOSTIC, DIAGNOSTIC_OUTSIDE_OF_IMPL]); diff --git a/compiler/rustc_lint/src/late.rs b/compiler/rustc_lint/src/late.rs index f8bd873cdf5..ea7a44dd123 100644 --- a/compiler/rustc_lint/src/late.rs +++ b/compiler/rustc_lint/src/late.rs @@ -24,7 +24,9 @@ use rustc_hir::def_id::{LocalDefId, LocalModDefId}; use rustc_hir::{HirId, intravisit as hir_visit}; use rustc_middle::hir::nested_filter; use rustc_middle::ty::{self, TyCtxt}; -use rustc_session::{Session, lint::{LintPass, builtin::HardwiredLints}}; +use rustc_session::Session; +use rustc_session::lint::LintPass; +use rustc_session::lint::builtin::HardwiredLints; use rustc_span::Span; use tracing::debug; @@ -368,28 +370,15 @@ pub fn late_lint_mod<'tcx, T: LateLintPass<'tcx> + 'tcx>( if store.late_module_passes.is_empty() { late_lint_mod_inner(tcx, module_def_id, context, builtin_lints); } else { - let passes: Vec<_> = - store.late_module_passes.iter().map(|mk_pass| (mk_pass)(tcx)).collect(); - // Filter unused lints - let lints_that_dont_need_to_run = tcx.lints_that_dont_need_to_run(()); - let mut filtered_passes: Vec<Box<dyn LateLintPass<'tcx>>> = passes - .into_iter() - .filter(|pass| { - let lints = LintPass::get_lints(pass); - if lints.is_empty() { - true - } else { - lints - .iter() - .any(|lint| !lints_that_dont_need_to_run.contains(&LintId::of(lint))) - } - }) - .collect(); - - filtered_passes.push(Box::new(builtin_lints)); - filtered_passes.push(Box::new(HardwiredLints)); - - let pass = RuntimeCombinedLateLintPass { passes: &mut filtered_passes[..] }; + let builtin_lints = Box::new(builtin_lints) as Box<dyn LateLintPass<'tcx>>; + let mut binding = store + .late_module_passes + .iter() + .map(|mk_pass| (mk_pass)(tcx)) + .chain(std::iter::once(builtin_lints)) + .collect::<Vec<_>>(); + + let pass = RuntimeCombinedLateLintPass { passes: binding.as_mut_slice() }; late_lint_mod_inner(tcx, module_def_id, context, pass); } } @@ -440,7 +429,6 @@ fn late_lint_crate<'tcx>(tcx: TyCtxt<'tcx>) { let lints_that_dont_need_to_run = tcx.lints_that_dont_need_to_run(()); - // dbg!(&lints_that_dont_need_to_run); let mut filtered_passes: Vec<Box<dyn LateLintPass<'tcx>>> = passes .into_iter() .filter(|pass| { @@ -450,17 +438,6 @@ fn late_lint_crate<'tcx>(tcx: TyCtxt<'tcx>) { .collect(); filtered_passes.push(Box::new(HardwiredLints)); - - // let mut filtered_passes: Vec<Box<dyn LateLintPass<'tcx>>> = passes - // .into_iter() - // .filter(|pass| { - // let lints = LintPass::get_lints(pass); - // lints.iter() - // .any(|lint| - // !lints_that_dont_need_to_run.contains(&LintId::of(lint))) - // }).collect(); - // - let pass = RuntimeCombinedLateLintPass { passes: &mut filtered_passes[..] }; late_lint_crate_inner(tcx, context, pass); } diff --git a/compiler/rustc_lint/src/levels.rs b/compiler/rustc_lint/src/levels.rs index f5323c295d0..64e1cddf248 100644 --- a/compiler/rustc_lint/src/levels.rs +++ b/compiler/rustc_lint/src/levels.rs @@ -31,7 +31,7 @@ use crate::errors::{ OverruledAttributeSub, RequestedLevel, UnknownToolInScopedLint, UnsupportedGroup, }; use crate::fluent_generated as fluent; -use crate::late::{unerased_lint_store /*name_without_tool*/}; +use crate::late::unerased_lint_store; use crate::lints::{ DeprecatedLintName, DeprecatedLintNameFromCommandLine, IgnoredUnlessCrateSpecified, OverruledAttributeLint, RemovedLint, RemovedLintFromCommandLine, RenamedLint, @@ -122,7 +122,7 @@ fn lints_that_dont_need_to_run(tcx: TyCtxt<'_>, (): ()) -> FxIndexSet<LintId> { .get_lints() .into_iter() .filter_map(|lint| { - if !lint.loadbearing && lint.default_level(tcx.sess.edition()) == Level::Allow { + if !lint.eval_always && lint.default_level(tcx.sess.edition()) == Level::Allow { Some(LintId::of(lint)) } else { None @@ -134,21 +134,6 @@ fn lints_that_dont_need_to_run(tcx: TyCtxt<'_>, (): ()) -> FxIndexSet<LintId> { visitor.process_opts(); tcx.hir().walk_attributes(&mut visitor); - // let lint_groups = store.get_lint_groups(); - // for group in lint_groups { - // let binding = group.0.to_lowercase(); - // let group_name = name_without_tool(&binding).to_string(); - // if visitor.lints_that_actually_run.contains(&group_name) { - // for lint in group.1 { - // visitor.lints_that_actually_run.insert(name_without_tool(&lint.to_string()).to_string()); - // } - // } else if visitor.lints_allowed.contains(&group_name) { - // for lint in &group.1 { - // visitor.lints_allowed.insert(name_without_tool(&lint.to_string()).to_string()); - // } - // } - // } - visitor.dont_need_to_run } @@ -372,83 +357,44 @@ impl<'tcx> Visitor<'tcx> for LintLevelMaximum<'tcx> { self.tcx.hir() } + /// FIXME(blyxyas): In a future revision, we should also graph #![allow]s, + /// but that is handled with more care fn visit_attribute(&mut self, attribute: &'tcx ast::Attribute) { - match Level::from_attr(attribute) { + if matches!( + Level::from_attr(attribute), Some( Level::Warn - | Level::Deny - | Level::Forbid - | Level::Expect(..) - | Level::ForceWarn(..), - ) => { - let store = unerased_lint_store(self.tcx.sess); - let Some(meta) = attribute.meta() else { return }; - // SAFETY: Lint attributes are always a metalist inside a - // metalist (even with just one lint). - let Some(meta_item_list) = meta.meta_item_list() else { return }; - - for meta_list in meta_item_list { - // Convert Path to String - let Some(meta_item) = meta_list.meta_item() else { return }; - let ident: &str = &meta_item - .path - .segments - .iter() - .map(|segment| segment.ident.as_str()) - .collect::<Vec<&str>>() - .join("::"); - let Ok(lints) = store.find_lints( - // SAFETY: Lint attributes can only have literals - ident, - ) else { - return; - }; - for lint in lints { - self.dont_need_to_run.swap_remove(&lint); - } - // // If it's a tool lint (e.g. clippy::my_clippy_lint) - // if let ast::NestedMetaItem::MetaItem(meta_item) = meta_list { - // if meta_item.path.segments.len() == 1 { - // let Ok(lints) = store.find_lints( - // // SAFETY: Lint attributes can only have literals - // meta_list.ident().unwrap().name.as_str(), - // ) else { - // return; - // }; - // for lint in lints { - // dbg!("LINT REMOVED", &lint); - // self.dont_need_to_run.swap_remove(&lint); - // } - // } else { - // let Ok(lints) = store.find_lints( - // // SAFETY: Lint attributes can only have literals - // meta_item.path.segments[1].ident.name.as_str(), - // ) else { - // return; - // }; - // for lint in lints { - // dbg!("LINT REMOVED", &lint); - // self.dont_need_to_run.swap_remove(&lint); - // } - // } + | Level::Deny + | Level::Forbid + | Level::Expect(..) + | Level::ForceWarn(..), + ) + ) { + let store = unerased_lint_store(self.tcx.sess); + let Some(meta) = attribute.meta() else { return }; + // SAFETY: Lint attributes are always a metalist inside a + // metalist (even with just one lint). + let Some(meta_item_list) = meta.meta_item_list() else { return }; + + for meta_list in meta_item_list { + // Convert Path to String + let Some(meta_item) = meta_list.meta_item() else { return }; + let ident: &str = &meta_item + .path + .segments + .iter() + .map(|segment| segment.ident.as_str()) + .collect::<Vec<&str>>() + .join("::"); + let Ok(lints) = store.find_lints( + // SAFETY: Lint attributes can only have literals + ident, + ) else { + return; + }; + for lint in lints { + self.dont_need_to_run.swap_remove(&lint); } - // We handle #![allow]s differently, as these remove checking rather than adding. - } // Some(Level::Allow) if ast::AttrStyle::Inner == attribute.style => { - // for meta_list in meta.meta_item_list().unwrap() { - // // If it's a tool lint (e.g. clippy::my_clippy_lint) - // if let ast::NestedMetaItem::MetaItem(meta_item) = meta_list { - // if meta_item.path.segments.len() == 1 { - // self.lints_allowed - // .insert(meta_list.name_or_empty().as_str().to_string()); - // } else { - // self.lints_allowed - // .insert(meta_item.path.segments[1].ident.name.as_str().to_string()); - // } - // } - // } - // } - _ => { - return; } } } diff --git a/compiler/rustc_lint/src/lib.rs b/compiler/rustc_lint/src/lib.rs index 11dd17bcd4a..1607c8abfb5 100644 --- a/compiler/rustc_lint/src/lib.rs +++ b/compiler/rustc_lint/src/lib.rs @@ -279,7 +279,7 @@ fn register_builtins(store: &mut LintStore) { store.register_lints(&BuiltinCombinedEarlyLintPass::get_lints()); store.register_lints(&BuiltinCombinedModuleLateLintPass::get_lints()); store.register_lints(&foreign_modules::get_lints()); - store.register_lints(&HardwiredLints::default().get_lints()); + store.register_lints(&HardwiredLints::lint_vec()); add_lint_group!( "nonstandard_style", @@ -601,25 +601,25 @@ fn register_builtins(store: &mut LintStore) { } fn register_internals(store: &mut LintStore) { - store.register_lints(&LintPassImpl::default().get_lints()); + store.register_lints(&LintPassImpl::lint_vec()); store.register_early_pass(|| Box::new(LintPassImpl)); - store.register_lints(&DefaultHashTypes::default().get_lints()); + store.register_lints(&DefaultHashTypes::lint_vec()); store.register_late_mod_pass(|_| Box::new(DefaultHashTypes)); - store.register_lints(&QueryStability::default().get_lints()); + store.register_lints(&QueryStability::lint_vec()); store.register_late_mod_pass(|_| Box::new(QueryStability)); - store.register_lints(&ExistingDocKeyword::default().get_lints()); + store.register_lints(&ExistingDocKeyword::lint_vec()); store.register_late_mod_pass(|_| Box::new(ExistingDocKeyword)); - store.register_lints(&TyTyKind::default().get_lints()); + store.register_lints(&TyTyKind::lint_vec()); store.register_late_mod_pass(|_| Box::new(TyTyKind)); - store.register_lints(&TypeIr::default().get_lints()); + store.register_lints(&TypeIr::lint_vec()); store.register_late_mod_pass(|_| Box::new(TypeIr)); - store.register_lints(&Diagnostics::default().get_lints()); + store.register_lints(&Diagnostics::lint_vec()); store.register_late_mod_pass(|_| Box::new(Diagnostics)); - store.register_lints(&BadOptAccess::default().get_lints()); + store.register_lints(&BadOptAccess::lint_vec()); store.register_late_mod_pass(|_| Box::new(BadOptAccess)); - store.register_lints(&PassByValue::default().get_lints()); + store.register_lints(&PassByValue::lint_vec()); store.register_late_mod_pass(|_| Box::new(PassByValue)); - store.register_lints(&SpanUseEqCtxt::default().get_lints()); + store.register_lints(&SpanUseEqCtxt::lint_vec()); store.register_late_mod_pass(|_| Box::new(SpanUseEqCtxt)); // FIXME(davidtwco): deliberately do not include `UNTRANSLATABLE_DIAGNOSTIC` and // `DIAGNOSTIC_OUTSIDE_OF_IMPL` here because `-Wrustc::internal` is provided to every crate and diff --git a/compiler/rustc_lint/src/passes.rs b/compiler/rustc_lint/src/passes.rs index 6dbcdefe08d..18244b14e79 100644 --- a/compiler/rustc_lint/src/passes.rs +++ b/compiler/rustc_lint/src/passes.rs @@ -70,18 +70,7 @@ macro_rules! declare_late_lint_pass { // for all the `check_*` methods. late_lint_methods!(declare_late_lint_pass, []); -impl LateLintPass<'_> for HardwiredLints { - fn check_fn( - &mut self, - _: &LateContext<'_>, - _: rustc_hir::intravisit::FnKind<'_>, - _: &'_ rustc_hir::FnDecl<'_>, - _: &'_ rustc_hir::Body<'_>, - _: rustc_span::Span, - _: rustc_span::def_id::LocalDefId, - ) { - } -} +impl LateLintPass<'_> for HardwiredLints {} #[macro_export] macro_rules! expand_combined_late_lint_pass_method { @@ -121,7 +110,7 @@ macro_rules! declare_combined_late_lint_pass { $v fn get_lints() -> $crate::LintVec { let mut lints = Vec::new(); - $(lints.extend_from_slice(&$pass::default().get_lints());)* + $(lints.extend_from_slice(&$pass::lint_vec());)* lints } } @@ -236,7 +225,7 @@ macro_rules! declare_combined_early_lint_pass { $v fn get_lints() -> $crate::LintVec { let mut lints = Vec::new(); - $(lints.extend_from_slice(&$pass::default().get_lints());)* + $(lints.extend_from_slice(&$pass::lint_vec());)* lints } } |
