@@ -11,13 +11,13 @@ use syntax_pos::Span;
11
11
/// Creates `DefId`s for nodes in the AST.
12
12
pub struct DefCollector < ' a > {
13
13
definitions : & ' a mut Definitions ,
14
- parent_def : Option < DefIndex > ,
14
+ parent_def : DefIndex ,
15
15
expansion : Mark ,
16
16
}
17
17
18
18
impl < ' a > DefCollector < ' a > {
19
19
pub fn new ( definitions : & ' a mut Definitions , expansion : Mark ) -> Self {
20
- let parent_def = Some ( definitions. invocation_parent ( expansion) ) ;
20
+ let parent_def = definitions. invocation_parent ( expansion) ;
21
21
DefCollector { definitions, parent_def, expansion }
22
22
}
23
23
@@ -26,17 +26,15 @@ impl<'a> DefCollector<'a> {
26
26
data : DefPathData ,
27
27
span : Span )
28
28
-> DefIndex {
29
- let parent_def = self . parent_def . unwrap ( ) ;
29
+ let parent_def = self . parent_def ;
30
30
debug ! ( "create_def(node_id={:?}, data={:?}, parent_def={:?})" , node_id, data, parent_def) ;
31
- self . definitions
32
- . create_def_with_parent ( parent_def, node_id, data, self . expansion , span)
31
+ self . definitions . create_def_with_parent ( parent_def, node_id, data, self . expansion , span)
33
32
}
34
33
35
34
pub fn with_parent < F : FnOnce ( & mut Self ) > ( & mut self , parent_def : DefIndex , f : F ) {
36
- let parent = self . parent_def ;
37
- self . parent_def = Some ( parent_def) ;
35
+ let orig_parent_def = std:: mem:: replace ( & mut self . parent_def , parent_def) ;
38
36
f ( self ) ;
39
- self . parent_def = parent ;
37
+ self . parent_def = orig_parent_def ;
40
38
}
41
39
42
40
fn visit_async_fn (
@@ -77,7 +75,7 @@ impl<'a> DefCollector<'a> {
77
75
}
78
76
79
77
fn visit_macro_invoc ( & mut self , id : NodeId ) {
80
- self . definitions . set_invocation_parent ( id. placeholder_to_mark ( ) , self . parent_def . unwrap ( ) ) ;
78
+ self . definitions . set_invocation_parent ( id. placeholder_to_mark ( ) , self . parent_def ) ;
81
79
}
82
80
}
83
81
@@ -250,36 +248,24 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
250
248
}
251
249
252
250
fn visit_expr ( & mut self , expr : & ' a Expr ) {
253
- let parent_def = self . parent_def ;
254
-
255
- match expr. node {
251
+ let parent_def = match expr. node {
256
252
ExprKind :: Mac ( ..) => return self . visit_macro_invoc ( expr. id ) ,
257
253
ExprKind :: Closure ( _, asyncness, ..) => {
258
- let closure_def = self . create_def ( expr. id ,
259
- DefPathData :: ClosureExpr ,
260
- expr. span ) ;
261
- self . parent_def = Some ( closure_def) ;
262
-
263
254
// Async closures desugar to closures inside of closures, so
264
255
// we must create two defs.
265
- if let IsAsync :: Async { closure_id , .. } = asyncness {
266
- let async_def = self . create_def ( closure_id ,
267
- DefPathData :: ClosureExpr ,
268
- expr. span ) ;
269
- self . parent_def = Some ( async_def ) ;
256
+ let closure_def = self . create_def ( expr . id , DefPathData :: ClosureExpr , expr . span ) ;
257
+ match asyncness {
258
+ IsAsync :: Async { closure_id , .. } =>
259
+ self . create_def ( closure_id , DefPathData :: ClosureExpr , expr. span ) ,
260
+ IsAsync :: NotAsync => closure_def ,
270
261
}
271
262
}
272
- ExprKind :: Async ( _, async_id, _) => {
273
- let async_def = self . create_def ( async_id,
274
- DefPathData :: ClosureExpr ,
275
- expr. span ) ;
276
- self . parent_def = Some ( async_def) ;
277
- }
278
- _ => { }
263
+ ExprKind :: Async ( _, async_id, _) =>
264
+ self . create_def ( async_id, DefPathData :: ClosureExpr , expr. span ) ,
265
+ _ => self . parent_def ,
279
266
} ;
280
267
281
- visit:: walk_expr ( self , expr) ;
282
- self . parent_def = parent_def;
268
+ self . with_parent ( parent_def, |this| visit:: walk_expr ( this, expr) ) ;
283
269
}
284
270
285
271
fn visit_ty ( & mut self , ty : & ' a Ty ) {
0 commit comments