@@ -600,16 +600,28 @@ fn parse_ty(p: &parser, colons_before_params: bool) -> @ast::ty {
600
600
ret parse_ty_postfix ( t, p, colons_before_params) ;
601
601
}
602
602
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 {
607
604
if eat ( p, token:: BINOP ( token:: AND ) ) {
608
- m = ast:: alias ( eat_word ( p, "mutable" ) ) ;
605
+ ast:: alias ( eat_word ( p, "mutable" ) )
609
606
} else if eat ( p, token:: BINOP ( token:: MINUS ) ) {
610
- m = ast:: move;
607
+ ast:: move
608
+ } else {
609
+ ast:: val
611
610
}
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) ;
613
625
ret { mode : m, ty : t, ident : i, id : p. get_id ( ) } ;
614
626
}
615
627
@@ -808,6 +820,8 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
808
820
hi = p. get_hi_pos ( ) ;
809
821
expect ( p, token:: RBRACE ) ;
810
822
ex = ast:: expr_rec ( fields, base) ;
823
+ } else if p. peek ( ) == token:: BINOP ( token:: OR ) {
824
+ ret parse_fn_block_expr ( p) ;
811
825
} else {
812
826
let blk = parse_block_tail ( p, lo) ;
813
827
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 {
1314
1328
ret mk_expr( p, lo, body. span . hi , ast:: expr_fn ( _fn) ) ;
1315
1329
}
1316
1330
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
+
1317
1339
fn parse_else_expr ( p : & parser ) -> @ast:: expr {
1318
1340
if eat_word ( p, "if" ) {
1319
1341
ret parse_if_expr ( p) ;
@@ -1794,6 +1816,18 @@ fn parse_fn_decl(p: &parser, purity: ast::purity, il: ast::inlineness)
1794
1816
}
1795
1817
}
1796
1818
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
+
1797
1831
fn parse_fn ( p : & parser , proto : ast:: proto , purity : ast:: purity ,
1798
1832
il : ast:: inlineness ) -> ast:: _fn {
1799
1833
let decl = parse_fn_decl ( p, purity, il) ;
0 commit comments