Skip to content

Commit 9b50011

Browse files
committed
Parse type inferred lambda-block expressions.
1 parent 814bf41 commit 9b50011

File tree

1 file changed

+41
-7
lines changed

1 file changed

+41
-7
lines changed

src/comp/syntax/parse/parser.rs

+41-7
Original file line numberDiff line numberDiff line change
@@ -600,16 +600,28 @@ fn parse_ty(p: &parser, colons_before_params: bool) -> @ast::ty {
600600
ret parse_ty_postfix(t, p, colons_before_params);
601601
}
602602

603-
fn parse_arg(p: &parser) -> ast::arg {
604-
let m: ast::mode = ast::val;
605-
let i: ast::ident = parse_value_ident(p);
606-
expect(p, token::COLON);
603+
fn parse_arg_mode(p: &parser) -> ast::mode {
607604
if eat(p, token::BINOP(token::AND)) {
608-
m = ast::alias(eat_word(p, "mutable"));
605+
ast::alias(eat_word(p, "mutable"))
609606
} else if eat(p, token::BINOP(token::MINUS)) {
610-
m = ast::move;
607+
ast::move
608+
} else {
609+
ast::val
611610
}
612-
let t: @ast::ty = parse_ty(p, false);
611+
}
612+
613+
fn parse_arg(p: &parser) -> ast::arg {
614+
let i = parse_value_ident(p);
615+
expect(p, token::COLON);
616+
let m = parse_arg_mode(p);
617+
let t = parse_ty(p, false);
618+
ret {mode: m, ty: t, ident: i, id: p.get_id()};
619+
}
620+
621+
fn parse_fn_block_arg(p: &parser) -> ast::arg {
622+
let m = parse_arg_mode(p);
623+
let i = parse_value_ident(p);
624+
let t = @spanned(p.get_lo_pos(), p.get_hi_pos(), ast::ty_infer);
613625
ret {mode: m, ty: t, ident: i, id: p.get_id()};
614626
}
615627

@@ -808,6 +820,8 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
808820
hi = p.get_hi_pos();
809821
expect(p, token::RBRACE);
810822
ex = ast::expr_rec(fields, base);
823+
} else if p.peek() == token::BINOP(token::OR) {
824+
ret parse_fn_block_expr(p);
811825
} else {
812826
let blk = parse_block_tail(p, lo);
813827
ret mk_expr(p, blk.span.lo, blk.span.hi, ast::expr_block(blk));
@@ -1314,6 +1328,14 @@ fn parse_fn_expr(p: &parser, proto: ast::proto) -> @ast::expr {
13141328
ret mk_expr(p, lo, body.span.hi, ast::expr_fn(_fn));
13151329
}
13161330

1331+
fn parse_fn_block_expr(p: &parser) -> @ast::expr {
1332+
let lo = p.get_last_lo_pos();
1333+
let decl = parse_fn_block_decl(p);
1334+
let body = parse_block_tail(p, lo);
1335+
let _fn = {decl: decl, proto: ast::proto_block, body: body};
1336+
ret mk_expr(p, lo, body.span.hi, ast::expr_fn(_fn));
1337+
}
1338+
13171339
fn parse_else_expr(p: &parser) -> @ast::expr {
13181340
if eat_word(p, "if") {
13191341
ret parse_if_expr(p);
@@ -1794,6 +1816,18 @@ fn parse_fn_decl(p: &parser, purity: ast::purity, il: ast::inlineness)
17941816
}
17951817
}
17961818

1819+
fn parse_fn_block_decl(p: &parser) -> ast::fn_decl {
1820+
let inputs: ast::spanned[[ast::arg]] =
1821+
parse_seq(token::BINOP(token::OR), token::BINOP(token::OR),
1822+
some(token::COMMA), parse_fn_block_arg, p);
1823+
ret {inputs: inputs.node,
1824+
output: @spanned(p.get_lo_pos(), p.get_hi_pos(), ast::ty_infer),
1825+
purity: ast::impure_fn,
1826+
il: ast::il_normal,
1827+
cf: ast::return,
1828+
constraints: ~[]};
1829+
}
1830+
17971831
fn parse_fn(p: &parser, proto: ast::proto, purity: ast::purity,
17981832
il: ast::inlineness) -> ast::_fn {
17991833
let decl = parse_fn_decl(p, purity, il);

0 commit comments

Comments
 (0)