@@ -23,7 +23,7 @@ use crate::ast::*;
23
23
use crate :: ptr:: P ;
24
24
use crate :: token:: { self , Token } ;
25
25
use crate :: tokenstream:: * ;
26
- use crate :: visit:: { AssocCtxt , BoundKind } ;
26
+ use crate :: visit:: { AssocCtxt , BoundKind , FnCtxt } ;
27
27
28
28
pub trait ExpectOne < A : Array > {
29
29
fn expect_one ( self , err : & ' static str ) -> A :: Item ;
@@ -37,7 +37,15 @@ impl<A: Array> ExpectOne<A> for SmallVec<A> {
37
37
}
38
38
39
39
pub 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
+ ) ;
41
49
}
42
50
43
51
pub trait MutVisitor : Sized {
@@ -114,9 +122,9 @@ pub trait MutVisitor: Sized {
114
122
fn flat_map_assoc_item (
115
123
& mut self ,
116
124
i : P < AssocItem > ,
117
- _ctxt : AssocCtxt ,
125
+ ctxt : AssocCtxt ,
118
126
) -> SmallVec < [ P < AssocItem > ; 1 ] > {
119
- walk_flat_map_item ( self , i)
127
+ walk_flat_map_assoc_item ( self , i, ctxt )
120
128
}
121
129
122
130
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
880
888
881
889
fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
882
890
match kind {
883
- FnKind :: Fn ( FnSig { header, decl, span } , generics, body) => {
891
+ FnKind :: Fn ( _ctxt , _ident , FnSig { header, decl, span } , _visibility , generics, body) => {
884
892
// Identifier and visibility are visited as a part of the item.
885
893
vis. visit_fn_header ( header) ;
886
894
vis. visit_generics ( generics) ;
@@ -890,8 +898,9 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
890
898
}
891
899
vis. visit_span ( span) ;
892
900
}
893
- FnKind :: Closure ( binder, decl, body) => {
901
+ FnKind :: Closure ( binder, coroutine_kind , decl, body) => {
894
902
vis. visit_closure_binder ( binder) ;
903
+ coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
895
904
vis. visit_fn_decl ( decl) ;
896
905
vis. visit_expr ( body) ;
897
906
}
@@ -1083,13 +1092,24 @@ pub fn walk_item_kind(
1083
1092
kind : & mut impl WalkItemKind ,
1084
1093
span : Span ,
1085
1094
id : NodeId ,
1095
+ ident : & mut Ident ,
1096
+ visibility : & mut Visibility ,
1097
+ ctxt : AssocCtxt ,
1086
1098
vis : & mut impl MutVisitor ,
1087
1099
) {
1088
- kind. walk ( span, id, vis)
1100
+ kind. walk ( span, id, ident , visibility , ctxt , vis)
1089
1101
}
1090
1102
1091
1103
impl 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
+ ) {
1093
1113
match self {
1094
1114
ItemKind :: ExternCrate ( _orig_name) => { }
1095
1115
ItemKind :: Use ( use_tree) => vis. visit_use_tree ( use_tree) ,
@@ -1102,7 +1122,11 @@ impl WalkItemKind for ItemKind {
1102
1122
}
1103
1123
ItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
1104
1124
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
+ ) ;
1106
1130
}
1107
1131
ItemKind :: Mod ( safety, mod_kind) => {
1108
1132
visit_safety ( vis, safety) ;
@@ -1201,14 +1225,26 @@ impl WalkItemKind for ItemKind {
1201
1225
}
1202
1226
1203
1227
impl 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
+ ) {
1205
1237
match self {
1206
1238
AssocItemKind :: Const ( item) => {
1207
1239
visit_const_item ( item, visitor) ;
1208
1240
}
1209
1241
AssocItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
1210
1242
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
+ ) ;
1212
1248
}
1213
1249
AssocItemKind :: Type ( box TyAlias {
1214
1250
defaultness,
@@ -1288,32 +1324,51 @@ pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
1288
1324
vis. visit_span ( inject_use_span) ;
1289
1325
}
1290
1326
1291
- /// Mutates one item, returning the item again.
1292
1327
pub 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 > (
1293
1335
visitor : & mut impl MutVisitor ,
1294
1336
mut item : P < Item < K > > ,
1337
+ ctxt : AssocCtxt ,
1295
1338
) -> SmallVec < [ P < Item < K > > ; 1 ] > {
1296
1339
let Item { ident, attrs, id, kind, vis, span, tokens } = item. deref_mut ( ) ;
1297
1340
visitor. visit_id ( id) ;
1298
1341
visit_attrs ( visitor, attrs) ;
1299
1342
visitor. visit_vis ( vis) ;
1300
1343
visitor. visit_ident ( ident) ;
1301
- kind. walk ( * span, * id, visitor) ;
1344
+ kind. walk ( * span, * id, ident , vis , ctxt , visitor) ;
1302
1345
visit_lazy_tts ( visitor, tokens) ;
1303
1346
visitor. visit_span ( span) ;
1304
1347
smallvec ! [ item]
1305
1348
}
1306
1349
1307
1350
impl 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
+ ) {
1309
1360
match self {
1310
1361
ForeignItemKind :: Static ( box StaticItem { ty, mutability : _, expr, safety : _ } ) => {
1311
1362
visitor. visit_ty ( ty) ;
1312
1363
visit_opt ( expr, |expr| visitor. visit_expr ( expr) ) ;
1313
1364
}
1314
1365
ForeignItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
1315
1366
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
+ ) ;
1317
1372
}
1318
1373
ForeignItemKind :: TyAlias ( box TyAlias {
1319
1374
defaultness,
@@ -1522,9 +1577,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1522
1577
fn_arg_span,
1523
1578
} ) => {
1524
1579
visit_constness ( vis, constness) ;
1525
- coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
1526
1580
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) ;
1528
1582
vis. visit_span ( fn_decl_span) ;
1529
1583
vis. visit_span ( fn_arg_span) ;
1530
1584
}
@@ -1785,8 +1839,20 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
1785
1839
#[ derive( Debug ) ]
1786
1840
pub enum FnKind < ' a > {
1787
1841
/// 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
+ ) ,
1789
1850
1790
1851
/// 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
+ ) ,
1792
1858
}
0 commit comments