1 use crate::clean::*; 2 3 pub(crate) trait DocVisitor: Sized { visit_item(&mut self, item: &Item)4 fn visit_item(&mut self, item: &Item) { 5 self.visit_item_recur(item) 6 } 7 8 /// don't override! visit_inner_recur(&mut self, kind: &ItemKind)9 fn visit_inner_recur(&mut self, kind: &ItemKind) { 10 match kind { 11 StrippedItem(..) => unreachable!(), 12 ModuleItem(i) => { 13 self.visit_mod(i); 14 } 15 StructItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)), 16 UnionItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)), 17 EnumItem(i) => i.variants.iter().for_each(|x| self.visit_item(x)), 18 TraitItem(i) => i.items.iter().for_each(|x| self.visit_item(x)), 19 ImplItem(i) => i.items.iter().for_each(|x| self.visit_item(x)), 20 VariantItem(i) => match &i.kind { 21 VariantKind::Struct(j) => j.fields.iter().for_each(|x| self.visit_item(x)), 22 VariantKind::Tuple(fields) => fields.iter().for_each(|x| self.visit_item(x)), 23 VariantKind::CLike => {} 24 }, 25 ExternCrateItem { src: _ } 26 | ImportItem(_) 27 | FunctionItem(_) 28 | TypedefItem(_) 29 | OpaqueTyItem(_) 30 | StaticItem(_) 31 | ConstantItem(_) 32 | TraitAliasItem(_) 33 | TyMethodItem(_) 34 | MethodItem(_, _) 35 | StructFieldItem(_) 36 | ForeignFunctionItem(_) 37 | ForeignStaticItem(_) 38 | ForeignTypeItem 39 | MacroItem(_) 40 | ProcMacroItem(_) 41 | PrimitiveItem(_) 42 | TyAssocConstItem(..) 43 | AssocConstItem(..) 44 | TyAssocTypeItem(..) 45 | AssocTypeItem(..) 46 | KeywordItem => {} 47 } 48 } 49 50 /// don't override! visit_item_recur(&mut self, item: &Item)51 fn visit_item_recur(&mut self, item: &Item) { 52 match &*item.kind { 53 StrippedItem(i) => self.visit_inner_recur(i), 54 _ => self.visit_inner_recur(&item.kind), 55 } 56 } 57 visit_mod(&mut self, m: &Module)58 fn visit_mod(&mut self, m: &Module) { 59 m.items.iter().for_each(|i| self.visit_item(i)) 60 } 61 visit_crate(&mut self, c: &Crate)62 fn visit_crate(&mut self, c: &Crate) { 63 self.visit_item(&c.module); 64 65 // FIXME: make this a simple by-ref for loop once external_traits is cleaned up 66 let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) }; 67 for (k, v) in external_traits { 68 v.items.iter().for_each(|i| self.visit_item(i)); 69 c.external_traits.borrow_mut().insert(k, v); 70 } 71 } 72 } 73