]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/visit.rs
Rollup merge of #96641 - oli-obk:bool_args, r=wesleywiser
[rust.git] / src / librustdoc / visit.rs
1 use crate::clean::*;
2
3 crate trait DocVisitor: Sized {
4     fn visit_item(&mut self, item: &Item) {
5         self.visit_item_recur(item)
6     }
7
8     /// don't override!
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             | TyAssocConstItem(..)
44             | AssocConstItem(..)
45             | TyAssocTypeItem(..)
46             | AssocTypeItem(..)
47             | KeywordItem(_) => {}
48         }
49     }
50
51     /// don't override!
52     fn visit_item_recur(&mut self, item: &Item) {
53         match &*item.kind {
54             StrippedItem(i) => self.visit_inner_recur(i),
55             _ => self.visit_inner_recur(&item.kind),
56         }
57     }
58
59     fn visit_mod(&mut self, m: &Module) {
60         m.items.iter().for_each(|i| self.visit_item(i))
61     }
62
63     fn visit_crate(&mut self, c: &Crate) {
64         self.visit_item(&c.module);
65
66         // FIXME: make this a simple by-ref for loop once external_traits is cleaned up
67         let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
68         for (k, v) in external_traits {
69             v.trait_.items.iter().for_each(|i| self.visit_item(i));
70             c.external_traits.borrow_mut().insert(k, v);
71         }
72     }
73 }