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 ItemKind::Stripped(..) => unreachable!(),
18 ItemKind::Module(i) => {
19 self.visit_mod(i);
20 }
21 ItemKind::Struct(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
22 ItemKind::Union(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
23 ItemKind::Enum(i) => i.variants.iter().for_each(|x| self.visit_item(x)),
24 ItemKind::Trait(i) => i.items.iter().for_each(|x| self.visit_item(x)),
25 ItemKind::Impl(i) => i.items.iter().for_each(|x| self.visit_item(x)),
26 ItemKind::Variant(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 ItemKind::ExternCrate { src: _ }
32 | ItemKind::Import(_)
33 | ItemKind::Function(_)
34 | ItemKind::TypeAlias(_)
35 | ItemKind::Static(_)
36 | ItemKind::Constant(..)
37 | ItemKind::TraitAlias(_)
38 | ItemKind::AssocFunction(..)
39 | ItemKind::StructField(_)
40 | ItemKind::ForeignFunction(..)
41 | ItemKind::ForeignStatic(..)
42 | ItemKind::ForeignType
43 | ItemKind::DeclMacro(..)
44 | ItemKind::ProcMacro(_)
45 | ItemKind::PrimitiveType(_)
46 | ItemKind::AssocConstant(..)
47 | ItemKind::AssocType(..)
48 | ItemKind::Keyword
49 | ItemKind::Attribute
50 | ItemKind::PlaceholderImpl => {}
51 }
52 }
53
54 fn visit_item_recur(&mut self, item: &'a Item) {
56 self.visit_inner_recur(item.kind.unstripped())
57 }
58
59 fn visit_mod(&mut self, m: &'a Module) {
60 m.items.iter().for_each(|i| self.visit_item(i))
61 }
62
63 fn visit_crate(&mut self, c: &'a Crate) {
65 self.visit_item(&c.module);
66
67 for trait_ in c.external_traits.values() {
68 trait_.items.iter().for_each(|i| self.visit_item(i));
69 }
70 }
71}