@@ -23,7 +23,7 @@ use crate::ast::*;
2323use crate :: ptr:: P ;
2424use crate :: token:: { self , Token } ;
2525use crate :: tokenstream:: * ;
26- use crate :: visit:: { AssocCtxt , BoundKind } ;
26+ use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt } ;
2727
2828pub trait ExpectOne < A : Array > {
2929 fn expect_one ( self , err : & ' static str ) -> A :: Item ;
@@ -37,7 +37,16 @@ impl<A: Array> ExpectOne<A> for SmallVec<A> {
3737}
3838
3939pub trait WalkItemKind {
40- fn walk ( & mut self , span : Span , id : NodeId , visitor : & mut impl MutVisitor ) ;
40+ type Ctxt ;
41+ fn walk (
42+ & mut self ,
43+ span : Span ,
44+ id : NodeId ,
45+ ident : & mut Ident ,
46+ visibility : & mut Visibility ,
47+ ctxt : Self :: Ctxt ,
48+ visitor : & mut impl MutVisitor ,
49+ ) ;
4150}
4251
4352pub trait MutVisitor : Sized {
@@ -114,9 +123,9 @@ pub trait MutVisitor: Sized {
114123 fn flat_map_assoc_item (
115124 & mut self ,
116125 i : P < AssocItem > ,
117- _ctxt : AssocCtxt ,
126+ ctxt : AssocCtxt ,
118127 ) -> SmallVec < [ P < AssocItem > ; 1 ] > {
119- walk_flat_map_item ( self , i)
128+ walk_flat_map_assoc_item ( self , i, ctxt )
120129 }
121130
122131 fn visit_fn_decl ( & mut self , d : & mut P < FnDecl > ) {
@@ -880,7 +889,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
880889
881890fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
882891 match kind {
883- FnKind :: Fn ( FnSig { header, decl, span } , generics, body) => {
892+ FnKind :: Fn ( _ctxt , _ident , FnSig { header, decl, span } , _visibility , generics, body) => {
884893 // Identifier and visibility are visited as a part of the item.
885894 vis. visit_fn_header ( header) ;
886895 vis. visit_generics ( generics) ;
@@ -890,8 +899,9 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
890899 }
891900 vis. visit_span ( span) ;
892901 }
893- FnKind :: Closure ( binder, decl, body) => {
902+ FnKind :: Closure ( binder, coroutine_kind , decl, body) => {
894903 vis. visit_closure_binder ( binder) ;
904+ coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
895905 vis. visit_fn_decl ( decl) ;
896906 vis. visit_expr ( body) ;
897907 }
@@ -1079,17 +1089,29 @@ pub fn walk_block<T: MutVisitor>(vis: &mut T, block: &mut P<Block>) {
10791089 vis. visit_span ( span) ;
10801090}
10811091
1082- pub fn walk_item_kind (
1083- kind : & mut impl WalkItemKind ,
1092+ pub fn walk_item_kind < K : WalkItemKind > (
1093+ kind : & mut K ,
10841094 span : Span ,
10851095 id : NodeId ,
1096+ ident : & mut Ident ,
1097+ visibility : & mut Visibility ,
1098+ ctxt : K :: Ctxt ,
10861099 vis : & mut impl MutVisitor ,
10871100) {
1088- kind. walk ( span, id, vis)
1101+ kind. walk ( span, id, ident , visibility , ctxt , vis)
10891102}
10901103
10911104impl WalkItemKind for ItemKind {
1092- fn walk ( & mut self , span : Span , id : NodeId , vis : & mut impl MutVisitor ) {
1105+ type Ctxt = ( ) ;
1106+ fn walk (
1107+ & mut self ,
1108+ span : Span ,
1109+ id : NodeId ,
1110+ ident : & mut Ident ,
1111+ visibility : & mut Visibility ,
1112+ _ctxt : Self :: Ctxt ,
1113+ vis : & mut impl MutVisitor ,
1114+ ) {
10931115 match self {
10941116 ItemKind :: ExternCrate ( _orig_name) => { }
10951117 ItemKind :: Use ( use_tree) => vis. visit_use_tree ( use_tree) ,
@@ -1102,7 +1124,11 @@ impl WalkItemKind for ItemKind {
11021124 }
11031125 ItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
11041126 visit_defaultness ( vis, defaultness) ;
1105- vis. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1127+ vis. visit_fn (
1128+ FnKind :: Fn ( FnCtxt :: Free , ident, sig, visibility, generics, body) ,
1129+ span,
1130+ id,
1131+ ) ;
11061132 }
11071133 ItemKind :: Mod ( safety, mod_kind) => {
11081134 visit_safety ( vis, safety) ;
@@ -1201,14 +1227,27 @@ impl WalkItemKind for ItemKind {
12011227}
12021228
12031229impl WalkItemKind for AssocItemKind {
1204- fn walk ( & mut self , span : Span , id : NodeId , visitor : & mut impl MutVisitor ) {
1230+ type Ctxt = AssocCtxt ;
1231+ fn walk (
1232+ & mut self ,
1233+ span : Span ,
1234+ id : NodeId ,
1235+ ident : & mut Ident ,
1236+ visibility : & mut Visibility ,
1237+ ctxt : Self :: Ctxt ,
1238+ visitor : & mut impl MutVisitor ,
1239+ ) {
12051240 match self {
12061241 AssocItemKind :: Const ( item) => {
12071242 visit_const_item ( item, visitor) ;
12081243 }
12091244 AssocItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
12101245 visit_defaultness ( visitor, defaultness) ;
1211- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1246+ visitor. visit_fn (
1247+ FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , ident, sig, visibility, generics, body) ,
1248+ span,
1249+ id,
1250+ ) ;
12121251 }
12131252 AssocItemKind :: Type ( box TyAlias {
12141253 defaultness,
@@ -1288,32 +1327,52 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
12881327 vis. visit_span ( inject_use_span) ;
12891328}
12901329
1291- /// Mutates one item, returning the item again.
1292- pub fn walk_flat_map_item < K : WalkItemKind > (
1330+ pub fn walk_flat_map_item < K : WalkItemKind < Ctxt = ( ) > > (
1331+ visitor : & mut impl MutVisitor ,
1332+ item : P < Item < K > > ,
1333+ ) -> SmallVec < [ P < Item < K > > ; 1 ] > {
1334+ walk_flat_map_assoc_item ( visitor, item, ( ) )
1335+ }
1336+
1337+ pub fn walk_flat_map_assoc_item < K : WalkItemKind > (
12931338 visitor : & mut impl MutVisitor ,
12941339 mut item : P < Item < K > > ,
1340+ ctxt : K :: Ctxt ,
12951341) -> SmallVec < [ P < Item < K > > ; 1 ] > {
12961342 let Item { ident, attrs, id, kind, vis, span, tokens } = item. deref_mut ( ) ;
12971343 visitor. visit_id ( id) ;
12981344 visit_attrs ( visitor, attrs) ;
12991345 visitor. visit_vis ( vis) ;
13001346 visitor. visit_ident ( ident) ;
1301- kind. walk ( * span, * id, visitor) ;
1347+ kind. walk ( * span, * id, ident , vis , ctxt , visitor) ;
13021348 visit_lazy_tts ( visitor, tokens) ;
13031349 visitor. visit_span ( span) ;
13041350 smallvec ! [ item]
13051351}
13061352
13071353impl WalkItemKind for ForeignItemKind {
1308- fn walk ( & mut self , span : Span , id : NodeId , visitor : & mut impl MutVisitor ) {
1354+ type Ctxt = ( ) ;
1355+ fn walk (
1356+ & mut self ,
1357+ span : Span ,
1358+ id : NodeId ,
1359+ ident : & mut Ident ,
1360+ visibility : & mut Visibility ,
1361+ _ctxt : Self :: Ctxt ,
1362+ visitor : & mut impl MutVisitor ,
1363+ ) {
13091364 match self {
13101365 ForeignItemKind :: Static ( box StaticItem { ty, mutability : _, expr, safety : _ } ) => {
13111366 visitor. visit_ty ( ty) ;
13121367 visit_opt ( expr, |expr| visitor. visit_expr ( expr) ) ;
13131368 }
13141369 ForeignItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
13151370 visit_defaultness ( visitor, defaultness) ;
1316- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1371+ visitor. visit_fn (
1372+ FnKind :: Fn ( FnCtxt :: Foreign , ident, sig, visibility, generics, body) ,
1373+ span,
1374+ id,
1375+ ) ;
13171376 }
13181377 ForeignItemKind :: TyAlias ( box TyAlias {
13191378 defaultness,
@@ -1522,9 +1581,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
15221581 fn_arg_span,
15231582 } ) => {
15241583 visit_constness ( vis, constness) ;
1525- coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
15261584 vis. visit_capture_by ( capture_clause) ;
1527- vis. visit_fn ( FnKind :: Closure ( binder, fn_decl, body) , * span, * id) ;
1585+ vis. visit_fn ( FnKind :: Closure ( binder, coroutine_kind , fn_decl, body) , * span, * id) ;
15281586 vis. visit_span ( fn_decl_span) ;
15291587 vis. visit_span ( fn_arg_span) ;
15301588 }
@@ -1785,8 +1843,20 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
17851843#[ derive( Debug ) ]
17861844pub enum FnKind < ' a > {
17871845 /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
1788- Fn ( & ' a mut FnSig , & ' a mut Generics , & ' a mut Option < P < Block > > ) ,
1846+ Fn (
1847+ FnCtxt ,
1848+ & ' a mut Ident ,
1849+ & ' a mut FnSig ,
1850+ & ' a mut Visibility ,
1851+ & ' a mut Generics ,
1852+ & ' a mut Option < P < Block > > ,
1853+ ) ,
17891854
17901855 /// E.g., `|x, y| body`.
1791- Closure ( & ' a mut ClosureBinder , & ' a mut P < FnDecl > , & ' a mut P < Expr > ) ,
1856+ Closure (
1857+ & ' a mut ClosureBinder ,
1858+ & ' a mut Option < CoroutineKind > ,
1859+ & ' a mut P < FnDecl > ,
1860+ & ' a mut P < Expr > ,
1861+ ) ,
17921862}
0 commit comments