about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorJakub Wieczorek <jakub@jakub.cc>2014-09-29 22:45:26 +0200
committerJakub Wieczorek <jakub@jakub.cc>2014-09-30 18:54:03 +0200
commit5254ccc7c16f232ddd8788b8a3e7c89ffa82532a (patch)
treedb7e6a84d48507636001d3dd7093d53f5fa4fef4 /src/libsyntax
parente53f4a6b94623076a912df0c770c591d710c5de0 (diff)
downloadrust-5254ccc7c16f232ddd8788b8a3e7c89ffa82532a.tar.gz
rust-5254ccc7c16f232ddd8788b8a3e7c89ffa82532a.zip
Update after the fall out from the syntax::ptr changes
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/expand.rs66
1 files changed, 36 insertions, 30 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 76ca33cc2b8..fa3ccc8cf32 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -70,8 +70,6 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
         // Desugar ExprIfLet
         // From: `if let <pat> = <expr> <body> [<elseopt>]`
         ast::ExprIfLet(pat, expr, body, mut elseopt) => {
-            let span = e.span;
-
             // to:
             //
             //   match <expr> {
@@ -90,23 +88,33 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
             let else_if_arms = {
                 let mut arms = vec![];
                 loop {
-                    // NOTE: replace with 'if let' after snapshot
-                    match elseopt {
-                        Some(els) => match els.node {
-                            // else if
-                            ast::ExprIf(cond, then, elseopt_) => {
-                                let pat_under = fld.cx.pat_wild(span);
-                                elseopt = elseopt_;
-                                arms.push(ast::Arm {
-                                    attrs: vec![],
-                                    pats: vec![pat_under],
-                                    guard: Some(cond),
-                                    body: fld.cx.expr_block(then)
-                                });
-                            }
-                            _ => break
-                        },
-                        None => break
+                    let elseopt_continue = elseopt
+                        .and_then(|els| els.and_then(|els| match els.node {
+                        // else if
+                        ast::ExprIf(cond, then, elseopt) => {
+                            let pat_under = fld.cx.pat_wild(span);
+                            arms.push(ast::Arm {
+                                attrs: vec![],
+                                pats: vec![pat_under],
+                                guard: Some(cond),
+                                body: fld.cx.expr_block(then)
+                            });
+                            elseopt.map(|elseopt| (elseopt, true))
+                        }
+                        _ => Some((P(els), false))
+                    }));
+                    match elseopt_continue {
+                        Some((e, true)) => {
+                            elseopt = Some(e);
+                        }
+                        Some((e, false)) => {
+                            elseopt = Some(e);
+                            break;
+                        }
+                        None => {
+                            elseopt = None;
+                            break;
+                        }
                     }
                 }
                 arms
@@ -115,10 +123,7 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
             // `_ => [<elseopt> | ()]`
             let else_arm = {
                 let pat_under = fld.cx.pat_wild(span);
-                let else_expr = match elseopt {
-                    Some(els) => els,
-                    None => fld.cx.expr_lit(span, ast::LitNil)
-                };
+                let else_expr = elseopt.unwrap_or_else(|| fld.cx.expr_lit(span, ast::LitNil));
                 fld.cx.arm(span, vec![pat_under], else_expr)
             };
 
@@ -133,23 +138,24 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
 
         // Desugar support for ExprIfLet in the ExprIf else position
         ast::ExprIf(cond, blk, elseopt) => {
-            let elseopt = elseopt.map(|els| match els.node {
+            let elseopt = elseopt.map(|els| els.and_then(|els| match els.node {
                 ast::ExprIfLet(..) => {
                     // wrap the if-let expr in a block
+                    let span = els.span;
                     let blk = P(ast::Block {
                         view_items: vec![],
                         stmts: vec![],
-                        expr: Some(els),
+                        expr: Some(P(els)),
                         id: ast::DUMMY_NODE_ID,
                         rules: ast::DefaultBlock,
-                        span: els.span
+                        span: span
                     });
                     fld.cx.expr_block(blk)
                 }
-                _ => els
-            });
-            let if_expr = fld.cx.expr(e.span, ast::ExprIf(cond, blk, elseopt));
-            noop_fold_expr(if_expr, fld)
+                _ => P(els)
+            }));
+            let if_expr = fld.cx.expr(span, ast::ExprIf(cond, blk, elseopt));
+            if_expr.map(|e| noop_fold_expr(e, fld))
         }
 
         ast::ExprLoop(loop_block, opt_ident) => {