@@ -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