merge visitors in queries
Signed-off-by: Miguel Guarniz <mi9uel9@gmail.com>
This commit is contained in:
parent
b599cf45d6
commit
275497c35e
1 changed files with 91 additions and 151 deletions
|
@ -1211,20 +1211,12 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn hir_module_items(tcx: TyCtxt<'_>, module_id: LocalDefId) -> ModuleItems {
|
pub(super) fn hir_module_items(tcx: TyCtxt<'_>, module_id: LocalDefId) -> ModuleItems {
|
||||||
let mut collector = ModuleCollector {
|
let mut collector = ItemCollector::new(tcx, false);
|
||||||
tcx,
|
|
||||||
submodules: Vec::default(),
|
|
||||||
items: Vec::default(),
|
|
||||||
trait_items: Vec::default(),
|
|
||||||
impl_items: Vec::default(),
|
|
||||||
foreign_items: Vec::default(),
|
|
||||||
body_owners: Vec::default(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let (hir_mod, span, hir_id) = tcx.hir().get_module(module_id);
|
let (hir_mod, span, hir_id) = tcx.hir().get_module(module_id);
|
||||||
collector.visit_mod(hir_mod, span, hir_id);
|
collector.visit_mod(hir_mod, span, hir_id);
|
||||||
|
|
||||||
let ModuleCollector {
|
let ItemCollector {
|
||||||
submodules,
|
submodules,
|
||||||
items,
|
items,
|
||||||
trait_items,
|
trait_items,
|
||||||
|
@ -1241,90 +1233,14 @@ pub(super) fn hir_module_items(tcx: TyCtxt<'_>, module_id: LocalDefId) -> Module
|
||||||
foreign_items: foreign_items.into_boxed_slice(),
|
foreign_items: foreign_items.into_boxed_slice(),
|
||||||
body_owners: body_owners.into_boxed_slice(),
|
body_owners: body_owners.into_boxed_slice(),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ModuleCollector<'tcx> {
|
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
submodules: Vec<LocalDefId>,
|
|
||||||
items: Vec<ItemId>,
|
|
||||||
trait_items: Vec<TraitItemId>,
|
|
||||||
impl_items: Vec<ImplItemId>,
|
|
||||||
foreign_items: Vec<ForeignItemId>,
|
|
||||||
body_owners: Vec<LocalDefId>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'hir> Visitor<'hir> for ModuleCollector<'hir> {
|
|
||||||
type NestedFilter = nested_filter::All;
|
|
||||||
|
|
||||||
fn nested_visit_map(&mut self) -> Self::Map {
|
|
||||||
self.tcx.hir()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_item(&mut self, item: &'hir Item<'hir>) {
|
|
||||||
if associated_body(Node::Item(item)).is_some() {
|
|
||||||
self.body_owners.push(item.def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.items.push(item.item_id());
|
|
||||||
|
|
||||||
if let ItemKind::Mod(..) = item.kind {
|
|
||||||
// If this declares another module, do not recurse inside it.
|
|
||||||
self.submodules.push(item.def_id);
|
|
||||||
} else {
|
|
||||||
intravisit::walk_item(self, item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_trait_item(&mut self, item: &'hir TraitItem<'hir>) {
|
|
||||||
if associated_body(Node::TraitItem(item)).is_some() {
|
|
||||||
self.body_owners.push(item.def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.trait_items.push(item.trait_item_id());
|
|
||||||
intravisit::walk_trait_item(self, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_impl_item(&mut self, item: &'hir ImplItem<'hir>) {
|
|
||||||
if associated_body(Node::ImplItem(item)).is_some() {
|
|
||||||
self.body_owners.push(item.def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.impl_items.push(item.impl_item_id());
|
|
||||||
intravisit::walk_impl_item(self, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_foreign_item(&mut self, item: &'hir ForeignItem<'hir>) {
|
|
||||||
self.foreign_items.push(item.foreign_item_id());
|
|
||||||
intravisit::walk_foreign_item(self, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_expr(&mut self, ex: &'hir Expr<'hir>) {
|
|
||||||
if matches!(ex.kind, ExprKind::Closure { .. }) {
|
|
||||||
self.body_owners.push(self.tcx.hir().local_def_id(ex.hir_id));
|
|
||||||
}
|
|
||||||
intravisit::walk_expr(self, ex)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_anon_const(&mut self, c: &'hir AnonConst) {
|
|
||||||
self.body_owners.push(self.tcx.hir().local_def_id(c.hir_id));
|
|
||||||
intravisit::walk_anon_const(self, c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems {
|
pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems {
|
||||||
let mut collector = CrateCollector {
|
let mut collector = ItemCollector::new(tcx, true);
|
||||||
tcx,
|
|
||||||
submodules: Vec::default(),
|
|
||||||
items: Vec::default(),
|
|
||||||
trait_items: Vec::default(),
|
|
||||||
impl_items: Vec::default(),
|
|
||||||
foreign_items: Vec::default(),
|
|
||||||
body_owners: Vec::default(),
|
|
||||||
};
|
|
||||||
|
|
||||||
tcx.hir().walk_toplevel_module(&mut collector);
|
tcx.hir().walk_toplevel_module(&mut collector);
|
||||||
|
|
||||||
let CrateCollector {
|
let ItemCollector {
|
||||||
submodules,
|
submodules,
|
||||||
items,
|
items,
|
||||||
trait_items,
|
trait_items,
|
||||||
|
@ -1342,71 +1258,95 @@ pub(crate) fn hir_crate_items(tcx: TyCtxt<'_>, _: ()) -> ModuleItems {
|
||||||
foreign_items: foreign_items.into_boxed_slice(),
|
foreign_items: foreign_items.into_boxed_slice(),
|
||||||
body_owners: body_owners.into_boxed_slice(),
|
body_owners: body_owners.into_boxed_slice(),
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
struct CrateCollector<'tcx> {
|
struct ItemCollector<'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
// When true, it collects all items in the create,
|
||||||
submodules: Vec<LocalDefId>,
|
// otherwise it collects items in some module.
|
||||||
items: Vec<ItemId>,
|
crate_collector: bool,
|
||||||
trait_items: Vec<TraitItemId>,
|
tcx: TyCtxt<'tcx>,
|
||||||
impl_items: Vec<ImplItemId>,
|
submodules: Vec<LocalDefId>,
|
||||||
foreign_items: Vec<ForeignItemId>,
|
items: Vec<ItemId>,
|
||||||
body_owners: Vec<LocalDefId>,
|
trait_items: Vec<TraitItemId>,
|
||||||
}
|
impl_items: Vec<ImplItemId>,
|
||||||
|
foreign_items: Vec<ForeignItemId>,
|
||||||
|
body_owners: Vec<LocalDefId>,
|
||||||
|
}
|
||||||
|
|
||||||
impl<'hir> Visitor<'hir> for CrateCollector<'hir> {
|
impl<'tcx> ItemCollector<'tcx> {
|
||||||
type NestedFilter = nested_filter::All;
|
fn new(tcx: TyCtxt<'tcx>, crate_collector: bool) -> ItemCollector<'tcx> {
|
||||||
|
ItemCollector {
|
||||||
fn nested_visit_map(&mut self) -> Self::Map {
|
crate_collector,
|
||||||
self.tcx.hir()
|
tcx,
|
||||||
}
|
submodules: Vec::default(),
|
||||||
|
items: Vec::default(),
|
||||||
fn visit_item(&mut self, item: &'hir Item<'hir>) {
|
trait_items: Vec::default(),
|
||||||
if associated_body(Node::Item(item)).is_some() {
|
impl_items: Vec::default(),
|
||||||
self.body_owners.push(item.def_id);
|
foreign_items: Vec::default(),
|
||||||
}
|
body_owners: Vec::default(),
|
||||||
|
|
||||||
self.items.push(item.item_id());
|
|
||||||
intravisit::walk_item(self, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_mod(&mut self, m: &'hir Mod<'hir>, _s: Span, n: HirId) {
|
|
||||||
self.submodules.push(n.owner);
|
|
||||||
intravisit::walk_mod(self, m, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_foreign_item(&mut self, item: &'hir ForeignItem<'hir>) {
|
|
||||||
self.foreign_items.push(item.foreign_item_id());
|
|
||||||
intravisit::walk_foreign_item(self, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_trait_item(&mut self, item: &'hir TraitItem<'hir>) {
|
|
||||||
if associated_body(Node::TraitItem(item)).is_some() {
|
|
||||||
self.body_owners.push(item.def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.trait_items.push(item.trait_item_id());
|
|
||||||
intravisit::walk_trait_item(self, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_impl_item(&mut self, item: &'hir ImplItem<'hir>) {
|
|
||||||
if associated_body(Node::ImplItem(item)).is_some() {
|
|
||||||
self.body_owners.push(item.def_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.impl_items.push(item.impl_item_id());
|
|
||||||
intravisit::walk_impl_item(self, item)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_expr(&mut self, ex: &'hir Expr<'hir>) {
|
|
||||||
if matches!(ex.kind, ExprKind::Closure { .. }) {
|
|
||||||
self.body_owners.push(self.tcx.hir().local_def_id(ex.hir_id));
|
|
||||||
}
|
|
||||||
intravisit::walk_expr(self, ex)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_anon_const(&mut self, c: &'hir AnonConst) {
|
|
||||||
self.body_owners.push(self.tcx.hir().local_def_id(c.hir_id));
|
|
||||||
intravisit::walk_anon_const(self, c)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'hir> Visitor<'hir> for ItemCollector<'hir> {
|
||||||
|
type NestedFilter = nested_filter::All;
|
||||||
|
|
||||||
|
fn nested_visit_map(&mut self) -> Self::Map {
|
||||||
|
self.tcx.hir()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_item(&mut self, item: &'hir Item<'hir>) {
|
||||||
|
if associated_body(Node::Item(item)).is_some() {
|
||||||
|
self.body_owners.push(item.def_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.items.push(item.item_id());
|
||||||
|
|
||||||
|
if !self.crate_collector && let ItemKind::Mod(..) = item.kind {
|
||||||
|
// If this declares another module, do not recurse inside it.
|
||||||
|
self.submodules.push(item.def_id);
|
||||||
|
} else {
|
||||||
|
intravisit::walk_item(self, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_mod(&mut self, m: &'hir Mod<'hir>, _s: Span, n: HirId) {
|
||||||
|
self.submodules.push(n.owner);
|
||||||
|
intravisit::walk_mod(self, m, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_foreign_item(&mut self, item: &'hir ForeignItem<'hir>) {
|
||||||
|
self.foreign_items.push(item.foreign_item_id());
|
||||||
|
intravisit::walk_foreign_item(self, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_anon_const(&mut self, c: &'hir AnonConst) {
|
||||||
|
self.body_owners.push(self.tcx.hir().local_def_id(c.hir_id));
|
||||||
|
intravisit::walk_anon_const(self, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_expr(&mut self, ex: &'hir Expr<'hir>) {
|
||||||
|
if matches!(ex.kind, ExprKind::Closure { .. }) {
|
||||||
|
self.body_owners.push(self.tcx.hir().local_def_id(ex.hir_id));
|
||||||
|
}
|
||||||
|
intravisit::walk_expr(self, ex)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_trait_item(&mut self, item: &'hir TraitItem<'hir>) {
|
||||||
|
if associated_body(Node::TraitItem(item)).is_some() {
|
||||||
|
self.body_owners.push(item.def_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.trait_items.push(item.trait_item_id());
|
||||||
|
intravisit::walk_trait_item(self, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_impl_item(&mut self, item: &'hir ImplItem<'hir>) {
|
||||||
|
if associated_body(Node::ImplItem(item)).is_some() {
|
||||||
|
self.body_owners.push(item.def_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.impl_items.push(item.impl_item_id());
|
||||||
|
intravisit::walk_impl_item(self, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue