@@ -48,9 +48,9 @@ pub trait WalkItemKind {
48
48
pub trait MutVisitor : Sized {
49
49
// Methods in this trait have one of three forms:
50
50
//
51
- // fn visit_t(&mut self, t: &mut T); // common
52
- // fn flat_map_t (&mut self, t: T) -> SmallVec<[T; 1]>; // rare
53
- // fn filter_map_t (&mut self, t: T) -> Option<T>; // rarest
51
+ // fn visit_t(&mut self, t: &mut T);
52
+ // fn filter_map_t (&mut self, t: T) -> Option<T>;
53
+ // fn flat_map_t (&mut self, t: T) -> SmallVec<[T; 1]>;
54
54
//
55
55
// Any additions to this trait should happen in form of a call to a public
56
56
// `noop_*` function that only calls out to the visitor again, not other
@@ -119,8 +119,8 @@ pub trait MutVisitor: Sized {
119
119
walk_field_def ( self , fd) ;
120
120
}
121
121
122
- fn flat_map_field_def ( & mut self , fd : FieldDef ) -> SmallVec < [ FieldDef ; 1 ] > {
123
- walk_flat_map_field_def ( self , fd)
122
+ fn filter_map_field_def ( & mut self , fd : FieldDef ) -> Option < FieldDef > {
123
+ walk_filter_map_field_def ( self , fd)
124
124
}
125
125
126
126
fn visit_assoc_item ( & mut self , i : & mut P < AssocItem > , ctxt : AssocCtxt ) {
@@ -168,8 +168,8 @@ pub trait MutVisitor: Sized {
168
168
walk_arm ( self , arm) ;
169
169
}
170
170
171
- fn flat_map_arm ( & mut self , arm : Arm ) -> SmallVec < [ Arm ; 1 ] > {
172
- walk_flat_map_arm ( self , arm)
171
+ fn filter_map_arm ( & mut self , arm : Arm ) -> Option < Arm > {
172
+ walk_filter_map_arm ( self , arm)
173
173
}
174
174
175
175
fn visit_pat ( & mut self , p : & mut P < Pat > ) {
@@ -222,8 +222,8 @@ pub trait MutVisitor: Sized {
222
222
walk_variant ( self , v) ;
223
223
}
224
224
225
- fn flat_map_variant ( & mut self , v : Variant ) -> SmallVec < [ Variant ; 1 ] > {
226
- walk_flat_map_variant ( self , v)
225
+ fn filter_map_variant ( & mut self , v : Variant ) -> Option < Variant > {
226
+ walk_filter_map_variant ( self , v)
227
227
}
228
228
229
229
fn visit_ident ( & mut self , i : & mut Ident ) {
@@ -282,8 +282,8 @@ pub trait MutVisitor: Sized {
282
282
walk_param ( self , param) ;
283
283
}
284
284
285
- fn flat_map_param ( & mut self , param : Param ) -> SmallVec < [ Param ; 1 ] > {
286
- walk_flat_map_param ( self , param)
285
+ fn filter_map_param ( & mut self , param : Param ) -> Option < Param > {
286
+ walk_filter_map_param ( self , param)
287
287
}
288
288
289
289
fn visit_generics ( & mut self , generics : & mut Generics ) {
@@ -306,8 +306,8 @@ pub trait MutVisitor: Sized {
306
306
walk_generic_param ( self , param)
307
307
}
308
308
309
- fn flat_map_generic_param ( & mut self , param : GenericParam ) -> SmallVec < [ GenericParam ; 1 ] > {
310
- walk_flat_map_generic_param ( self , param)
309
+ fn filter_map_generic_param ( & mut self , param : GenericParam ) -> Option < GenericParam > {
310
+ walk_filter_map_generic_param ( self , param)
311
311
}
312
312
313
313
fn visit_param_bound ( & mut self , tpb : & mut GenericBound , _ctxt : BoundKind ) {
@@ -326,19 +326,19 @@ pub trait MutVisitor: Sized {
326
326
walk_expr_field ( self , f) ;
327
327
}
328
328
329
- fn flat_map_expr_field ( & mut self , f : ExprField ) -> SmallVec < [ ExprField ; 1 ] > {
330
- walk_flat_map_expr_field ( self , f)
329
+ fn filter_map_expr_field ( & mut self , f : ExprField ) -> Option < ExprField > {
330
+ walk_filter_map_expr_field ( self , f)
331
331
}
332
332
333
333
fn visit_where_clause ( & mut self , where_clause : & mut WhereClause ) {
334
334
walk_where_clause ( self , where_clause) ;
335
335
}
336
336
337
- fn flat_map_where_predicate (
337
+ fn filter_map_where_predicate (
338
338
& mut self ,
339
339
where_predicate : WherePredicate ,
340
- ) -> SmallVec < [ WherePredicate ; 1 ] > {
341
- walk_flat_map_where_predicate ( self , where_predicate)
340
+ ) -> Option < WherePredicate > {
341
+ walk_filter_map_where_predicate ( self , where_predicate)
342
342
}
343
343
344
344
fn visit_where_predicate_kind ( & mut self , kind : & mut WherePredicateKind ) {
@@ -363,8 +363,8 @@ pub trait MutVisitor: Sized {
363
363
walk_pat_field ( self , fp)
364
364
}
365
365
366
- fn flat_map_pat_field ( & mut self , fp : PatField ) -> SmallVec < [ PatField ; 1 ] > {
367
- walk_flat_map_pat_field ( self , fp)
366
+ fn filter_map_pat_field ( & mut self , fp : PatField ) -> Option < PatField > {
367
+ walk_filter_map_pat_field ( self , fp)
368
368
}
369
369
370
370
fn visit_inline_asm ( & mut self , asm : & mut InlineAsm ) {
@@ -400,6 +400,11 @@ pub fn visit_clobber<T: DummyAstNode>(t: &mut T, f: impl FnOnce(T) -> T) {
400
400
* t = f ( old_t) ;
401
401
}
402
402
403
+ pub fn visit_clobber_opt < T > ( t : & mut Option < T > , f : impl FnOnce ( T ) -> Option < T > ) {
404
+ let old_t = std:: mem:: replace ( t, None ) ;
405
+ * t = old_t. and_then ( |new_t| f ( new_t) ) ;
406
+ }
407
+
403
408
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
404
409
#[ inline]
405
410
fn visit_vec < T , F > ( elems : & mut Vec < T > , mut visit_elem : F )
@@ -485,12 +490,9 @@ pub fn walk_pat_field<T: MutVisitor>(vis: &mut T, fp: &mut PatField) {
485
490
vis. visit_span ( span) ;
486
491
}
487
492
488
- pub fn walk_flat_map_pat_field < T : MutVisitor > (
489
- vis : & mut T ,
490
- mut fp : PatField ,
491
- ) -> SmallVec < [ PatField ; 1 ] > {
493
+ pub fn walk_filter_map_pat_field < T : MutVisitor > ( vis : & mut T , mut fp : PatField ) -> Option < PatField > {
492
494
vis. visit_pat_field ( & mut fp) ;
493
- smallvec ! [ fp ]
495
+ Some ( fp )
494
496
}
495
497
496
498
fn walk_use_tree < T : MutVisitor > ( vis : & mut T , use_tree : & mut UseTree ) {
@@ -520,9 +522,9 @@ pub fn walk_arm<T: MutVisitor>(vis: &mut T, arm: &mut Arm) {
520
522
vis. visit_span ( span) ;
521
523
}
522
524
523
- pub fn walk_flat_map_arm < T : MutVisitor > ( vis : & mut T , mut arm : Arm ) -> SmallVec < [ Arm ; 1 ] > {
525
+ pub fn walk_filter_map_arm < T : MutVisitor > ( vis : & mut T , mut arm : Arm ) -> Option < Arm > {
524
526
vis. visit_arm ( & mut arm) ;
525
- smallvec ! [ arm]
527
+ Some ( arm)
526
528
}
527
529
528
530
fn walk_assoc_item_constraint < T : MutVisitor > (
@@ -560,13 +562,13 @@ pub fn walk_ty<T: MutVisitor>(vis: &mut T, ty: &mut P<Ty>) {
560
562
TyKind :: BareFn ( bft) => {
561
563
let BareFnTy { safety, ext : _, generic_params, decl, decl_span } = bft. deref_mut ( ) ;
562
564
visit_safety ( vis, safety) ;
563
- generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
565
+ generic_params. flat_map_in_place ( |param| vis. filter_map_generic_param ( param) ) ;
564
566
vis. visit_fn_decl ( decl) ;
565
567
vis. visit_span ( decl_span) ;
566
568
}
567
569
TyKind :: UnsafeBinder ( binder) => {
568
570
let UnsafeBinderTy { generic_params, inner_ty } = binder. deref_mut ( ) ;
569
- generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
571
+ generic_params. flat_map_in_place ( |param| vis. filter_map_generic_param ( param) ) ;
570
572
vis. visit_ty ( inner_ty) ;
571
573
}
572
574
TyKind :: Tup ( tys) => visit_thin_vec ( tys, |ty| vis. visit_ty ( ty) ) ,
@@ -627,12 +629,12 @@ pub fn walk_variant<T: MutVisitor>(visitor: &mut T, variant: &mut Variant) {
627
629
visitor. visit_span ( span) ;
628
630
}
629
631
630
- pub fn walk_flat_map_variant < T : MutVisitor > (
632
+ pub fn walk_filter_map_variant < T : MutVisitor > (
631
633
vis : & mut T ,
632
634
mut variant : Variant ,
633
- ) -> SmallVec < [ Variant ; 1 ] > {
635
+ ) -> Option < Variant > {
634
636
vis. visit_variant ( & mut variant) ;
635
- smallvec ! [ variant]
637
+ Some ( variant)
636
638
}
637
639
638
640
fn walk_ident < T : MutVisitor > ( vis : & mut T , Ident { name : _, span } : & mut Ident ) {
@@ -766,9 +768,9 @@ pub fn walk_param<T: MutVisitor>(vis: &mut T, param: &mut Param) {
766
768
vis. visit_span ( span) ;
767
769
}
768
770
769
- pub fn walk_flat_map_param < T : MutVisitor > ( vis : & mut T , mut param : Param ) -> SmallVec < [ Param ; 1 ] > {
771
+ pub fn walk_filter_map_param < T : MutVisitor > ( vis : & mut T , mut param : Param ) -> Option < Param > {
770
772
vis. visit_param ( & mut param) ;
771
- smallvec ! [ param]
773
+ Some ( param)
772
774
}
773
775
774
776
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
@@ -791,7 +793,7 @@ fn walk_closure_binder<T: MutVisitor>(vis: &mut T, binder: &mut ClosureBinder) {
791
793
match binder {
792
794
ClosureBinder :: NotPresent => { }
793
795
ClosureBinder :: For { span : _, generic_params } => {
794
- generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
796
+ generic_params. flat_map_in_place ( |param| vis. filter_map_generic_param ( param) ) ;
795
797
}
796
798
}
797
799
}
@@ -860,7 +862,7 @@ fn walk_contract<T: MutVisitor>(vis: &mut T, contract: &mut P<FnContract>) {
860
862
861
863
fn walk_fn_decl < T : MutVisitor > ( vis : & mut T , decl : & mut P < FnDecl > ) {
862
864
let FnDecl { inputs, output } = decl. deref_mut ( ) ;
863
- inputs. flat_map_in_place ( |param| vis. flat_map_param ( param) ) ;
865
+ inputs. flat_map_in_place ( |param| vis. filter_map_param ( param) ) ;
864
866
vis. visit_fn_ret_ty ( output) ;
865
867
}
866
868
@@ -917,17 +919,17 @@ pub fn walk_generic_param<T: MutVisitor>(vis: &mut T, param: &mut GenericParam)
917
919
}
918
920
}
919
921
920
- pub fn walk_flat_map_generic_param < T : MutVisitor > (
922
+ pub fn walk_filter_map_generic_param < T : MutVisitor > (
921
923
vis : & mut T ,
922
924
mut param : GenericParam ,
923
- ) -> SmallVec < [ GenericParam ; 1 ] > {
925
+ ) -> Option < GenericParam > {
924
926
vis. visit_generic_param ( & mut param) ;
925
- smallvec ! [ param]
927
+ Some ( param)
926
928
}
927
929
928
930
fn walk_generics < T : MutVisitor > ( vis : & mut T , generics : & mut Generics ) {
929
931
let Generics { params, where_clause, span } = generics;
930
- params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
932
+ params. flat_map_in_place ( |param| vis. filter_map_generic_param ( param) ) ;
931
933
vis. visit_where_clause ( where_clause) ;
932
934
vis. visit_span ( span) ;
933
935
}
@@ -942,27 +944,27 @@ fn walk_ty_alias_where_clauses<T: MutVisitor>(vis: &mut T, tawcs: &mut TyAliasWh
942
944
943
945
fn walk_where_clause < T : MutVisitor > ( vis : & mut T , wc : & mut WhereClause ) {
944
946
let WhereClause { has_where_token : _, predicates, span } = wc;
945
- predicates. flat_map_in_place ( |predicate| vis. flat_map_where_predicate ( predicate) ) ;
947
+ predicates. flat_map_in_place ( |predicate| vis. filter_map_where_predicate ( predicate) ) ;
946
948
vis. visit_span ( span) ;
947
949
}
948
950
949
- pub fn walk_flat_map_where_predicate < T : MutVisitor > (
951
+ pub fn walk_filter_map_where_predicate < T : MutVisitor > (
950
952
vis : & mut T ,
951
953
mut pred : WherePredicate ,
952
- ) -> SmallVec < [ WherePredicate ; 1 ] > {
954
+ ) -> Option < WherePredicate > {
953
955
let WherePredicate { attrs, kind, id, span, is_placeholder : _ } = & mut pred;
954
956
vis. visit_id ( id) ;
955
957
visit_attrs ( vis, attrs) ;
956
958
vis. visit_where_predicate_kind ( kind) ;
957
959
vis. visit_span ( span) ;
958
- smallvec ! [ pred]
960
+ Some ( pred)
959
961
}
960
962
961
963
pub fn walk_where_predicate_kind < T : MutVisitor > ( vis : & mut T , kind : & mut WherePredicateKind ) {
962
964
match kind {
963
965
WherePredicateKind :: BoundPredicate ( bp) => {
964
966
let WhereBoundPredicate { bound_generic_params, bounded_ty, bounds } = bp;
965
- bound_generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
967
+ bound_generic_params. flat_map_in_place ( |param| vis. filter_map_generic_param ( param) ) ;
966
968
vis. visit_ty ( bounded_ty) ;
967
969
visit_vec ( bounds, |bound| vis. visit_param_bound ( bound, BoundKind :: Bound ) ) ;
968
970
}
@@ -982,11 +984,11 @@ pub fn walk_where_predicate_kind<T: MutVisitor>(vis: &mut T, kind: &mut WherePre
982
984
fn walk_variant_data < T : MutVisitor > ( vis : & mut T , vdata : & mut VariantData ) {
983
985
match vdata {
984
986
VariantData :: Struct { fields, recovered : _ } => {
985
- fields. flat_map_in_place ( |field| vis. flat_map_field_def ( field) ) ;
987
+ fields. flat_map_in_place ( |field| vis. filter_map_field_def ( field) ) ;
986
988
}
987
989
VariantData :: Tuple ( fields, id) => {
988
990
vis. visit_id ( id) ;
989
- fields. flat_map_in_place ( |field| vis. flat_map_field_def ( field) ) ;
991
+ fields. flat_map_in_place ( |field| vis. filter_map_field_def ( field) ) ;
990
992
}
991
993
VariantData :: Unit ( id) => vis. visit_id ( id) ,
992
994
}
@@ -1000,7 +1002,7 @@ fn walk_trait_ref<T: MutVisitor>(vis: &mut T, TraitRef { path, ref_id }: &mut Tr
1000
1002
fn walk_poly_trait_ref < T : MutVisitor > ( vis : & mut T , p : & mut PolyTraitRef ) {
1001
1003
let PolyTraitRef { bound_generic_params, modifiers, trait_ref, span } = p;
1002
1004
vis. visit_modifiers ( modifiers) ;
1003
- bound_generic_params. flat_map_in_place ( |param| vis. flat_map_generic_param ( param) ) ;
1005
+ bound_generic_params. flat_map_in_place ( |param| vis. filter_map_generic_param ( param) ) ;
1004
1006
vis. visit_trait_ref ( trait_ref) ;
1005
1007
vis. visit_span ( span) ;
1006
1008
}
@@ -1033,12 +1035,9 @@ pub fn walk_field_def<T: MutVisitor>(visitor: &mut T, fd: &mut FieldDef) {
1033
1035
visitor. visit_span ( span) ;
1034
1036
}
1035
1037
1036
- pub fn walk_flat_map_field_def < T : MutVisitor > (
1037
- vis : & mut T ,
1038
- mut fd : FieldDef ,
1039
- ) -> SmallVec < [ FieldDef ; 1 ] > {
1038
+ pub fn walk_filter_map_field_def < T : MutVisitor > ( vis : & mut T , mut fd : FieldDef ) -> Option < FieldDef > {
1040
1039
vis. visit_field_def ( & mut fd) ;
1041
- smallvec ! [ fd ]
1040
+ Some ( fd )
1042
1041
}
1043
1042
1044
1043
pub fn walk_expr_field < T : MutVisitor > ( vis : & mut T , f : & mut ExprField ) {
@@ -1050,12 +1049,12 @@ pub fn walk_expr_field<T: MutVisitor>(vis: &mut T, f: &mut ExprField) {
1050
1049
vis. visit_span ( span) ;
1051
1050
}
1052
1051
1053
- pub fn walk_flat_map_expr_field < T : MutVisitor > (
1052
+ pub fn walk_filter_map_expr_field < T : MutVisitor > (
1054
1053
vis : & mut T ,
1055
1054
mut f : ExprField ,
1056
- ) -> SmallVec < [ ExprField ; 1 ] > {
1055
+ ) -> Option < ExprField > {
1057
1056
vis. visit_expr_field ( & mut f) ;
1058
- smallvec ! [ f ]
1057
+ Some ( f )
1059
1058
}
1060
1059
1061
1060
fn walk_mt < T : MutVisitor > ( vis : & mut T , MutTy { ty, mutbl : _ } : & mut MutTy ) {
@@ -1149,7 +1148,7 @@ impl WalkItemKind for ItemKind {
1149
1148
ItemKind :: Enum ( ident, EnumDef { variants } , generics) => {
1150
1149
vis. visit_ident ( ident) ;
1151
1150
vis. visit_generics ( generics) ;
1152
- variants. flat_map_in_place ( |variant| vis. flat_map_variant ( variant) ) ;
1151
+ variants. flat_map_in_place ( |variant| vis. filter_map_variant ( variant) ) ;
1153
1152
}
1154
1153
ItemKind :: Struct ( ident, variant_data, generics)
1155
1154
| ItemKind :: Union ( ident, variant_data, generics) => {
@@ -1439,7 +1438,7 @@ pub fn walk_pat<T: MutVisitor>(vis: &mut T, pat: &mut P<Pat>) {
1439
1438
PatKind :: Struct ( qself, path, fields, _etc) => {
1440
1439
vis. visit_qself ( qself) ;
1441
1440
vis. visit_path ( path) ;
1442
- fields. flat_map_in_place ( |field| vis. flat_map_pat_field ( field) ) ;
1441
+ fields. flat_map_in_place ( |field| vis. filter_map_pat_field ( field) ) ;
1443
1442
}
1444
1443
PatKind :: Box ( inner) => vis. visit_pat ( inner) ,
1445
1444
PatKind :: Deref ( inner) => vis. visit_pat ( inner) ,
@@ -1595,7 +1594,7 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1595
1594
}
1596
1595
ExprKind :: Match ( expr, arms, _kind) => {
1597
1596
vis. visit_expr ( expr) ;
1598
- arms. flat_map_in_place ( |arm| vis. flat_map_arm ( arm) ) ;
1597
+ arms. flat_map_in_place ( |arm| vis. filter_map_arm ( arm) ) ;
1599
1598
}
1600
1599
ExprKind :: Closure ( box Closure {
1601
1600
binder,
@@ -1684,7 +1683,7 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1684
1683
let StructExpr { qself, path, fields, rest } = se. deref_mut ( ) ;
1685
1684
vis. visit_qself ( qself) ;
1686
1685
vis. visit_path ( path) ;
1687
- fields. flat_map_in_place ( |field| vis. flat_map_expr_field ( field) ) ;
1686
+ fields. flat_map_in_place ( |field| vis. filter_map_expr_field ( field) ) ;
1688
1687
match rest {
1689
1688
StructRest :: Base ( expr) => vis. visit_expr ( expr) ,
1690
1689
StructRest :: Rest ( _span) => { }
@@ -1717,10 +1716,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1717
1716
}
1718
1717
1719
1718
pub fn noop_filter_map_expr < T : MutVisitor > ( vis : & mut T , mut e : P < Expr > ) -> Option < P < Expr > > {
1720
- Some ( {
1721
- vis. visit_expr ( & mut e) ;
1722
- e
1723
- } )
1719
+ vis. visit_expr ( & mut e) ;
1720
+ Some ( e)
1724
1721
}
1725
1722
1726
1723
pub fn walk_flat_map_stmt < T : MutVisitor > (
0 commit comments