@@ -102,8 +102,8 @@ fn new_parser(parse_sess sess, ast::crate_cfg cfg, lexer::reader rdr,
102
102
fn look_ahead ( uint distance ) -> token:: token {
103
103
while ivec:: len ( buffer) < distance {
104
104
auto next = lexer:: next_token ( rdr) ;
105
- buffer =
106
- ~[ tup ( next. _0 , rec ( lo=next . _1 , hi=rdr . get_chpos ( ) ) ) ] + buffer;
105
+ auto sp = rec ( lo=next . _1 , hi=rdr . get_chpos ( ) ) ;
106
+ buffer = ~[ tup ( next. _0 , sp ) ] + buffer;
107
107
}
108
108
ret buffer. ( distance -1 u) . _0 ;
109
109
}
@@ -344,6 +344,15 @@ fn parse_ty_field(&parser p) -> ast::ty_field {
344
344
ret spanned( lo, mt. ty . span . hi , rec ( ident=id, mt=mt) ) ;
345
345
}
346
346
347
+ // FIXME rename to parse_ty_field once the other one is dropped
348
+ fn parse_ty_field_modern ( & parser p) -> ast:: ty_field {
349
+ auto lo = p. get_lo_pos ( ) ;
350
+ auto mut = parse_mutability ( p) ;
351
+ auto id = parse_ident ( p) ;
352
+ expect ( p, token:: COLON ) ;
353
+ auto ty = parse_ty ( p) ;
354
+ ret spanned( lo, ty. span . hi , rec ( ident=id, mt=rec ( ty=ty, mut=mut) ) ) ;
355
+ }
347
356
348
357
// if i is the jth ident in args, return j
349
358
// otherwise, fail
@@ -540,6 +549,16 @@ fn parse_ty(&parser p) -> @ast::ty {
540
549
auto mt = parse_mt ( p) ;
541
550
hi = mt. ty . span . hi ;
542
551
t = ast:: ty_ptr ( mt) ;
552
+ } else if ( p. peek ( ) == token:: LBRACE ) {
553
+ auto elems = parse_seq ( token:: LBRACE , token:: RBRACE ,
554
+ some ( token:: COMMA ) , parse_ty_field_modern, p) ;
555
+ hi = elems. span . hi ;
556
+ t = ast:: ty_rec ( elems. node ) ;
557
+ if ( p. peek ( ) == token:: COLON ) {
558
+ p. bump ( ) ;
559
+ t = ast:: ty_constr ( @spanned ( lo, hi, t) ,
560
+ parse_type_constraints ( p) ) ;
561
+ }
543
562
} else if ( eat_word ( p, "vec" ) ) {
544
563
expect ( p, token:: LBRACKET ) ;
545
564
t = ast:: ty_vec ( parse_mt ( p) ) ;
@@ -738,11 +757,11 @@ fn parse_mutability(&parser p) -> ast::mutability {
738
757
ret ast:: imm;
739
758
}
740
759
741
- fn parse_field ( & parser p) -> ast:: field {
760
+ fn parse_field ( & parser p, & token :: token sep ) -> ast:: field {
742
761
auto lo = p. get_lo_pos ( ) ;
743
762
auto m = parse_mutability ( p) ;
744
763
auto i = parse_ident ( p) ;
745
- expect ( p, token :: EQ ) ;
764
+ expect ( p, sep ) ;
746
765
auto e = parse_expr ( p) ;
747
766
ret spanned( lo, e. span . hi , rec ( mut=m, ident=i, expr=e) ) ;
748
767
}
@@ -783,8 +802,27 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
783
802
expect ( p, token:: RPAREN ) ;
784
803
ret mk_expr( p, lo, hi, e. node ) ;
785
804
} else if ( p. peek ( ) == token:: LBRACE ) {
786
- auto blk = parse_block ( p) ;
787
- ret mk_expr( p, blk. span . lo , blk. span . hi , ast:: expr_block ( blk) ) ;
805
+ p. bump ( ) ;
806
+ if ( is_word ( p, "mutable" ) ||
807
+ alt p. peek ( ) { token:: IDENT ( _, false ) { true } _ { false } } &&
808
+ p. look_ahead ( 1 u) == token:: COLON ) {
809
+ auto fields = ~[ parse_field ( p, token:: COLON ) ] ;
810
+ auto base = none;
811
+ while p. peek ( ) != token:: RBRACE {
812
+ if eat_word ( p, "with" ) {
813
+ base = some ( parse_expr ( p) ) ;
814
+ break ;
815
+ }
816
+ expect ( p, token:: COMMA ) ;
817
+ fields += ~[ parse_field ( p, token:: COLON ) ] ;
818
+ }
819
+ hi = p. get_hi_pos ( ) ;
820
+ expect ( p, token:: RBRACE ) ;
821
+ ex = ast:: expr_rec ( fields, base) ;
822
+ } else {
823
+ auto blk = parse_block_tail ( p) ;
824
+ ret mk_expr( p, blk. span . lo , blk. span . hi , ast:: expr_block ( blk) ) ;
825
+ }
788
826
} else if ( eat_word ( p, "if" ) ) {
789
827
ret parse_if_expr ( p) ;
790
828
} else if ( eat_word ( p, "for" ) ) {
@@ -883,7 +921,7 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
883
921
ex = ast:: expr_anon_obj ( ob) ;
884
922
} else if ( eat_word ( p, "rec" ) ) {
885
923
expect ( p, token:: LPAREN ) ;
886
- auto fields = ~[ parse_field ( p) ] ;
924
+ auto fields = ~[ parse_field ( p, token :: EQ ) ] ;
887
925
auto more = true ;
888
926
auto base = none;
889
927
while ( more) {
@@ -898,7 +936,7 @@ fn parse_bottom_expr(&parser p) -> @ast::expr {
898
936
more = false ;
899
937
} else if ( p. peek ( ) == token:: COMMA ) {
900
938
p. bump ( ) ;
901
- fields += ~[ parse_field ( p) ] ;
939
+ fields += ~[ parse_field ( p, token :: EQ ) ] ;
902
940
} else { unexpected ( p, p. peek ( ) ) ; }
903
941
}
904
942
ex = ast:: expr_rec ( fields, base) ;
0 commit comments