Skip to content

Commit b392781

Browse files
committed
def_collector: parent_def is no longer optional
1 parent e272946 commit b392781

File tree

1 file changed

+17
-31
lines changed

1 file changed

+17
-31
lines changed

src/librustc/hir/map/def_collector.rs

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ use syntax_pos::Span;
1111
/// Creates `DefId`s for nodes in the AST.
1212
pub struct DefCollector<'a> {
1313
definitions: &'a mut Definitions,
14-
parent_def: Option<DefIndex>,
14+
parent_def: DefIndex,
1515
expansion: Mark,
1616
}
1717

1818
impl<'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

Comments
 (0)