Skip to content

Commit 5254ccc

Browse files
author
Jakub Wieczorek
committed
Update after the fall out from the syntax::ptr changes
1 parent e53f4a6 commit 5254ccc

File tree

2 files changed

+38
-32
lines changed

2 files changed

+38
-32
lines changed

src/librustc/middle/check_match.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ fn check_arms(cx: &MatchCheckCtxt, arms: &[(Vec<P<Pat>>, Option<&Expr>)], source
267267
// We don't want two, that's just confusing.
268268
} else {
269269
// find the first arm pattern so we can use its span
270-
let &(ref first_arm_pats, _) = &arms[0]; // we know there's at least 1 arm
271-
let first_pat = first_arm_pats.get(0); // and it's safe to assume 1 pat
270+
let &(ref first_arm_pats, _) = &arms[0];
271+
let first_pat = first_arm_pats.get(0);
272272
let span = first_pat.span;
273273
span_err!(cx.tcx.sess, span, E0162, "irrefutable if-let pattern");
274274
printed_if_let_err = true;

src/libsyntax/ext/expand.rs

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,6 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
7070
// Desugar ExprIfLet
7171
// From: `if let <pat> = <expr> <body> [<elseopt>]`
7272
ast::ExprIfLet(pat, expr, body, mut elseopt) => {
73-
let span = e.span;
74-
7573
// to:
7674
//
7775
// match <expr> {
@@ -90,23 +88,33 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
9088
let else_if_arms = {
9189
let mut arms = vec![];
9290
loop {
93-
// NOTE: replace with 'if let' after snapshot
94-
match elseopt {
95-
Some(els) => match els.node {
96-
// else if
97-
ast::ExprIf(cond, then, elseopt_) => {
98-
let pat_under = fld.cx.pat_wild(span);
99-
elseopt = elseopt_;
100-
arms.push(ast::Arm {
101-
attrs: vec![],
102-
pats: vec![pat_under],
103-
guard: Some(cond),
104-
body: fld.cx.expr_block(then)
105-
});
106-
}
107-
_ => break
108-
},
109-
None => break
91+
let elseopt_continue = elseopt
92+
.and_then(|els| els.and_then(|els| match els.node {
93+
// else if
94+
ast::ExprIf(cond, then, elseopt) => {
95+
let pat_under = fld.cx.pat_wild(span);
96+
arms.push(ast::Arm {
97+
attrs: vec![],
98+
pats: vec![pat_under],
99+
guard: Some(cond),
100+
body: fld.cx.expr_block(then)
101+
});
102+
elseopt.map(|elseopt| (elseopt, true))
103+
}
104+
_ => Some((P(els), false))
105+
}));
106+
match elseopt_continue {
107+
Some((e, true)) => {
108+
elseopt = Some(e);
109+
}
110+
Some((e, false)) => {
111+
elseopt = Some(e);
112+
break;
113+
}
114+
None => {
115+
elseopt = None;
116+
break;
117+
}
110118
}
111119
}
112120
arms
@@ -115,10 +123,7 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
115123
// `_ => [<elseopt> | ()]`
116124
let else_arm = {
117125
let pat_under = fld.cx.pat_wild(span);
118-
let else_expr = match elseopt {
119-
Some(els) => els,
120-
None => fld.cx.expr_lit(span, ast::LitNil)
121-
};
126+
let else_expr = elseopt.unwrap_or_else(|| fld.cx.expr_lit(span, ast::LitNil));
122127
fld.cx.arm(span, vec![pat_under], else_expr)
123128
};
124129

@@ -133,23 +138,24 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
133138

134139
// Desugar support for ExprIfLet in the ExprIf else position
135140
ast::ExprIf(cond, blk, elseopt) => {
136-
let elseopt = elseopt.map(|els| match els.node {
141+
let elseopt = elseopt.map(|els| els.and_then(|els| match els.node {
137142
ast::ExprIfLet(..) => {
138143
// wrap the if-let expr in a block
144+
let span = els.span;
139145
let blk = P(ast::Block {
140146
view_items: vec![],
141147
stmts: vec![],
142-
expr: Some(els),
148+
expr: Some(P(els)),
143149
id: ast::DUMMY_NODE_ID,
144150
rules: ast::DefaultBlock,
145-
span: els.span
151+
span: span
146152
});
147153
fld.cx.expr_block(blk)
148154
}
149-
_ => els
150-
});
151-
let if_expr = fld.cx.expr(e.span, ast::ExprIf(cond, blk, elseopt));
152-
noop_fold_expr(if_expr, fld)
155+
_ => P(els)
156+
}));
157+
let if_expr = fld.cx.expr(span, ast::ExprIf(cond, blk, elseopt));
158+
if_expr.map(|e| noop_fold_expr(e, fld))
153159
}
154160

155161
ast::ExprLoop(loop_block, opt_ident) => {

0 commit comments

Comments
 (0)