@@ -70,8 +70,6 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
70
70
// Desugar ExprIfLet
71
71
// From: `if let <pat> = <expr> <body> [<elseopt>]`
72
72
ast:: ExprIfLet ( pat, expr, body, mut elseopt) => {
73
- let span = e. span ;
74
-
75
73
// to:
76
74
//
77
75
// match <expr> {
@@ -90,23 +88,33 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
90
88
let else_if_arms = {
91
89
let mut arms = vec ! [ ] ;
92
90
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
+ }
110
118
}
111
119
}
112
120
arms
@@ -115,10 +123,7 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
115
123
// `_ => [<elseopt> | ()]`
116
124
let else_arm = {
117
125
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 ) ) ;
122
127
fld. cx . arm ( span, vec ! [ pat_under] , else_expr)
123
128
} ;
124
129
@@ -133,23 +138,24 @@ pub fn expand_expr(e: P<ast::Expr>, fld: &mut MacroExpander) -> P<ast::Expr> {
133
138
134
139
// Desugar support for ExprIfLet in the ExprIf else position
135
140
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 {
137
142
ast:: ExprIfLet ( ..) => {
138
143
// wrap the if-let expr in a block
144
+ let span = els. span ;
139
145
let blk = P ( ast:: Block {
140
146
view_items : vec ! [ ] ,
141
147
stmts : vec ! [ ] ,
142
- expr : Some ( els) ,
148
+ expr : Some ( P ( els) ) ,
143
149
id : ast:: DUMMY_NODE_ID ,
144
150
rules : ast:: DefaultBlock ,
145
- span : els . span
151
+ span : span
146
152
} ) ;
147
153
fld. cx . expr_block ( blk)
148
154
}
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) )
153
159
}
154
160
155
161
ast:: ExprLoop ( loop_block, opt_ident) => {
0 commit comments