Open
Description
HIR is globally traversed using the tcx.hir().{,par_}visit_all_item_likes{,_in_module}
family of functions. These functions create a lot of dependency edges (they call the hir_crate
query, or call hir_owner
for each item-like). These dependencies are not always useful: many use sites only require item
s, and don't care for impl items, trait items or foreign items.
This can be avoided by replacing those functions by a scheme based on ItemId
s. Actual user will be responsible for calling tcx.hir().item
to get the HIR. The amount of access to HIR will be further reduced by pre-filtering using tcx.def_kind
query.
Steps:
- create a
hir_crate_items
query which traversestcx.hir_crate(()).owners
to collect all the ids and return arustc_middle::hir::ModuleItems
; - use
tcx.hir_crate_items
intcx.hir().items
to return an iterator ofhir::ItemId
; - use
tcx.hir_crate_items
to introduce atcx.hir().par_items(impl Fn(hir::ItemId))
to traverse all items in parallel; - gradually replace uses of
tcx.hir().{,par_}visit_all_item_likes
withtcx.hir().par_items
ortcx.hir().items
;
when possible, create a fast path usingtcx.def_kind(item_id.def_id)
before callingtcx.hir().item(item_id)
; - introduce
tcx.hir().items_in_module
andtcx.hir().par_items_in_module
which do the same thing withtcx.hir_module_items
instead oftcx.hir_crate_items
; - gradually replace uses of
tcx.hir().visit_all_item_likes_in_module
withtcx.hir().par_items_in_module
ortcx.hir().items_in_module
; - retire
hir::ItemLikeVisitor
.
The steps starting with "gradually" can be split into several PRs.
I am available on zulip for any question.