1010
1111use clean:: * ;
1212
13+ pub enum FoldItem {
14+ Retain ( Item ) ,
15+ Strip ( Item ) ,
16+ Erase ,
17+ }
18+
19+ impl FoldItem {
20+ pub fn fold ( self ) -> Option < Item > {
21+ match self {
22+ FoldItem :: Erase => None ,
23+ FoldItem :: Retain ( i) => Some ( i) ,
24+ FoldItem :: Strip ( item@ Item { inner : StrippedItem ( ..) , .. } ) => Some ( item) ,
25+ FoldItem :: Strip ( mut i) => {
26+ i. inner = StrippedItem ( box i. inner ) ;
27+ Some ( i)
28+ }
29+ }
30+ }
31+ }
32+
1333pub trait DocFolder : Sized {
1434 fn fold_item ( & mut self , item : Item ) -> Option < Item > {
1535 self . fold_item_recur ( item)
1636 }
1737
1838 /// don't override!
19- fn fold_item_recur ( & mut self , item : Item ) -> Option < Item > {
20- let Item { attrs, name, source, visibility, def_id, inner, stability, deprecation } = item;
21- let inner = match inner {
39+ fn fold_inner_recur ( & mut self , inner : ItemEnum ) -> ItemEnum {
40+ match inner {
41+ StrippedItem ( ..) => unreachable ! ( ) ,
42+ ModuleItem ( i) => {
43+ ModuleItem ( self . fold_mod ( i) )
44+ } ,
2245 StructItem ( mut i) => {
2346 let num_fields = i. fields . len ( ) ;
2447 i. fields = i. fields . into_iter ( ) . filter_map ( |x| self . fold_item ( x) ) . collect ( ) ;
25- i. fields_stripped |= num_fields != i. fields . len ( ) ;
48+ i. fields_stripped |= num_fields != i. fields . len ( ) ||
49+ i. fields . iter ( ) . any ( |f| f. is_stripped ( ) ) ;
2650 StructItem ( i)
2751 } ,
28- ModuleItem ( i) => {
29- ModuleItem ( self . fold_mod ( i) )
30- } ,
3152 EnumItem ( mut i) => {
3253 let num_variants = i. variants . len ( ) ;
3354 i. variants = i. variants . into_iter ( ) . filter_map ( |x| self . fold_item ( x) ) . collect ( ) ;
34- i. variants_stripped |= num_variants != i. variants . len ( ) ;
55+ i. variants_stripped |= num_variants != i. variants . len ( ) ||
56+ i. variants . iter ( ) . any ( |f| f. is_stripped ( ) ) ;
3557 EnumItem ( i)
3658 } ,
3759 TraitItem ( mut i) => {
@@ -48,13 +70,24 @@ pub trait DocFolder : Sized {
4870 StructVariant ( mut j) => {
4971 let num_fields = j. fields . len ( ) ;
5072 j. fields = j. fields . into_iter ( ) . filter_map ( |x| self . fold_item ( x) ) . collect ( ) ;
51- j. fields_stripped |= num_fields != j. fields . len ( ) ;
73+ j. fields_stripped |= num_fields != j. fields . len ( ) ||
74+ j. fields . iter ( ) . any ( |f| f. is_stripped ( ) ) ;
5275 VariantItem ( Variant { kind : StructVariant ( j) , ..i2} )
5376 } ,
5477 _ => VariantItem ( i2)
5578 }
5679 } ,
5780 x => x
81+ }
82+ }
83+
84+ /// don't override!
85+ fn fold_item_recur ( & mut self , item : Item ) -> Option < Item > {
86+ let Item { attrs, name, source, visibility, def_id, inner, stability, deprecation } = item;
87+
88+ let inner = match inner {
89+ StrippedItem ( box i) => StrippedItem ( box self . fold_inner_recur ( i) ) ,
90+ _ => self . fold_inner_recur ( inner) ,
5891 } ;
5992
6093 Some ( Item { attrs : attrs, name : name, source : source, inner : inner,
@@ -70,9 +103,8 @@ pub trait DocFolder : Sized {
70103 }
71104
72105 fn fold_crate ( & mut self , mut c : Crate ) -> Crate {
73- c. module = c. module . and_then ( |module| {
74- self . fold_item ( module)
75- } ) ;
106+ c. module = c. module . and_then ( |module| self . fold_item ( module) ) ;
107+
76108 c. external_traits = c. external_traits . into_iter ( ) . map ( |( k, mut v) | {
77109 v. items = v. items . into_iter ( ) . filter_map ( |i| self . fold_item ( i) ) . collect ( ) ;
78110 ( k, v)
0 commit comments