syntax: implement labelled breaks for for.

`for` desugars to `loop` so it is trivial to just desugar to `loop` while
retaining any label.
This commit is contained in:
Huon Wilson
2013-09-08 22:08:01 +10:00
parent b609d022c4
commit 07351b44c6
9 changed files with 32 additions and 16 deletions

View File

@@ -113,7 +113,7 @@ pub fn expand_expr(extsbox: @mut SyntaxEnv,
// Desugar expr_for_loop
// From: `for <src_pat> in <src_expr> <src_loop_block>`
ast::ExprForLoop(src_pat, src_expr, ref src_loop_block) => {
ast::ExprForLoop(src_pat, src_expr, ref src_loop_block, opt_ident) => {
let src_pat = src_pat.clone();
let src_expr = src_expr.clone();
@@ -257,7 +257,7 @@ pub fn expand_expr(extsbox: @mut SyntaxEnv,
// `loop { ... }`
let loop_block = {
let loop_body_block = mk_block(cx, [match_stmt], None, span);
let loop_body_expr = mk_expr(cx, span, ast::ExprLoop(loop_body_block, None));
let loop_body_expr = mk_expr(cx, span, ast::ExprLoop(loop_body_block, opt_ident));
let loop_body_stmt = @spanned(lo, hi, ast::StmtExpr(loop_body_expr, cx.next_id()));
mk_block(cx, [iter_decl_stmt,
loop_body_stmt],