@@ -11,13 +11,13 @@ use syntax_pos::Span;
1111/// Creates `DefId`s for nodes in the AST.
1212pub struct DefCollector < ' a > {
1313 definitions : & ' a mut Definitions ,
14- parent_def : Option < DefIndex > ,
14+ parent_def : DefIndex ,
1515 expansion : Mark ,
1616}
1717
1818impl < ' a > DefCollector < ' a > {
1919 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) ;
2121 DefCollector { definitions, parent_def, expansion }
2222 }
2323
@@ -26,17 +26,15 @@ impl<'a> DefCollector<'a> {
2626 data : DefPathData ,
2727 span : Span )
2828 -> DefIndex {
29- let parent_def = self . parent_def . unwrap ( ) ;
29+ let parent_def = self . parent_def ;
3030 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)
3332 }
3433
3534 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) ;
3836 f ( self ) ;
39- self . parent_def = parent ;
37+ self . parent_def = orig_parent_def ;
4038 }
4139
4240 fn visit_async_fn (
@@ -77,7 +75,7 @@ impl<'a> DefCollector<'a> {
7775 }
7876
7977 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 ) ;
8179 }
8280}
8381
@@ -250,36 +248,24 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
250248 }
251249
252250 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 {
256252 ExprKind :: Mac ( ..) => return self . visit_macro_invoc ( expr. id ) ,
257253 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-
263254 // Async closures desugar to closures inside of closures, so
264255 // 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 ,
270261 }
271262 }
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 ,
279266 } ;
280267
281- visit:: walk_expr ( self , expr) ;
282- self . parent_def = parent_def;
268+ self . with_parent ( parent_def, |this| visit:: walk_expr ( this, expr) ) ;
283269 }
284270
285271 fn visit_ty ( & mut self , ty : & ' a Ty ) {
0 commit comments