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