File tree 3 files changed +25
-4
lines changed
3 files changed +25
-4
lines changed Original file line number Diff line number Diff line change @@ -95,6 +95,16 @@ impl Annotatable {
95
95
_ => panic ! ( "expected Item" )
96
96
}
97
97
}
98
+
99
+ pub fn fold_with < F : Folder > ( self , folder : & mut F ) -> SmallVector < Self > {
100
+ match self {
101
+ Annotatable :: Item ( item) => folder. fold_item ( item) . map ( Annotatable :: Item ) ,
102
+ Annotatable :: ImplItem ( item) =>
103
+ folder. fold_impl_item ( item. unwrap ( ) ) . map ( |item| Annotatable :: ImplItem ( P ( item) ) ) ,
104
+ Annotatable :: TraitItem ( item) =>
105
+ folder. fold_trait_item ( item. unwrap ( ) ) . map ( |item| Annotatable :: TraitItem ( P ( item) ) ) ,
106
+ }
107
+ }
98
108
}
99
109
100
110
// A more flexible ItemDecorator.
Original file line number Diff line number Diff line change @@ -839,16 +839,18 @@ fn expand_decorators(a: Annotatable,
839
839
}
840
840
} ) ;
841
841
842
- // we'd ideally decorator_items.push_all(expand_annotatable(ann, fld)),
843
- // but that double-mut-borrows fld
844
842
let mut items: SmallVector < Annotatable > = SmallVector :: zero ( ) ;
845
843
dec. expand ( fld. cx ,
846
844
attr. span ,
847
845
& attr. node . value ,
848
846
& a,
849
847
& mut |ann| items. push ( ann) ) ;
850
- decorator_items. extend ( items. into_iter ( )
851
- . flat_map ( |ann| expand_annotatable ( ann, fld) . into_iter ( ) ) ) ;
848
+
849
+ for item in items {
850
+ for configured_item in item. fold_with ( & mut fld. strip_unconfigured ( ) ) {
851
+ decorator_items. extend ( expand_annotatable ( configured_item, fld) ) ;
852
+ }
853
+ }
852
854
853
855
fld. cx . bt_pop ( ) ;
854
856
}
Original file line number Diff line number Diff line change @@ -136,6 +136,15 @@ impl<T> SmallVector<T> {
136
136
}
137
137
138
138
pub fn is_empty ( & self ) -> bool { self . len ( ) == 0 }
139
+
140
+ pub fn map < U , F : FnMut ( T ) -> U > ( self , mut f : F ) -> SmallVector < U > {
141
+ let repr = match self . repr {
142
+ Zero => Zero ,
143
+ One ( t) => One ( f ( t) ) ,
144
+ Many ( vec) => Many ( vec. into_iter ( ) . map ( f) . collect ( ) ) ,
145
+ } ;
146
+ SmallVector { repr : repr }
147
+ }
139
148
}
140
149
141
150
impl < T > IntoIterator for SmallVector < T > {
You can’t perform that action at this time.
0 commit comments