@@ -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,15 @@ 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+ fn walk (
41+ & mut self ,
42+ span : Span ,
43+ id : NodeId ,
44+ ident : & mut Ident ,
45+ visibility : & mut Visibility ,
46+ ctxt : AssocCtxt ,
47+ visitor : & mut impl MutVisitor ,
48+ ) ;
4149}
4250
4351pub trait MutVisitor : Sized {
@@ -114,9 +122,9 @@ pub trait MutVisitor: Sized {
114122 fn flat_map_assoc_item (
115123 & mut self ,
116124 i : P < AssocItem > ,
117- _ctxt : AssocCtxt ,
125+ ctxt : AssocCtxt ,
118126 ) -> SmallVec < [ P < AssocItem > ; 1 ] > {
119- walk_flat_map_item ( self , i)
127+ walk_flat_map_assoc_item ( self , i, ctxt )
120128 }
121129
122130 fn visit_fn_decl ( & mut self , d : & mut P < FnDecl > ) {
@@ -880,7 +888,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
880888
881889fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
882890 match kind {
883- FnKind :: Fn ( FnSig { header, decl, span } , generics, body) => {
891+ FnKind :: Fn ( _ctxt , _ident , FnSig { header, decl, span } , _visibility , generics, body) => {
884892 // Identifier and visibility are visited as a part of the item.
885893 vis. visit_fn_header ( header) ;
886894 vis. visit_generics ( generics) ;
@@ -890,8 +898,9 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
890898 }
891899 vis. visit_span ( span) ;
892900 }
893- FnKind :: Closure ( binder, decl, body) => {
901+ FnKind :: Closure ( binder, coroutine_kind , decl, body) => {
894902 vis. visit_closure_binder ( binder) ;
903+ coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
895904 vis. visit_fn_decl ( decl) ;
896905 vis. visit_expr ( body) ;
897906 }
@@ -1083,13 +1092,24 @@ pub fn walk_item_kind(
10831092 kind : & mut impl WalkItemKind ,
10841093 span : Span ,
10851094 id : NodeId ,
1095+ ident : & mut Ident ,
1096+ visibility : & mut Visibility ,
1097+ ctxt : AssocCtxt ,
10861098 vis : & mut impl MutVisitor ,
10871099) {
1088- kind. walk ( span, id, vis)
1100+ kind. walk ( span, id, ident , visibility , ctxt , vis)
10891101}
10901102
10911103impl WalkItemKind for ItemKind {
1092- fn walk ( & mut self , span : Span , id : NodeId , vis : & mut impl MutVisitor ) {
1104+ fn walk (
1105+ & mut self ,
1106+ span : Span ,
1107+ id : NodeId ,
1108+ ident : & mut Ident ,
1109+ visibility : & mut Visibility ,
1110+ _ctxt : AssocCtxt ,
1111+ vis : & mut impl MutVisitor ,
1112+ ) {
10931113 match self {
10941114 ItemKind :: ExternCrate ( _orig_name) => { }
10951115 ItemKind :: Use ( use_tree) => vis. visit_use_tree ( use_tree) ,
@@ -1102,7 +1122,11 @@ impl WalkItemKind for ItemKind {
11021122 }
11031123 ItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
11041124 visit_defaultness ( vis, defaultness) ;
1105- vis. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1125+ vis. visit_fn (
1126+ FnKind :: Fn ( FnCtxt :: Free , ident, sig, visibility, generics, body) ,
1127+ span,
1128+ id,
1129+ ) ;
11061130 }
11071131 ItemKind :: Mod ( safety, mod_kind) => {
11081132 visit_safety ( vis, safety) ;
@@ -1201,14 +1225,26 @@ impl WalkItemKind for ItemKind {
12011225}
12021226
12031227impl WalkItemKind for AssocItemKind {
1204- fn walk ( & mut self , span : Span , id : NodeId , visitor : & mut impl MutVisitor ) {
1228+ fn walk (
1229+ & mut self ,
1230+ span : Span ,
1231+ id : NodeId ,
1232+ ident : & mut Ident ,
1233+ visibility : & mut Visibility ,
1234+ ctxt : AssocCtxt ,
1235+ visitor : & mut impl MutVisitor ,
1236+ ) {
12051237 match self {
12061238 AssocItemKind :: Const ( item) => {
12071239 visit_const_item ( item, visitor) ;
12081240 }
12091241 AssocItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
12101242 visit_defaultness ( visitor, defaultness) ;
1211- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1243+ visitor. visit_fn (
1244+ FnKind :: Fn ( FnCtxt :: Assoc ( ctxt) , ident, sig, visibility, generics, body) ,
1245+ span,
1246+ id,
1247+ ) ;
12121248 }
12131249 AssocItemKind :: Type ( box TyAlias {
12141250 defaultness,
@@ -1288,32 +1324,51 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
12881324 vis. visit_span ( inject_use_span) ;
12891325}
12901326
1291- /// Mutates one item, returning the item again.
12921327pub fn walk_flat_map_item < K : WalkItemKind > (
1328+ visitor : & mut impl MutVisitor ,
1329+ item : P < Item < K > > ,
1330+ ) -> SmallVec < [ P < Item < K > > ; 1 ] > {
1331+ walk_flat_map_assoc_item ( visitor, item, AssocCtxt :: Trait /* ignored */ )
1332+ }
1333+
1334+ pub fn walk_flat_map_assoc_item < K : WalkItemKind > (
12931335 visitor : & mut impl MutVisitor ,
12941336 mut item : P < Item < K > > ,
1337+ ctxt : AssocCtxt ,
12951338) -> SmallVec < [ P < Item < K > > ; 1 ] > {
12961339 let Item { ident, attrs, id, kind, vis, span, tokens } = item. deref_mut ( ) ;
12971340 visitor. visit_id ( id) ;
12981341 visit_attrs ( visitor, attrs) ;
12991342 visitor. visit_vis ( vis) ;
13001343 visitor. visit_ident ( ident) ;
1301- kind. walk ( * span, * id, visitor) ;
1344+ kind. walk ( * span, * id, ident , vis , ctxt , visitor) ;
13021345 visit_lazy_tts ( visitor, tokens) ;
13031346 visitor. visit_span ( span) ;
13041347 smallvec ! [ item]
13051348}
13061349
13071350impl WalkItemKind for ForeignItemKind {
1308- fn walk ( & mut self , span : Span , id : NodeId , visitor : & mut impl MutVisitor ) {
1351+ fn walk (
1352+ & mut self ,
1353+ span : Span ,
1354+ id : NodeId ,
1355+ ident : & mut Ident ,
1356+ visibility : & mut Visibility ,
1357+ _ctxt : AssocCtxt ,
1358+ visitor : & mut impl MutVisitor ,
1359+ ) {
13091360 match self {
13101361 ForeignItemKind :: Static ( box StaticItem { ty, mutability : _, expr, safety : _ } ) => {
13111362 visitor. visit_ty ( ty) ;
13121363 visit_opt ( expr, |expr| visitor. visit_expr ( expr) ) ;
13131364 }
13141365 ForeignItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
13151366 visit_defaultness ( visitor, defaultness) ;
1316- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1367+ visitor. visit_fn (
1368+ FnKind :: Fn ( FnCtxt :: Foreign , ident, sig, visibility, generics, body) ,
1369+ span,
1370+ id,
1371+ ) ;
13171372 }
13181373 ForeignItemKind :: TyAlias ( box TyAlias {
13191374 defaultness,
@@ -1522,9 +1577,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
15221577 fn_arg_span,
15231578 } ) => {
15241579 visit_constness ( vis, constness) ;
1525- coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
15261580 vis. visit_capture_by ( capture_clause) ;
1527- vis. visit_fn ( FnKind :: Closure ( binder, fn_decl, body) , * span, * id) ;
1581+ vis. visit_fn ( FnKind :: Closure ( binder, coroutine_kind , fn_decl, body) , * span, * id) ;
15281582 vis. visit_span ( fn_decl_span) ;
15291583 vis. visit_span ( fn_arg_span) ;
15301584 }
@@ -1785,8 +1839,20 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
17851839#[ derive( Debug ) ]
17861840pub enum FnKind < ' a > {
17871841 /// 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 > > ) ,
1842+ Fn (
1843+ FnCtxt ,
1844+ & ' a mut Ident ,
1845+ & ' a mut FnSig ,
1846+ & ' a mut Visibility ,
1847+ & ' a mut Generics ,
1848+ & ' a mut Option < P < Block > > ,
1849+ ) ,
17891850
17901851 /// E.g., `|x, y| body`.
1791- Closure ( & ' a mut ClosureBinder , & ' a mut P < FnDecl > , & ' a mut P < Expr > ) ,
1852+ Closure (
1853+ & ' a mut ClosureBinder ,
1854+ & ' a mut Option < CoroutineKind > ,
1855+ & ' a mut P < FnDecl > ,
1856+ & ' a mut P < Expr > ,
1857+ ) ,
17921858}
0 commit comments