@@ -134,7 +134,7 @@ impl ExprCollector<'_> {
134134 self . make_expr ( expr, Err ( SyntheticSyntax ) )
135135 }
136136 fn empty_block ( & mut self ) -> ExprId {
137- self . alloc_expr_desugared ( Expr :: Block { statements : Vec :: new ( ) , tail : None } )
137+ self . alloc_expr_desugared ( Expr :: Block { statements : Vec :: new ( ) , tail : None , label : None } )
138138 }
139139 fn missing_expr ( & mut self ) -> ExprId {
140140 self . alloc_expr_desugared ( Expr :: Missing )
@@ -215,7 +215,16 @@ impl ExprCollector<'_> {
215215 ast:: Expr :: BlockExpr ( e) => self . collect_block ( e) ,
216216 ast:: Expr :: LoopExpr ( e) => {
217217 let body = self . collect_block_opt ( e. loop_body ( ) ) ;
218- self . alloc_expr ( Expr :: Loop { body } , syntax_ptr)
218+ self . alloc_expr (
219+ Expr :: Loop {
220+ body,
221+ label : e
222+ . label ( )
223+ . and_then ( |l| l. lifetime_token ( ) )
224+ . map ( |l| Name :: new_lifetime ( & l) ) ,
225+ } ,
226+ syntax_ptr,
227+ )
219228 }
220229 ast:: Expr :: WhileExpr ( e) => {
221230 let body = self . collect_block_opt ( e. loop_body ( ) ) ;
@@ -230,25 +239,56 @@ impl ExprCollector<'_> {
230239 let pat = self . collect_pat ( pat) ;
231240 let match_expr = self . collect_expr_opt ( condition. expr ( ) ) ;
232241 let placeholder_pat = self . missing_pat ( ) ;
233- let break_ = self . alloc_expr_desugared ( Expr :: Break { expr : None } ) ;
242+ let break_ =
243+ self . alloc_expr_desugared ( Expr :: Break { expr : None , label : None } ) ;
234244 let arms = vec ! [
235245 MatchArm { pat, expr: body, guard: None } ,
236246 MatchArm { pat: placeholder_pat, expr: break_, guard: None } ,
237247 ] ;
238248 let match_expr =
239249 self . alloc_expr_desugared ( Expr :: Match { expr : match_expr, arms } ) ;
240- return self . alloc_expr ( Expr :: Loop { body : match_expr } , syntax_ptr) ;
250+ return self . alloc_expr (
251+ Expr :: Loop {
252+ body : match_expr,
253+ label : e
254+ . label ( )
255+ . and_then ( |l| l. lifetime_token ( ) )
256+ . map ( |l| Name :: new_lifetime ( & l) ) ,
257+ } ,
258+ syntax_ptr,
259+ ) ;
241260 }
242261 } ,
243262 } ;
244263
245- self . alloc_expr ( Expr :: While { condition, body } , syntax_ptr)
264+ self . alloc_expr (
265+ Expr :: While {
266+ condition,
267+ body,
268+ label : e
269+ . label ( )
270+ . and_then ( |l| l. lifetime_token ( ) )
271+ . map ( |l| Name :: new_lifetime ( & l) ) ,
272+ } ,
273+ syntax_ptr,
274+ )
246275 }
247276 ast:: Expr :: ForExpr ( e) => {
248277 let iterable = self . collect_expr_opt ( e. iterable ( ) ) ;
249278 let pat = self . collect_pat_opt ( e. pat ( ) ) ;
250279 let body = self . collect_block_opt ( e. loop_body ( ) ) ;
251- self . alloc_expr ( Expr :: For { iterable, pat, body } , syntax_ptr)
280+ self . alloc_expr (
281+ Expr :: For {
282+ iterable,
283+ pat,
284+ body,
285+ label : e
286+ . label ( )
287+ . and_then ( |l| l. lifetime_token ( ) )
288+ . map ( |l| Name :: new_lifetime ( & l) ) ,
289+ } ,
290+ syntax_ptr,
291+ )
252292 }
253293 ast:: Expr :: CallExpr ( e) => {
254294 let callee = self . collect_expr_opt ( e. expr ( ) ) ;
@@ -301,13 +341,16 @@ impl ExprCollector<'_> {
301341 . unwrap_or ( Expr :: Missing ) ;
302342 self . alloc_expr ( path, syntax_ptr)
303343 }
304- ast:: Expr :: ContinueExpr ( _e ) => {
305- // FIXME: labels
306- self . alloc_expr ( Expr :: Continue , syntax_ptr)
307- }
344+ ast:: Expr :: ContinueExpr ( e ) => self . alloc_expr (
345+ Expr :: Continue { label : e . lifetime_token ( ) . map ( |l| Name :: new_lifetime ( & l ) ) } ,
346+ syntax_ptr,
347+ ) ,
308348 ast:: Expr :: BreakExpr ( e) => {
309349 let expr = e. expr ( ) . map ( |e| self . collect_expr ( e) ) ;
310- self . alloc_expr ( Expr :: Break { expr } , syntax_ptr)
350+ self . alloc_expr (
351+ Expr :: Break { expr, label : e. lifetime_token ( ) . map ( |l| Name :: new_lifetime ( & l) ) } ,
352+ syntax_ptr,
353+ )
311354 }
312355 ast:: Expr :: ParenExpr ( e) => {
313356 let inner = self . collect_expr_opt ( e. expr ( ) ) ;
@@ -529,7 +572,8 @@ impl ExprCollector<'_> {
529572 } )
530573 . collect ( ) ;
531574 let tail = block. expr ( ) . map ( |e| self . collect_expr ( e) ) ;
532- self . alloc_expr ( Expr :: Block { statements, tail } , syntax_node_ptr)
575+ let label = block. label ( ) . and_then ( |l| l. lifetime_token ( ) ) . map ( |t| Name :: new_lifetime ( & t) ) ;
576+ self . alloc_expr ( Expr :: Block { statements, tail, label } , syntax_node_ptr)
533577 }
534578
535579 fn collect_block_items ( & mut self , block : & ast:: BlockExpr ) {
0 commit comments