blob: 01e6cb4b93bfca46a0194ce75bcca330e96c6465 [file] [log] [blame]
use crate::clean::*;
pub(crate) trait DocVisitor: Sized {
fn visit_item(&mut self, item: &Item) {
self.visit_item_recur(item)
}
/// don't override!
fn visit_inner_recur(&mut self, kind: &ItemKind) {
match kind {
StrippedItem(..) => unreachable!(),
ModuleItem(i) => {
self.visit_mod(i);
}
StructItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
UnionItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
EnumItem(i) => i.variants.iter().for_each(|x| self.visit_item(x)),
TraitItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
ImplItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
VariantItem(i) => match &i.kind {
VariantKind::Struct(j) => j.fields.iter().for_each(|x| self.visit_item(x)),
VariantKind::Tuple(fields) => fields.iter().for_each(|x| self.visit_item(x)),
VariantKind::CLike => {}
},
ExternCrateItem { src: _ }
| ImportItem(_)
| FunctionItem(_)
| TypeAliasItem(_)
| OpaqueTyItem(_)
| StaticItem(_)
| ConstantItem(_)
| TraitAliasItem(_)
| TyMethodItem(_)
| MethodItem(_, _)
| StructFieldItem(_)
| ForeignFunctionItem(_)
| ForeignStaticItem(_)
| ForeignTypeItem
| MacroItem(_)
| ProcMacroItem(_)
| PrimitiveItem(_)
| TyAssocConstItem(..)
| AssocConstItem(..)
| TyAssocTypeItem(..)
| AssocTypeItem(..)
| KeywordItem => {}
}
}
/// don't override!
fn visit_item_recur(&mut self, item: &Item) {
match &*item.kind {
StrippedItem(i) => self.visit_inner_recur(i),
_ => self.visit_inner_recur(&item.kind),
}
}
fn visit_mod(&mut self, m: &Module) {
m.items.iter().for_each(|i| self.visit_item(i))
}
fn visit_crate(&mut self, c: &Crate) {
self.visit_item(&c.module);
// FIXME: make this a simple by-ref for loop once external_traits is cleaned up
let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
for (k, v) in external_traits {
v.items.iter().for_each(|i| self.visit_item(i));
c.external_traits.borrow_mut().insert(k, v);
}
}
}