From 0baf85e8b6588ea24af710c981c91930e01f5a19 Mon Sep 17 00:00:00 2001 From: Miguel Guarniz Date: Wed, 6 Apr 2022 19:04:15 -0400 Subject: [PATCH] remove some uses of visit_all_item_likes in incremental, metadata and interface crates Signed-off-by: Miguel Guarniz --- .../src/persist/dirty_clean.rs | 23 ++++++++++++++++++- .../rustc_interface/src/proc_macro_decls.rs | 9 +++++++- .../rustc_metadata/src/foreign_modules.rs | 13 ++++++++--- compiler/rustc_metadata/src/native_libs.rs | 5 +++- compiler/rustc_metadata/src/rmeta/encoder.rs | 6 ++++- compiler/rustc_middle/src/hir/mod.rs | 15 ++++++++++++ 6 files changed, 64 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_incremental/src/persist/dirty_clean.rs b/compiler/rustc_incremental/src/persist/dirty_clean.rs index 8a4ed02f6ae..49697be51eb 100644 --- a/compiler/rustc_incremental/src/persist/dirty_clean.rs +++ b/compiler/rustc_incremental/src/persist/dirty_clean.rs @@ -147,7 +147,28 @@ pub fn check_dirty_clean_annotations(tcx: TyCtxt<'_>) { tcx.dep_graph.with_ignore(|| { let mut dirty_clean_visitor = DirtyCleanVisitor { tcx, checked_attrs: Default::default() }; - tcx.hir().visit_all_item_likes(&mut dirty_clean_visitor); + + let crate_items = tcx.hir_crate_items(()); + + for id in crate_items.items() { + let item = tcx.hir().item(id); + dirty_clean_visitor.check_item(item.def_id, item.span); + } + + for id in crate_items.trait_items() { + let item = tcx.hir().trait_item(id); + dirty_clean_visitor.check_item(item.def_id, item.span); + } + + for id in crate_items.impl_items() { + let item = tcx.hir().impl_item(id); + dirty_clean_visitor.check_item(item.def_id, item.span); + } + + for id in crate_items.foreign_items() { + let item = tcx.hir().foreign_item(id); + dirty_clean_visitor.check_item(item.def_id, item.span); + } let mut all_attrs = FindAllAttrs { tcx, found_attrs: vec![] }; tcx.hir().walk_attributes(&mut all_attrs); diff --git a/compiler/rustc_interface/src/proc_macro_decls.rs b/compiler/rustc_interface/src/proc_macro_decls.rs index c0316ce58d2..d0b895643c5 100644 --- a/compiler/rustc_interface/src/proc_macro_decls.rs +++ b/compiler/rustc_interface/src/proc_macro_decls.rs @@ -7,7 +7,14 @@ use rustc_span::symbol::sym; fn proc_macro_decls_static(tcx: TyCtxt<'_>, (): ()) -> Option { let mut finder = Finder { tcx, decls: None }; - tcx.hir().visit_all_item_likes(&mut finder); + + for id in tcx.hir().items() { + let item = tcx.hir().item(id); + let attrs = finder.tcx.hir().attrs(item.hir_id()); + if finder.tcx.sess.contains_name(attrs, sym::rustc_proc_macro_decls) { + finder.decls = Some(item.hir_id()); + } + } finder.decls.map(|id| tcx.hir().local_def_id(id)) } diff --git a/compiler/rustc_metadata/src/foreign_modules.rs b/compiler/rustc_metadata/src/foreign_modules.rs index c4ee1e19128..cb961d4d605 100644 --- a/compiler/rustc_metadata/src/foreign_modules.rs +++ b/compiler/rustc_metadata/src/foreign_modules.rs @@ -4,9 +4,16 @@ use rustc_middle::ty::TyCtxt; use rustc_session::cstore::ForeignModule; crate fn collect(tcx: TyCtxt<'_>) -> Vec { - let mut collector = Collector { modules: Vec::new() }; - tcx.hir().visit_all_item_likes(&mut collector); - collector.modules + let mut modules = Vec::new(); + for id in tcx.hir().items() { + let item = tcx.hir().item(id); + let hir::ItemKind::ForeignMod { items, .. } = item.kind else { + continue; + }; + let foreign_items = items.iter().map(|it| it.id.def_id.to_def_id()).collect(); + modules.push(ForeignModule { foreign_items, def_id: id.def_id.to_def_id() }); + } + modules } struct Collector { diff --git a/compiler/rustc_metadata/src/native_libs.rs b/compiler/rustc_metadata/src/native_libs.rs index 1cbfb0bd554..547c4876cb8 100644 --- a/compiler/rustc_metadata/src/native_libs.rs +++ b/compiler/rustc_metadata/src/native_libs.rs @@ -15,7 +15,10 @@ use rustc_target::spec::abi::Abi; crate fn collect(tcx: TyCtxt<'_>) -> Vec { let mut collector = Collector { tcx, libs: Vec::new() }; - tcx.hir().visit_all_item_likes(&mut collector); + for id in tcx.hir().items() { + let item = tcx.hir().item(id); + collector.visit_item(item); + } collector.process_command_line(); collector.libs } diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 6c758b8e5b6..6ad7a342bdc 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -1784,7 +1784,11 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { empty_proc_macro!(self); let tcx = self.tcx; let mut visitor = ImplsVisitor { tcx, impls: FxHashMap::default() }; - tcx.hir().visit_all_item_likes(&mut visitor); + + for id in tcx.hir().items() { + let item = tcx.hir().item(id); + visitor.visit_item(item); + } let mut all_impls: Vec<_> = visitor.impls.into_iter().collect(); diff --git a/compiler/rustc_middle/src/hir/mod.rs b/compiler/rustc_middle/src/hir/mod.rs index fcce2d005d7..039e9953814 100644 --- a/compiler/rustc_middle/src/hir/mod.rs +++ b/compiler/rustc_middle/src/hir/mod.rs @@ -45,6 +45,21 @@ pub struct ModuleItems { foreign_items: Box<[ForeignItemId]>, } +impl ModuleItems { + pub fn items(&self) -> impl Iterator { + self.items.to_vec().into_iter() + } + pub fn trait_items(&self) -> impl Iterator { + self.trait_items.to_vec().into_iter() + } + pub fn impl_items(&self) -> impl Iterator { + self.impl_items.to_vec().into_iter() + } + pub fn foreign_items(&self) -> impl Iterator { + self.foreign_items.to_vec().into_iter() + } +} + impl<'tcx> TyCtxt<'tcx> { #[inline(always)] pub fn hir(self) -> map::Map<'tcx> {