@@ -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,7 @@ 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 ( & mut self , span : Span , id : NodeId , ident : & mut Ident , visibility : & mut Visibility , visitor : & mut impl MutVisitor ) ;
41
41
}
42
42
43
43
pub trait MutVisitor : Sized {
@@ -880,7 +880,7 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
880
880
881
881
fn walk_fn < T : MutVisitor > ( vis : & mut T , kind : FnKind < ' _ > ) {
882
882
match kind {
883
- FnKind :: Fn ( FnSig { header, decl, span } , generics, body) => {
883
+ FnKind :: Fn ( _ctxt , _ident , FnSig { header, decl, span } , _visibility , generics, body) => {
884
884
// Identifier and visibility are visited as a part of the item.
885
885
vis. visit_fn_header ( header) ;
886
886
vis. visit_generics ( generics) ;
@@ -890,8 +890,9 @@ fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
890
890
}
891
891
vis. visit_span ( span) ;
892
892
}
893
- FnKind :: Closure ( binder, decl, body) => {
893
+ FnKind :: Closure ( binder, coroutine_kind , decl, body) => {
894
894
vis. visit_closure_binder ( binder) ;
895
+ coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
895
896
vis. visit_fn_decl ( decl) ;
896
897
vis. visit_expr ( body) ;
897
898
}
@@ -1083,13 +1084,15 @@ pub fn walk_item_kind(
1083
1084
kind : & mut impl WalkItemKind ,
1084
1085
span : Span ,
1085
1086
id : NodeId ,
1087
+ ident : & mut Ident ,
1088
+ visibility : & mut Visibility ,
1086
1089
vis : & mut impl MutVisitor ,
1087
1090
) {
1088
- kind. walk ( span, id, vis)
1091
+ kind. walk ( span, id, ident , visibility , vis)
1089
1092
}
1090
1093
1091
1094
impl WalkItemKind for ItemKind {
1092
- fn walk ( & mut self , span : Span , id : NodeId , vis : & mut impl MutVisitor ) {
1095
+ fn walk ( & mut self , span : Span , id : NodeId , ident : & mut Ident , visibility : & mut Visibility , vis : & mut impl MutVisitor ) {
1093
1096
match self {
1094
1097
ItemKind :: ExternCrate ( _orig_name) => { }
1095
1098
ItemKind :: Use ( use_tree) => vis. visit_use_tree ( use_tree) ,
@@ -1102,7 +1105,7 @@ impl WalkItemKind for ItemKind {
1102
1105
}
1103
1106
ItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
1104
1107
visit_defaultness ( vis, defaultness) ;
1105
- vis. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1108
+ vis. visit_fn ( FnKind :: Fn ( FnCtxt :: Free , ident , sig, visibility , generics, body) , span, id) ;
1106
1109
}
1107
1110
ItemKind :: Mod ( safety, mod_kind) => {
1108
1111
visit_safety ( vis, safety) ;
@@ -1201,14 +1204,15 @@ impl WalkItemKind for ItemKind {
1201
1204
}
1202
1205
1203
1206
impl WalkItemKind for AssocItemKind {
1204
- fn walk ( & mut self , span : Span , id : NodeId , visitor : & mut impl MutVisitor ) {
1207
+ fn walk ( & mut self , span : Span , id : NodeId , ident : & mut Ident , visibility : & mut Visibility , visitor : & mut impl MutVisitor ) {
1205
1208
match self {
1206
1209
AssocItemKind :: Const ( item) => {
1207
1210
visit_const_item ( item, visitor) ;
1208
1211
}
1209
1212
AssocItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
1210
1213
visit_defaultness ( visitor, defaultness) ;
1211
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1214
+ // TODO: use AssocCtxt
1215
+ visitor. visit_fn ( FnKind :: Fn ( FnCtxt :: Free , ident, sig, visibility, generics, body) , span, id) ;
1212
1216
}
1213
1217
AssocItemKind :: Type ( box TyAlias {
1214
1218
defaultness,
@@ -1298,22 +1302,22 @@ pub fn walk_flat_map_item<K: WalkItemKind>(
1298
1302
visit_attrs ( visitor, attrs) ;
1299
1303
visitor. visit_vis ( vis) ;
1300
1304
visitor. visit_ident ( ident) ;
1301
- kind. walk ( * span, * id, visitor) ;
1305
+ kind. walk ( * span, * id, ident , vis , visitor) ;
1302
1306
visit_lazy_tts ( visitor, tokens) ;
1303
1307
visitor. visit_span ( span) ;
1304
1308
smallvec ! [ item]
1305
1309
}
1306
1310
1307
1311
impl WalkItemKind for ForeignItemKind {
1308
- fn walk ( & mut self , span : Span , id : NodeId , visitor : & mut impl MutVisitor ) {
1312
+ fn walk ( & mut self , span : Span , id : NodeId , ident : & mut Ident , visibility : & mut Visibility , visitor : & mut impl MutVisitor ) {
1309
1313
match self {
1310
1314
ForeignItemKind :: Static ( box StaticItem { ty, mutability : _, expr, safety : _ } ) => {
1311
1315
visitor. visit_ty ( ty) ;
1312
1316
visit_opt ( expr, |expr| visitor. visit_expr ( expr) ) ;
1313
1317
}
1314
1318
ForeignItemKind :: Fn ( box Fn { defaultness, generics, sig, body } ) => {
1315
1319
visit_defaultness ( visitor, defaultness) ;
1316
- visitor. visit_fn ( FnKind :: Fn ( sig, generics, body) , span, id) ;
1320
+ visitor. visit_fn ( FnKind :: Fn ( FnCtxt :: Foreign , ident , sig, visibility , generics, body) , span, id) ;
1317
1321
}
1318
1322
ForeignItemKind :: TyAlias ( box TyAlias {
1319
1323
defaultness,
@@ -1522,9 +1526,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1522
1526
fn_arg_span,
1523
1527
} ) => {
1524
1528
visit_constness ( vis, constness) ;
1525
- coroutine_kind. as_mut ( ) . map ( |coroutine_kind| vis. visit_coroutine_kind ( coroutine_kind) ) ;
1526
1529
vis. visit_capture_by ( capture_clause) ;
1527
- vis. visit_fn ( FnKind :: Closure ( binder, fn_decl, body) , * span, * id) ;
1530
+ vis. visit_fn ( FnKind :: Closure ( binder, coroutine_kind , fn_decl, body) , * span, * id) ;
1528
1531
vis. visit_span ( fn_decl_span) ;
1529
1532
vis. visit_span ( fn_arg_span) ;
1530
1533
}
@@ -1785,8 +1788,8 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
1785
1788
#[ derive( Debug ) ]
1786
1789
pub enum FnKind < ' a > {
1787
1790
/// 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 > > ) ,
1791
+ Fn ( FnCtxt , & ' a mut Ident , & ' a mut FnSig , & ' a mut Visibility , & ' a mut Generics , & ' a mut Option < P < Block > > ) ,
1789
1792
1790
1793
/// E.g., `|x, y| body`.
1791
- Closure ( & ' a mut ClosureBinder , & ' a mut P < FnDecl > , & ' a mut P < Expr > ) ,
1794
+ Closure ( & ' a mut ClosureBinder , & ' a mut Option < CoroutineKind > , & ' a mut P < FnDecl > , & ' a mut P < Expr > ) ,
1792
1795
}
0 commit comments