1use crate::clean::*;
2
3pub(crate) trait DocVisitor<'a>: Sized {
10 fn visit_item(&mut self, item: &'a Item) {
11 self.visit_item_recur(item)
12 }
13
14 fn visit_inner_recur(&mut self, kind: &'a ItemKind) {
16 match kind {
17 StrippedItem(..) => unreachable!(),
18 ModuleItem(i) => {
19 self.visit_mod(i);
20 }
21 StructItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
22 UnionItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
23 EnumItem(i) => i.variants.iter().for_each(|x| self.visit_item(x)),
24 TraitItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
25 ImplItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
26 VariantItem(i) => match &i.kind {
27 VariantKind::Struct(j) => j.fields.iter().for_each(|x| self.visit_item(x)),
28 VariantKind::Tuple(fields) => fields.iter().for_each(|x| self.visit_item(x)),
29 VariantKind::CLike => {}
30 },
31 ExternCrateItem { src: _ }
32 | ImportItem(_)
33 | FunctionItem(_)
34 | TypeAliasItem(_)
35 | StaticItem(_)
36 | ConstantItem(..)
37 | TraitAliasItem(_)
38 | RequiredMethodItem(..)
39 | MethodItem(..)
40 | StructFieldItem(_)
41 | ForeignFunctionItem(..)
42 | ForeignStaticItem(..)
43 | ForeignTypeItem
44 | MacroItem(_)
45 | ProcMacroItem(_)
46 | PrimitiveItem(_)
47 | RequiredAssocConstItem(..)
48 | ProvidedAssocConstItem(..)
49 | ImplAssocConstItem(..)
50 | RequiredAssocTypeItem(..)
51 | AssocTypeItem(..)
52 | KeywordItem
53 | AttributeItem
54 | PlaceholderImplItem => {}
55 }
56 }
57
58 fn visit_item_recur(&mut self, item: &'a Item) {
60 match &item.kind {
61 StrippedItem(i) => self.visit_inner_recur(i),
62 _ => self.visit_inner_recur(&item.kind),
63 }
64 }
65
66 fn visit_mod(&mut self, m: &'a Module) {
67 m.items.iter().for_each(|i| self.visit_item(i))
68 }
69
70 fn visit_crate(&mut self, c: &'a Crate) {
72 self.visit_item(&c.module);
73
74 for trait_ in c.external_traits.values() {
75 trait_.items.iter().for_each(|i| self.visit_item(i));
76 }
77 }
78}