]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/fold.rs
Rollup merge of #107777 - compiler-errors:derive_const-actually-derive-const, r=fee1...
[rust.git] / src / librustdoc / fold.rs
1 use crate::clean::*;
2
3 pub(crate) fn strip_item(mut item: Item) -> Item {
4     if !matches!(*item.kind, StrippedItem(..)) {
5         item.kind = Box::new(StrippedItem(item.kind));
6     }
7     item
8 }
9
10 pub(crate) trait DocFolder: Sized {
11     fn fold_item(&mut self, item: Item) -> Option<Item> {
12         Some(self.fold_item_recur(item))
13     }
14
15     /// don't override!
16     fn fold_inner_recur(&mut self, kind: ItemKind) -> ItemKind {
17         match kind {
18             StrippedItem(..) => unreachable!(),
19             ModuleItem(i) => ModuleItem(self.fold_mod(i)),
20             StructItem(mut i) => {
21                 i.fields = i.fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
22                 StructItem(i)
23             }
24             UnionItem(mut i) => {
25                 i.fields = i.fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
26                 UnionItem(i)
27             }
28             EnumItem(mut i) => {
29                 i.variants = i.variants.into_iter().filter_map(|x| self.fold_item(x)).collect();
30                 EnumItem(i)
31             }
32             TraitItem(mut i) => {
33                 i.items = i.items.into_iter().filter_map(|x| self.fold_item(x)).collect();
34                 TraitItem(i)
35             }
36             ImplItem(mut i) => {
37                 i.items = i.items.into_iter().filter_map(|x| self.fold_item(x)).collect();
38                 ImplItem(i)
39             }
40             VariantItem(Variant { kind, discriminant }) => {
41                 let kind = match kind {
42                     VariantKind::Struct(mut j) => {
43                         j.fields = j.fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
44                         VariantKind::Struct(j)
45                     }
46                     VariantKind::Tuple(fields) => {
47                         let fields = fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
48                         VariantKind::Tuple(fields)
49                     }
50                     VariantKind::CLike => VariantKind::CLike,
51                 };
52
53                 VariantItem(Variant { kind, discriminant })
54             }
55             ExternCrateItem { src: _ }
56             | ImportItem(_)
57             | FunctionItem(_)
58             | TypedefItem(_)
59             | OpaqueTyItem(_)
60             | StaticItem(_)
61             | ConstantItem(_)
62             | TraitAliasItem(_)
63             | TyMethodItem(_)
64             | MethodItem(_, _)
65             | StructFieldItem(_)
66             | ForeignFunctionItem(_)
67             | ForeignStaticItem(_)
68             | ForeignTypeItem
69             | MacroItem(_)
70             | ProcMacroItem(_)
71             | PrimitiveItem(_)
72             | TyAssocConstItem(..)
73             | AssocConstItem(..)
74             | TyAssocTypeItem(..)
75             | AssocTypeItem(..)
76             | KeywordItem => kind,
77         }
78     }
79
80     /// don't override!
81     fn fold_item_recur(&mut self, mut item: Item) -> Item {
82         item.kind = Box::new(match *item.kind {
83             StrippedItem(box i) => StrippedItem(Box::new(self.fold_inner_recur(i))),
84             _ => self.fold_inner_recur(*item.kind),
85         });
86         item
87     }
88
89     fn fold_mod(&mut self, m: Module) -> Module {
90         Module {
91             span: m.span,
92             items: m.items.into_iter().filter_map(|i| self.fold_item(i)).collect(),
93         }
94     }
95
96     fn fold_crate(&mut self, mut c: Crate) -> Crate {
97         c.module = self.fold_item(c.module).unwrap();
98
99         let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
100         for (k, mut v) in external_traits {
101             v.items = v.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
102             c.external_traits.borrow_mut().insert(k, v);
103         }
104
105         c
106     }
107 }