]>
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(..)) { | |
94222f64 | 5 | item.kind = Box::new(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 | 58 | } |
94222f64 XL |
59 | Variant::Tuple(fields) => { |
60 | let fields = fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); | |
61 | VariantItem(Variant::Tuple(fields)) | |
62 | } | |
dfeec247 | 63 | _ => VariantItem(i2), |
1a4d82fc | 64 | } |
dfeec247 XL |
65 | } |
66 | x => x, | |
54a0048b SL |
67 | } |
68 | } | |
69 | ||
70 | /// don't override! | |
fc512014 | 71 | fn fold_item_recur(&mut self, mut item: Item) -> Item { |
94222f64 XL |
72 | item.kind = Box::new(match *item.kind { |
73 | StrippedItem(box i) => StrippedItem(Box::new(self.fold_inner_recur(i))), | |
5869c6ff | 74 | _ => self.fold_inner_recur(*item.kind), |
94222f64 | 75 | }); |
fc512014 | 76 | item |
1a4d82fc JJ |
77 | } |
78 | ||
79 | fn fold_mod(&mut self, m: Module) -> Module { | |
80 | Module { | |
cdc7bbd5 | 81 | span: m.span, |
dfeec247 | 82 | items: m.items.into_iter().filter_map(|i| self.fold_item(i)).collect(), |
223e47cc LB |
83 | } |
84 | } | |
223e47cc | 85 | |
1a4d82fc | 86 | fn fold_crate(&mut self, mut c: Crate) -> Crate { |
cdc7bbd5 | 87 | c.module = self.fold_item(c.module).unwrap(); |
54a0048b | 88 | |
0bf4aa26 | 89 | { |
1b1a35ee XL |
90 | let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) }; |
91 | for (k, mut v) in external_traits { | |
6a06907d XL |
92 | v.trait_.items = |
93 | v.trait_.items.into_iter().filter_map(|i| self.fold_item(i)).collect(); | |
1b1a35ee XL |
94 | c.external_traits.borrow_mut().insert(k, v); |
95 | } | |
0bf4aa26 | 96 | } |
54a0048b | 97 | c |
223e47cc LB |
98 | } |
99 | } |