Trait rustc_hir::itemlikevisit::ItemLikeVisitor [−][src]
pub trait ItemLikeVisitor<'hir> {
fn visit_item(&mut self, item: &'hir Item<'hir>);
fn visit_trait_item(&mut self, trait_item: &'hir TraitItem<'hir>);
fn visit_impl_item(&mut self, impl_item: &'hir ImplItem<'hir>);
fn visit_foreign_item(&mut self, foreign_item: &'hir ForeignItem<'hir>);
}Expand description
The “item-like visitor” defines only the top-level methods
that can be invoked by Crate::visit_all_item_likes(). Whether
this trait is the right one to implement will depend on the
overall pattern you need. Here are the three available patterns,
in roughly the order of desirability:
- Shallow visit: Get a simple callback for every item (or item-like thing) in the HIR.
- Example: find all items with a
#[foo]attribute on them. - How: Implement
ItemLikeVisitorand calltcx.hir().krate().visit_all_item_likes(). - Pro: Efficient; just walks the lists of item-like things, not the nodes themselves.
- Con: Don’t get information about nesting
- Con: Don’t have methods for specific bits of HIR, like “on every expr, do this”.
- Example: find all items with a
- Deep visit: Want to scan for specific kinds of HIR nodes within
an item, but don’t care about how item-like things are nested
within one another.
- Example: Examine each expression to look for its type and do some check or other.
- How: Implement
intravisit::Visitorand override thenested_visit_map()method to returnNestedVisitorMap::OnlyBodiesand usetcx.hir().krate().visit_all_item_likes(&mut visitor.as_deep_visitor()). Within yourintravisit::Visitorimpl, implement methods likevisit_expr()(don’t forget to invokeintravisit::walk_expr()to keep walking the subparts). - Pro: Visitor methods for any kind of HIR node, not just item-like things.
- Pro: Integrates well into dependency tracking.
- Con: Don’t get information about nesting between items
- Nested visit: Want to visit the whole HIR and you care about the nesting between
item-like things.
- Example: Lifetime resolution, which wants to bring lifetimes declared on the impl into scope while visiting the impl-items, and then back out again.
- How: Implement
intravisit::Visitorand override thenested_visit_map()method to returnNestedVisitorMap::All. Walk your crate withintravisit::walk_crate()invoked ontcx.hir().krate(). - Pro: Visitor methods for any kind of HIR node, not just item-like things.
- Pro: Preserves nesting information
- Con: Does not integrate well into dependency tracking.
Note: the methods of ItemLikeVisitor intentionally have no
defaults, so that as we expand the list of item-like things, we
revisit the various visitors to see if they need to change. This
is harder to do with intravisit::Visitor, so when you add a new
visit_nested_foo() method, it is recommended that you search for
existing fn visit_nested methods to see where changes are
needed.