]>
Commit | Line | Data |
---|---|---|
9fa01778 | 1 | use crate::clean::*; |
54a0048b | 2 | |
17df50a5 XL |
3 | crate fn strip_item(mut item: Item) -> Item { |
4 | if !matches!(*item.kind, StrippedItem(..)) { | |
5 | item.kind = box StrippedItem(item.kind); | |
54a0048b | 6 | } |
17df50a5 | 7 | item |
54a0048b | 8 | } |
1a4d82fc | 9 | |
fc512014 | 10 | crate trait DocFolder: Sized { |
1a4d82fc | 11 | fn fold_item(&mut self, item: Item) -> Option<Item> { |
fc512014 | 12 | Some(self.fold_item_recur(item)) |
1a4d82fc JJ |
13 | } |
14 | ||
15 | /// don't override! | |
fc512014 XL |
16 | fn fold_inner_recur(&mut self, kind: ItemKind) -> ItemKind { |
17 | match kind { | |
54a0048b | 18 | StrippedItem(..) => unreachable!(), |
dfeec247 | 19 | ModuleItem(i) => ModuleItem(self.fold_mod(i)), |
54a0048b SL |
20 | StructItem(mut i) => { |
21 | let num_fields = i.fields.len(); | |
22 | i.fields = i.fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); | |
dfeec247 XL |
23 | i.fields_stripped |= |
24 | num_fields != i.fields.len() || i.fields.iter().any(|f| f.is_stripped()); | |
54a0048b | 25 | StructItem(i) |
dfeec247 | 26 | } |
9e0c209e SL |
27 | UnionItem(mut i) => { |
28 | let num_fields = i.fields.len(); | |
29 | i.fields = i.fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); | |
dfeec247 XL |
30 | i.fields_stripped |= |
31 | num_fields != i.fields.len() || i.fields.iter().any(|f| f.is_stripped()); | |
9e0c209e | 32 | UnionItem(i) |
dfeec247 | 33 | } |
1a4d82fc | 34 | EnumItem(mut i) => { |
54a0048b SL |
35 | let num_variants = i.variants.len(); |
36 | i.variants = i.variants.into_iter().filter_map(|x| self.fold_item(x)).collect(); | |
dfeec247 XL |
37 | i.variants_stripped |= |
38 | num_variants != i.variants.len() || i.variants.iter().any(|f| f.is_stripped()); | |
1a4d82fc | 39 | EnumItem(i) |
dfeec247 | 40 | } |
1a4d82fc | 41 | TraitItem(mut i) => { |
54a0048b | 42 | i.items = i.items.into_iter().filter_map(|x| self.fold_item(x)).collect(); |
1a4d82fc | 43 | TraitItem(i) |
dfeec247 | 44 | } |
1a4d82fc | 45 | ImplItem(mut i) => { |
54a0048b | 46 | i.items = i.items.into_iter().filter_map(|x| self.fold_item(x)).collect(); |
1a4d82fc | 47 | ImplItem(i) |
dfeec247 | 48 | } |
1a4d82fc JJ |
49 | VariantItem(i) => { |
50 | let i2 = i.clone(); // this clone is small | |
5869c6ff XL |
51 | match i { |
52 | Variant::Struct(mut j) => { | |
54a0048b SL |
53 | let num_fields = j.fields.len(); |
54 | j.fields = j.fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); | |
dfeec247 XL |
55 | j.fields_stripped |= num_fields != j.fields.len() |
56 | || j.fields.iter().any(|f| f.is_stripped()); | |
5869c6ff | 57 | VariantItem(Variant::Struct(j)) |
dfeec247 XL |
58 | } |
59 | _ => VariantItem(i2), | |
1a4d82fc | 60 | } |
dfeec247 XL |
61 | } |
62 | x => x, | |
54a0048b SL |
63 | } |
64 | } | |
65 | ||
66 | /// don't override! | |
fc512014 | 67 | fn fold_item_recur(&mut self, mut item: Item) -> Item { |
5869c6ff | 68 | item.kind = box match *item.kind { |
54a0048b | 69 | StrippedItem(box i) => StrippedItem(box self.fold_inner_recur(i)), |
5869c6ff | 70 | _ => self.fold_inner_recur(*item.kind), |
1a4d82fc | 71 | }; |
fc512014 | 72 | item |
1a4d82fc JJ |
73 | } |
74 | ||
75 | fn fold_mod(&mut self, m: Module) -> Module { | |
76 | Module { | |
cdc7bbd5 | 77 | span: m.span, |
dfeec247 | 78 | items: m.items.into_iter().filter_map(|i| self.fold_item(i)).collect(), |
223e47cc LB |
79 | } |
80 | } | |
223e47cc | 81 | |
1a4d82fc | 82 | fn fold_crate(&mut self, mut c: Crate) -> Crate { |
cdc7bbd5 | 83 | c.module = self.fold_item(c.module).unwrap(); |
54a0048b | 84 | |
0bf4aa26 | 85 | { |
1b1a35ee XL |
86 | let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) }; |
87 | for (k, mut v) in external_traits { | |
6a06907d XL |
88 | v.trait_.items = |
89 | v.trait_.items.into_iter().filter_map(|i| self.fold_item(i)).collect(); | |
1b1a35ee XL |
90 | c.external_traits.borrow_mut().insert(k, v); |
91 | } | |
0bf4aa26 | 92 | } |
54a0048b | 93 | c |
223e47cc LB |
94 | } |
95 | } |