@@ -12,14 +12,19 @@ use std::panic;
1212
1313use  rustc_data_structures:: flat_map_in_place:: FlatMapInPlace ; 
1414use  rustc_span:: source_map:: Spanned ; 
15- use  rustc_span:: { Ident ,  Span } ; 
15+ use  rustc_span:: { Ident ,  Span ,   Symbol } ; 
1616use  smallvec:: { SmallVec ,  smallvec} ; 
1717use  thin_vec:: ThinVec ; 
1818
1919use  crate :: ast:: * ; 
2020use  crate :: ptr:: P ; 
2121use  crate :: tokenstream:: * ; 
22- use  crate :: visit:: { AssocCtxt ,  BoundKind ,  FnCtxt ,  VisitorResult ,  try_visit,  visit_opt,  walk_list} ; 
22+ use  crate :: visit:: { AssocCtxt ,  BoundKind ,  FnCtxt ,  LifetimeCtxt ,  VisitorResult ,  try_visit} ; 
23+ use  crate :: { 
24+     define_named_walk,  impl_visitable,  impl_visitable_calling,  impl_visitable_calling_walkable, 
25+     impl_visitable_direct,  impl_visitable_list,  impl_visitable_noop,  impl_walkable, 
26+     visit_visitable,  visit_visitable_with,  walk_walkable, 
27+ } ; 
2328
2429mod  sealed { 
2530    use  rustc_ast_ir:: visit:: VisitorResult ; 
@@ -36,11 +41,144 @@ mod sealed {
3641
3742use  sealed:: MutVisitorResult ; 
3843
44+ pub ( crate )  trait  MutVisitable < V :  MutVisitor >  { 
45+     type  Extra :  Copy ; 
46+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra ) ; 
47+ } 
48+ 
49+ impl < V :  MutVisitor ,  T :  ?Sized >  MutVisitable < V >  for  P < T > 
50+ where 
51+     T :  MutVisitable < V > , 
52+ { 
53+     type  Extra  = T :: Extra ; 
54+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
55+         ( * * self ) . visit_mut ( visitor,  extra) 
56+     } 
57+ } 
58+ 
59+ impl < V :  MutVisitor ,  T >  MutVisitable < V >  for  Option < T > 
60+ where 
61+     T :  MutVisitable < V > , 
62+ { 
63+     type  Extra  = T :: Extra ; 
64+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
65+         if  let  Some ( this)  = self  { 
66+             this. visit_mut ( visitor,  extra) 
67+         } 
68+     } 
69+ } 
70+ 
71+ impl < V :  MutVisitor ,  T >  MutVisitable < V >  for  Spanned < T > 
72+ where 
73+     T :  MutVisitable < V > , 
74+ { 
75+     type  Extra  = T :: Extra ; 
76+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
77+         let  Spanned  {  span,  node }  = self ; 
78+         span. visit_mut ( visitor,  ( ) ) ; 
79+         node. visit_mut ( visitor,  extra) ; 
80+     } 
81+ } 
82+ 
83+ impl < V :  MutVisitor ,  T >  MutVisitable < V >  for  [ T ] 
84+ where 
85+     T :  MutVisitable < V > , 
86+ { 
87+     type  Extra  = T :: Extra ; 
88+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
89+         for  item in  self  { 
90+             item. visit_mut ( visitor,  extra) ; 
91+         } 
92+     } 
93+ } 
94+ 
95+ impl < V :  MutVisitor ,  T >  MutVisitable < V >  for  Vec < T > 
96+ where 
97+     T :  MutVisitable < V > , 
98+ { 
99+     type  Extra  = T :: Extra ; 
100+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
101+         for  item in  self  { 
102+             item. visit_mut ( visitor,  extra) ; 
103+         } 
104+     } 
105+ } 
106+ 
107+ impl < V :  MutVisitor ,  T >  MutVisitable < V >  for  ( T , ) 
108+ where 
109+     T :  MutVisitable < V > , 
110+ { 
111+     type  Extra  = T :: Extra ; 
112+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
113+         self . 0 . visit_mut ( visitor,  extra) ; 
114+     } 
115+ } 
116+ 
117+ impl < V :  MutVisitor ,  T1 ,  T2 >  MutVisitable < V >  for  ( T1 ,  T2 ) 
118+ where 
119+     T1 :  MutVisitable < V ,  Extra  = ( ) > , 
120+     T2 :  MutVisitable < V ,  Extra  = ( ) > , 
121+ { 
122+     type  Extra  = ( ) ; 
123+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
124+         self . 0 . visit_mut ( visitor,  extra) ; 
125+         self . 1 . visit_mut ( visitor,  extra) ; 
126+     } 
127+ } 
128+ 
129+ impl < V :  MutVisitor ,  T1 ,  T2 ,  T3 >  MutVisitable < V >  for  ( T1 ,  T2 ,  T3 ) 
130+ where 
131+     T1 :  MutVisitable < V ,  Extra  = ( ) > , 
132+     T2 :  MutVisitable < V ,  Extra  = ( ) > , 
133+     T3 :  MutVisitable < V ,  Extra  = ( ) > , 
134+ { 
135+     type  Extra  = ( ) ; 
136+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
137+         self . 0 . visit_mut ( visitor,  extra) ; 
138+         self . 1 . visit_mut ( visitor,  extra) ; 
139+         self . 2 . visit_mut ( visitor,  extra) ; 
140+     } 
141+ } 
142+ 
143+ impl < V :  MutVisitor ,  T1 ,  T2 ,  T3 ,  T4 >  MutVisitable < V >  for  ( T1 ,  T2 ,  T3 ,  T4 ) 
144+ where 
145+     T1 :  MutVisitable < V ,  Extra  = ( ) > , 
146+     T2 :  MutVisitable < V ,  Extra  = ( ) > , 
147+     T3 :  MutVisitable < V ,  Extra  = ( ) > , 
148+     T4 :  MutVisitable < V ,  Extra  = ( ) > , 
149+ { 
150+     type  Extra  = ( ) ; 
151+     fn  visit_mut ( & mut  self ,  visitor :  & mut  V ,  extra :  Self :: Extra )  { 
152+         self . 0 . visit_mut ( visitor,  extra) ; 
153+         self . 1 . visit_mut ( visitor,  extra) ; 
154+         self . 2 . visit_mut ( visitor,  extra) ; 
155+         self . 3 . visit_mut ( visitor,  extra) ; 
156+     } 
157+ } 
158+ 
159+ pub  trait  MutWalkable < V :  MutVisitor >  { 
160+     fn  walk_mut ( & mut  self ,  visitor :  & mut  V ) ; 
161+ } 
162+ 
39163super :: common_visitor_and_walkers!( ( mut )  MutVisitor ) ; 
40164
41165macro_rules!  generate_flat_map_visitor_fns { 
42166    ( $( $name: ident,  $Ty: ty,  $flat_map_fn: ident$( ,  $param: ident:  $ParamTy: ty) * ; ) +)  => { 
43167        $( 
168+             #[ allow( unused_parens) ] 
169+             impl <V :  MutVisitor > MutVisitable <V > for  ThinVec <$Ty> { 
170+                 type  Extra  = ( $( $ParamTy) ,* ) ; 
171+ 
172+                 #[ inline] 
173+                 fn  visit_mut( 
174+                     & mut  self , 
175+                     visitor:  & mut  V , 
176+                     ( $( $param) ,* ) :  Self :: Extra , 
177+                 )  -> V :: Result  { 
178+                     $name( visitor,  self  $( ,  $param) * ) 
179+                 } 
180+             } 
181+ 
44182            fn  $name<V :  MutVisitor >( 
45183                vis:  & mut  V , 
46184                values:  & mut  ThinVec <$Ty>, 
@@ -78,15 +216,6 @@ pub fn walk_flat_map_pat_field<T: MutVisitor>(
78216    smallvec ! [ fp] 
79217} 
80218
81- fn  visit_nested_use_tree < V :  MutVisitor > ( 
82-     vis :  & mut  V , 
83-     nested_tree :  & mut  UseTree , 
84-     nested_id :  & mut  NodeId , 
85- )  { 
86-     vis. visit_id ( nested_id) ; 
87-     vis. visit_use_tree ( nested_tree) ; 
88- } 
89- 
90219macro_rules!  generate_walk_flat_map_fns { 
91220    ( $( $fn_name: ident( $Ty: ty$( , $extra_name: ident:  $ExtraTy: ty) * )  => $visit_fn_name: ident; ) +)  => { $( 
92221        pub  fn  $fn_name<V :  MutVisitor >( vis:  & mut  V ,  mut  value:  $Ty$( , $extra_name:  $ExtraTy) * )  -> SmallVec <[ $Ty;  1 ] > { 
@@ -109,14 +238,6 @@ generate_walk_flat_map_fns! {
109238    walk_flat_map_assoc_item( P <AssocItem >,  ctxt:  AssocCtxt )  => visit_assoc_item; 
110239} 
111240
112- fn  walk_ty_alias_where_clauses < T :  MutVisitor > ( vis :  & mut  T ,  tawcs :  & mut  TyAliasWhereClauses )  { 
113-     let  TyAliasWhereClauses  {  before,  after,  split :  _ }  = tawcs; 
114-     let  TyAliasWhereClause  {  has_where_token :  _,  span :  span_before }  = before; 
115-     let  TyAliasWhereClause  {  has_where_token :  _,  span :  span_after }  = after; 
116-     vis. visit_span ( span_before) ; 
117-     vis. visit_span ( span_after) ; 
118- } 
119- 
120241pub  fn  walk_filter_map_expr < T :  MutVisitor > ( vis :  & mut  T ,  mut  e :  P < Expr > )  -> Option < P < Expr > >  { 
121242    vis. visit_expr ( & mut  e) ; 
122243    Some ( e) 
0 commit comments