Store ForeignItem in a side table.
This commit is contained in:
parent
65ecc481fa
commit
419a9186a4
46 changed files with 270 additions and 55 deletions
|
@ -64,6 +64,10 @@ where
|
|||
fn visit_impl_item(&mut self, impl_item: &'hir ImplItem<'hir>) {
|
||||
self.visitor.visit_impl_item(impl_item);
|
||||
}
|
||||
|
||||
fn visit_foreign_item(&mut self, foreign_item: &'hir ForeignItem<'hir>) {
|
||||
self.visitor.visit_foreign_item(foreign_item);
|
||||
}
|
||||
}
|
||||
|
||||
pub trait IntoVisitor<'hir> {
|
||||
|
@ -88,6 +92,10 @@ where
|
|||
fn visit_impl_item(&self, impl_item: &'hir ImplItem<'hir>) {
|
||||
self.0.into_visitor().visit_impl_item(impl_item);
|
||||
}
|
||||
|
||||
fn visit_foreign_item(&self, foreign_item: &'hir ForeignItem<'hir>) {
|
||||
self.0.into_visitor().visit_foreign_item(foreign_item);
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
|
@ -128,6 +136,7 @@ pub trait Map<'hir> {
|
|||
fn item(&self, id: HirId) -> &'hir Item<'hir>;
|
||||
fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir>;
|
||||
fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir>;
|
||||
fn foreign_item(&self, id: ForeignItemId) -> &'hir ForeignItem<'hir>;
|
||||
}
|
||||
|
||||
/// An erased version of `Map<'hir>`, using dynamic dispatch.
|
||||
|
@ -150,6 +159,9 @@ impl<'hir> Map<'hir> for ErasedMap<'hir> {
|
|||
fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir> {
|
||||
self.0.impl_item(id)
|
||||
}
|
||||
fn foreign_item(&self, id: ForeignItemId) -> &'hir ForeignItem<'hir> {
|
||||
self.0.foreign_item(id)
|
||||
}
|
||||
}
|
||||
|
||||
/// Specifies what nested things a visitor wants to visit. The most
|
||||
|
@ -277,6 +289,14 @@ pub trait Visitor<'v>: Sized {
|
|||
walk_list!(self, visit_impl_item, opt_item);
|
||||
}
|
||||
|
||||
/// Like `visit_nested_item()`, but for impl items. See
|
||||
/// `visit_nested_item()` for advice on when to override this
|
||||
/// method.
|
||||
fn visit_nested_foreign_item(&mut self, id: ForeignItemId) {
|
||||
let opt_item = self.nested_visit_map().inter().map(|map| map.foreign_item(id));
|
||||
walk_list!(self, visit_foreign_item, opt_item);
|
||||
}
|
||||
|
||||
/// Invoked to visit the body of a function, method or closure. Like
|
||||
/// visit_nested_item, does nothing by default unless you override
|
||||
/// `nested_visit_map` to return other than `None`, in which case it will walk
|
||||
|
@ -378,6 +398,9 @@ pub trait Visitor<'v>: Sized {
|
|||
fn visit_impl_item(&mut self, ii: &'v ImplItem<'v>) {
|
||||
walk_impl_item(self, ii)
|
||||
}
|
||||
fn visit_foreign_item_ref(&mut self, ii: &'v ForeignItemRef<'v>) {
|
||||
walk_foreign_item_ref(self, ii)
|
||||
}
|
||||
fn visit_impl_item_ref(&mut self, ii: &'v ImplItemRef<'v>) {
|
||||
walk_impl_item_ref(self, ii)
|
||||
}
|
||||
|
@ -568,7 +591,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
|
|||
}
|
||||
ItemKind::ForeignMod(ref foreign_module) => {
|
||||
visitor.visit_id(item.hir_id);
|
||||
walk_list!(visitor, visit_foreign_item, foreign_module.items);
|
||||
walk_list!(visitor, visit_foreign_item_ref, foreign_module.items);
|
||||
}
|
||||
ItemKind::GlobalAsm(_) => {
|
||||
visitor.visit_id(item.hir_id);
|
||||
|
@ -1012,6 +1035,17 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
|
|||
}
|
||||
}
|
||||
|
||||
pub fn walk_foreign_item_ref<'v, V: Visitor<'v>>(
|
||||
visitor: &mut V,
|
||||
foreign_item_ref: &'v ForeignItemRef<'v>,
|
||||
) {
|
||||
// N.B., deliberately force a compilation error if/when new fields are added.
|
||||
let ForeignItemRef { id, ident, span: _, ref vis } = *foreign_item_ref;
|
||||
visitor.visit_nested_foreign_item(id);
|
||||
visitor.visit_ident(ident);
|
||||
visitor.visit_vis(vis);
|
||||
}
|
||||
|
||||
pub fn walk_impl_item_ref<'v, V: Visitor<'v>>(visitor: &mut V, impl_item_ref: &'v ImplItemRef<'v>) {
|
||||
// N.B., deliberately force a compilation error if/when new fields are added.
|
||||
let ImplItemRef { id, ident, ref kind, span: _, ref vis, ref defaultness } = *impl_item_ref;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue