]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/visit.rs
Rollup merge of #107777 - compiler-errors:derive_const-actually-derive-const, r=fee1...
[rust.git] / src / librustdoc / visit.rs
1 use crate::clean::*;
2
3 pub(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             }
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!
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
58     fn visit_mod(&mut self, m: &Module) {
59         m.items.iter().for_each(|i| self.visit_item(i))
60     }
61
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 }