Skip to content

Commit edba282

Browse files
committed
Auto merge of #95655 - kckeiks:create-hir-crate-items-query, r=cjgillot
Refactor HIR item-like traversal (part 1) Issue #95004 - Create hir_crate_items query which traverses tcx.hir_crate(()).owners to return a hir::ModuleItems - use tcx.hir_crate_items in tcx.hir().items() to return an iterator of hir::ItemId - use tcx.hir_crate_items to introduce a tcx.hir().par_items(impl Fn(hir::ItemId)) to traverse all items in parallel; Signed-off-by: Miguel Guarniz <[email protected]> cc `@cjgillot`
2 parents ac8b118 + 88108bd commit edba282

File tree

18 files changed

+433
-420
lines changed

18 files changed

+433
-420
lines changed

compiler/rustc_hir/src/target.rs

+25
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use crate::hir;
88
use crate::{Item, ItemKind, TraitItem, TraitItemKind};
99

10+
use crate::def::DefKind;
1011
use std::fmt::{self, Display};
1112

1213
#[derive(Copy, Clone, PartialEq, Debug)]
@@ -130,6 +131,30 @@ impl Target {
130131
}
131132
}
132133

134+
// FIXME: For now, should only be used with def_kinds from ItemIds
135+
pub fn from_def_kind(def_kind: DefKind) -> Target {
136+
match def_kind {
137+
DefKind::ExternCrate => Target::ExternCrate,
138+
DefKind::Use => Target::Use,
139+
DefKind::Static(..) => Target::Static,
140+
DefKind::Const => Target::Const,
141+
DefKind::Fn => Target::Fn,
142+
DefKind::Macro(..) => Target::MacroDef,
143+
DefKind::Mod => Target::Mod,
144+
DefKind::ForeignMod => Target::ForeignMod,
145+
DefKind::GlobalAsm => Target::GlobalAsm,
146+
DefKind::TyAlias => Target::TyAlias,
147+
DefKind::OpaqueTy => Target::OpaqueTy,
148+
DefKind::Enum => Target::Enum,
149+
DefKind::Struct => Target::Struct,
150+
DefKind::Union => Target::Union,
151+
DefKind::Trait => Target::Trait,
152+
DefKind::TraitAlias => Target::TraitAlias,
153+
DefKind::Impl => Target::Impl,
154+
_ => panic!("impossible case reached"),
155+
}
156+
}
157+
133158
pub fn from_trait_item(trait_item: &TraitItem<'_>) -> Target {
134159
match trait_item.kind {
135160
TraitItemKind::Const(..) => Target::AssocConst,

compiler/rustc_incremental/src/persist/dirty_clean.rs

+20-21
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use rustc_data_structures::fx::FxHashSet;
2424
use rustc_hir as hir;
2525
use rustc_hir::def_id::LocalDefId;
2626
use rustc_hir::intravisit;
27-
use rustc_hir::itemlikevisit::ItemLikeVisitor;
2827
use rustc_hir::Node as HirNode;
2928
use rustc_hir::{ImplItemKind, ItemKind as HirItem, TraitItemKind};
3029
use rustc_middle::dep_graph::{label_strs, DepNode, DepNodeExt};
@@ -147,7 +146,24 @@ pub fn check_dirty_clean_annotations(tcx: TyCtxt<'_>) {
147146

148147
tcx.dep_graph.with_ignore(|| {
149148
let mut dirty_clean_visitor = DirtyCleanVisitor { tcx, checked_attrs: Default::default() };
150-
tcx.hir().visit_all_item_likes(&mut dirty_clean_visitor);
149+
150+
let crate_items = tcx.hir_crate_items(());
151+
152+
for id in crate_items.items() {
153+
dirty_clean_visitor.check_item(id.def_id);
154+
}
155+
156+
for id in crate_items.trait_items() {
157+
dirty_clean_visitor.check_item(id.def_id);
158+
}
159+
160+
for id in crate_items.impl_items() {
161+
dirty_clean_visitor.check_item(id.def_id);
162+
}
163+
164+
for id in crate_items.foreign_items() {
165+
dirty_clean_visitor.check_item(id.def_id);
166+
}
151167

152168
let mut all_attrs = FindAllAttrs { tcx, found_attrs: vec![] };
153169
tcx.hir().walk_attributes(&mut all_attrs);
@@ -365,7 +381,8 @@ impl<'tcx> DirtyCleanVisitor<'tcx> {
365381
}
366382
}
367383

368-
fn check_item(&mut self, item_id: LocalDefId, item_span: Span) {
384+
fn check_item(&mut self, item_id: LocalDefId) {
385+
let item_span = self.tcx.def_span(item_id.to_def_id());
369386
let def_path_hash = self.tcx.def_path_hash(item_id.to_def_id());
370387
for attr in self.tcx.get_attrs(item_id.to_def_id()).iter() {
371388
let Some(assertion) = self.assertion_maybe(item_id, attr) else {
@@ -388,24 +405,6 @@ impl<'tcx> DirtyCleanVisitor<'tcx> {
388405
}
389406
}
390407

391-
impl<'tcx> ItemLikeVisitor<'tcx> for DirtyCleanVisitor<'tcx> {
392-
fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) {
393-
self.check_item(item.def_id, item.span);
394-
}
395-
396-
fn visit_trait_item(&mut self, item: &hir::TraitItem<'_>) {
397-
self.check_item(item.def_id, item.span);
398-
}
399-
400-
fn visit_impl_item(&mut self, item: &hir::ImplItem<'_>) {
401-
self.check_item(item.def_id, item.span);
402-
}
403-
404-
fn visit_foreign_item(&mut self, item: &hir::ForeignItem<'_>) {
405-
self.check_item(item.def_id, item.span);
406-
}
407-
}
408-
409408
/// Given a `#[rustc_clean]` attribute, scan for a `cfg="foo"` attribute and check whether we have
410409
/// a cfg flag called `foo`.
411410
fn check_config(tcx: TyCtxt<'_>, attr: &Attribute) -> bool {

compiler/rustc_interface/src/proc_macro_decls.rs

+9-19
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,25 @@
11
use rustc_hir as hir;
22
use rustc_hir::def_id::LocalDefId;
3-
use rustc_hir::itemlikevisit::ItemLikeVisitor;
43
use rustc_middle::ty::query::Providers;
54
use rustc_middle::ty::TyCtxt;
65
use rustc_span::symbol::sym;
76

87
fn proc_macro_decls_static(tcx: TyCtxt<'_>, (): ()) -> Option<LocalDefId> {
98
let mut finder = Finder { tcx, decls: None };
10-
tcx.hir().visit_all_item_likes(&mut finder);
119

12-
finder.decls.map(|id| tcx.hir().local_def_id(id))
13-
}
14-
15-
struct Finder<'tcx> {
16-
tcx: TyCtxt<'tcx>,
17-
decls: Option<hir::HirId>,
18-
}
19-
20-
impl<'v> ItemLikeVisitor<'v> for Finder<'_> {
21-
fn visit_item(&mut self, item: &hir::Item<'_>) {
22-
let attrs = self.tcx.hir().attrs(item.hir_id());
23-
if self.tcx.sess.contains_name(attrs, sym::rustc_proc_macro_decls) {
24-
self.decls = Some(item.hir_id());
10+
for id in tcx.hir().items() {
11+
let attrs = finder.tcx.hir().attrs(id.hir_id());
12+
if finder.tcx.sess.contains_name(attrs, sym::rustc_proc_macro_decls) {
13+
finder.decls = Some(id.def_id);
2514
}
2615
}
2716

28-
fn visit_trait_item(&mut self, _trait_item: &hir::TraitItem<'_>) {}
29-
30-
fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem<'_>) {}
17+
finder.decls
18+
}
3119

32-
fn visit_foreign_item(&mut self, _foreign_item: &hir::ForeignItem<'_>) {}
20+
struct Finder<'tcx> {
21+
tcx: TyCtxt<'tcx>,
22+
decls: Option<hir::def_id::LocalDefId>,
3323
}
3424

3525
pub(crate) fn provide(providers: &mut Providers) {
+12-22
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
11
use rustc_hir as hir;
2-
use rustc_hir::itemlikevisit::ItemLikeVisitor;
2+
use rustc_hir::def::DefKind;
33
use rustc_middle::ty::TyCtxt;
44
use rustc_session::cstore::ForeignModule;
55

66
crate fn collect(tcx: TyCtxt<'_>) -> Vec<ForeignModule> {
7-
let mut collector = Collector { modules: Vec::new() };
8-
tcx.hir().visit_all_item_likes(&mut collector);
9-
collector.modules
10-
}
11-
12-
struct Collector {
13-
modules: Vec<ForeignModule>,
14-
}
15-
16-
impl<'tcx> ItemLikeVisitor<'tcx> for Collector {
17-
fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) {
18-
let hir::ItemKind::ForeignMod { items, .. } = it.kind else {
19-
return;
20-
};
21-
22-
let foreign_items = items.iter().map(|it| it.id.def_id.to_def_id()).collect();
23-
self.modules.push(ForeignModule { foreign_items, def_id: it.def_id.to_def_id() });
7+
let mut modules = Vec::new();
8+
for id in tcx.hir().items() {
9+
if !matches!(tcx.hir().def_kind(id.def_id), DefKind::ForeignMod) {
10+
continue;
11+
}
12+
let item = tcx.hir().item(id);
13+
if let hir::ItemKind::ForeignMod { items, .. } = item.kind {
14+
let foreign_items = items.iter().map(|it| it.id.def_id.to_def_id()).collect();
15+
modules.push(ForeignModule { foreign_items, def_id: id.def_id.to_def_id() });
16+
}
2417
}
25-
26-
fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {}
27-
fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {}
28-
fn visit_foreign_item(&mut self, _it: &'tcx hir::ForeignItem<'tcx>) {}
18+
modules
2919
}

compiler/rustc_metadata/src/native_libs.rs

+11-10
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use rustc_attr as attr;
33
use rustc_data_structures::fx::FxHashSet;
44
use rustc_errors::struct_span_err;
55
use rustc_hir as hir;
6-
use rustc_hir::itemlikevisit::ItemLikeVisitor;
6+
use rustc_hir::def::DefKind;
77
use rustc_middle::ty::{List, ParamEnv, ParamEnvAnd, Ty, TyCtxt};
88
use rustc_session::cstore::{DllCallingConvention, DllImport, NativeLib};
99
use rustc_session::parse::feature_err;
@@ -15,7 +15,9 @@ use rustc_target::spec::abi::Abi;
1515

1616
crate fn collect(tcx: TyCtxt<'_>) -> Vec<NativeLib> {
1717
let mut collector = Collector { tcx, libs: Vec::new() };
18-
tcx.hir().visit_all_item_likes(&mut collector);
18+
for id in tcx.hir().items() {
19+
collector.process_item(id);
20+
}
1921
collector.process_command_line();
2022
collector.libs
2123
}
@@ -32,8 +34,13 @@ struct Collector<'tcx> {
3234
libs: Vec<NativeLib>,
3335
}
3436

35-
impl<'tcx> ItemLikeVisitor<'tcx> for Collector<'tcx> {
36-
fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) {
37+
impl<'tcx> Collector<'tcx> {
38+
fn process_item(&mut self, id: rustc_hir::ItemId) {
39+
if !matches!(self.tcx.hir().def_kind(id.def_id), DefKind::ForeignMod) {
40+
return;
41+
}
42+
43+
let it = self.tcx.hir().item(id);
3744
let hir::ItemKind::ForeignMod { abi, items: foreign_mod_items } = it.kind else {
3845
return;
3946
};
@@ -252,12 +259,6 @@ impl<'tcx> ItemLikeVisitor<'tcx> for Collector<'tcx> {
252259
}
253260
}
254261

255-
fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {}
256-
fn visit_impl_item(&mut self, _it: &'tcx hir::ImplItem<'tcx>) {}
257-
fn visit_foreign_item(&mut self, _it: &'tcx hir::ForeignItem<'tcx>) {}
258-
}
259-
260-
impl Collector<'_> {
261262
fn register_native_lib(&mut self, span: Option<Span>, lib: NativeLib) {
262263
if lib.name.as_ref().map_or(false, |&s| s == kw::Empty) {
263264
match span {

compiler/rustc_metadata/src/rmeta/encoder.rs

+20-38
Original file line numberDiff line numberDiff line change
@@ -1787,10 +1787,27 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
17871787
debug!("EncodeContext::encode_traits_and_impls()");
17881788
empty_proc_macro!(self);
17891789
let tcx = self.tcx;
1790-
let mut visitor = ImplsVisitor { tcx, impls: FxHashMap::default() };
1791-
tcx.hir().visit_all_item_likes(&mut visitor);
1790+
let mut fx_hash_map: FxHashMap<DefId, Vec<(DefIndex, Option<SimplifiedType>)>> =
1791+
FxHashMap::default();
17921792

1793-
let mut all_impls: Vec<_> = visitor.impls.into_iter().collect();
1793+
for id in tcx.hir().items() {
1794+
if matches!(tcx.hir().def_kind(id.def_id), DefKind::Impl) {
1795+
if let Some(trait_ref) = tcx.impl_trait_ref(id.def_id.to_def_id()) {
1796+
let simplified_self_ty = fast_reject::simplify_type(
1797+
self.tcx,
1798+
trait_ref.self_ty(),
1799+
TreatParams::AsPlaceholders,
1800+
);
1801+
1802+
fx_hash_map
1803+
.entry(trait_ref.def_id)
1804+
.or_default()
1805+
.push((id.def_id.local_def_index, simplified_self_ty));
1806+
}
1807+
}
1808+
}
1809+
1810+
let mut all_impls: Vec<_> = fx_hash_map.into_iter().collect();
17941811

17951812
// Bring everything into deterministic order for hashing
17961813
all_impls.sort_by_cached_key(|&(trait_def_id, _)| tcx.def_path_hash(trait_def_id));
@@ -2053,41 +2070,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
20532070
}
20542071
}
20552072

2056-
struct ImplsVisitor<'tcx> {
2057-
tcx: TyCtxt<'tcx>,
2058-
impls: FxHashMap<DefId, Vec<(DefIndex, Option<SimplifiedType>)>>,
2059-
}
2060-
2061-
impl<'tcx, 'v> ItemLikeVisitor<'v> for ImplsVisitor<'tcx> {
2062-
fn visit_item(&mut self, item: &hir::Item<'_>) {
2063-
match item.kind {
2064-
hir::ItemKind::Impl(..) => {
2065-
if let Some(trait_ref) = self.tcx.impl_trait_ref(item.def_id.to_def_id()) {
2066-
let simplified_self_ty = fast_reject::simplify_type(
2067-
self.tcx,
2068-
trait_ref.self_ty(),
2069-
TreatParams::AsPlaceholders,
2070-
);
2071-
2072-
self.impls
2073-
.entry(trait_ref.def_id)
2074-
.or_default()
2075-
.push((item.def_id.local_def_index, simplified_self_ty));
2076-
}
2077-
}
2078-
_ => {}
2079-
}
2080-
}
2081-
2082-
fn visit_trait_item(&mut self, _trait_item: &'v hir::TraitItem<'v>) {}
2083-
2084-
fn visit_impl_item(&mut self, _impl_item: &'v hir::ImplItem<'v>) {
2085-
// handled in `visit_item` above
2086-
}
2087-
2088-
fn visit_foreign_item(&mut self, _foreign_item: &'v hir::ForeignItem<'v>) {}
2089-
}
2090-
20912073
/// Used to prefetch queries which will be needed later by metadata encoding.
20922074
/// Only a subset of the queries are actually prefetched to keep this code smaller.
20932075
fn prefetch_mir(tcx: TyCtxt<'_>) {

0 commit comments

Comments
 (0)