@@ -189,6 +189,11 @@ impure fn parse_ty_fn(ast.proto proto, parser p,
189
189
if ( p. peek ( ) == token. BINOP ( token. AND ) ) {
190
190
p. bump ( ) ;
191
191
mode = ast. alias ;
192
+
193
+ if ( p. peek ( ) == token. MUTABLE ) {
194
+ p. bump ( ) ;
195
+ // TODO: handle mutable alias args
196
+ }
192
197
} else {
193
198
mode = ast. val ;
194
199
}
@@ -262,10 +267,16 @@ impure fn parse_ty_obj(parser p, &mutable ast.span hi) -> ast.ty_ {
262
267
ret ast. ty_obj ( meths. node ) ;
263
268
}
264
269
270
+ impure fn parse_mt ( parser p) -> ast . mt {
271
+ auto mut = parse_mutability ( p) ;
272
+ auto t = parse_ty ( p) ;
273
+ ret rec( ty=t, mut=mut) ;
274
+ }
275
+
265
276
impure fn parse_ty_field ( parser p) -> ast. ty_field {
266
- auto ty = parse_ty ( p) ;
277
+ auto mt = parse_mt ( p) ;
267
278
auto id = parse_ident ( p) ;
268
- ret rec( ident=id, ty=ty ) ;
279
+ ret rec( ident=id, mt=mt ) ;
269
280
}
270
281
271
282
impure fn parse_constr_arg ( parser p) -> @ast. constr_arg {
@@ -360,25 +371,25 @@ impure fn parse_ty(parser p) -> @ast.ty {
360
371
361
372
case ( token. AT ) {
362
373
p. bump ( ) ;
363
- auto t0 = parse_ty ( p) ;
364
- hi = t0 . span ;
365
- t = ast. ty_box ( t0 ) ;
374
+ auto mt = parse_mt ( p) ;
375
+ hi = mt . ty . span ;
376
+ t = ast. ty_box ( mt ) ;
366
377
}
367
378
368
379
case ( token. VEC ) {
369
380
p. bump ( ) ;
370
381
expect ( p, token. LBRACKET ) ;
371
- t = ast. ty_vec ( parse_ty ( p) ) ;
382
+ t = ast. ty_vec ( parse_mt ( p) ) ;
372
383
hi = p. get_span ( ) ;
373
384
expect ( p, token. RBRACKET ) ;
374
385
}
375
386
376
387
case ( token. TUP ) {
377
388
p. bump ( ) ;
378
- auto f = parse_ty ; // FIXME: trans_const_lval bug
379
- auto elems = parse_seq[ @ ast. ty ] ( token. LPAREN ,
380
- token. RPAREN ,
381
- some ( token. COMMA ) , f, p) ;
389
+ auto f = parse_mt ; // FIXME: trans_const_lval bug
390
+ auto elems = parse_seq[ ast. mt ] ( token. LPAREN ,
391
+ token. RPAREN ,
392
+ some ( token. COMMA ) , f, p) ;
382
393
hi = elems. span ;
383
394
t = ast. ty_tup ( elems. node ) ;
384
395
}
@@ -395,13 +406,6 @@ impure fn parse_ty(parser p) -> @ast.ty {
395
406
t = ast. ty_rec ( elems. node ) ;
396
407
}
397
408
398
- case ( token. MUTABLE ) {
399
- p. bump ( ) ;
400
- auto t0 = parse_ty ( p) ;
401
- hi = t0. span ;
402
- t = ast. ty_mutable ( t0) ;
403
- }
404
-
405
409
case ( token. FN ) {
406
410
auto flo = p. get_span ( ) ;
407
411
p. bump ( ) ;
@@ -463,20 +467,22 @@ impure fn parse_arg(parser p) -> ast.arg {
463
467
if ( p. peek ( ) == token. BINOP ( token. AND ) ) {
464
468
m = ast. alias ;
465
469
p. bump ( ) ;
470
+
471
+ if ( p. peek ( ) == token. MUTABLE ) {
472
+ // TODO: handle mutable alias args
473
+ p. bump ( ) ;
474
+ }
466
475
}
467
476
let @ast. ty t = parse_ty ( p) ;
468
477
let ast. ident i = parse_ident ( p) ;
469
478
ret rec( mode=m, ty=t, ident=i, id=p. next_def_id ( ) ) ;
470
479
}
471
480
472
- impure fn parse_seq[ T ] ( token. token bra,
473
- token. token ket,
474
- option. t [ token. token ] sep,
475
- ( impure fn( parser) -> T ) f,
476
- parser p) -> util. common . spanned [ vec[ T ] ] {
481
+ impure fn parse_seq_to_end[ T ] ( token. token ket,
482
+ option. t [ token. token ] sep,
483
+ ( impure fn( parser) -> T ) f,
484
+ parser p) -> vec[ T ] {
477
485
let bool first = true ;
478
- auto lo = p. get_span ( ) ;
479
- expect ( p, bra) ;
480
486
let vec[ T ] v = vec ( ) ;
481
487
while ( p. peek ( ) != ket) {
482
488
alt ( sep) {
@@ -494,9 +500,20 @@ impure fn parse_seq[T](token.token bra,
494
500
let T t = f ( p) ;
495
501
v += vec ( t) ;
496
502
}
497
- auto hi = p. get_span ( ) ;
498
503
expect ( p, ket) ;
499
- ret spanned( lo, hi, v) ;
504
+ ret v;
505
+ }
506
+
507
+ impure fn parse_seq[ T ] ( token. token bra,
508
+ token. token ket,
509
+ option. t [ token. token ] sep,
510
+ ( impure fn( parser) -> T ) f,
511
+ parser p) -> util. common . spanned [ vec[ T ] ] {
512
+ auto lo = p. get_span ( ) ;
513
+ expect ( p, bra) ;
514
+ auto result = parse_seq_to_end[ T ] ( ket, sep, f, p) ;
515
+ auto hi = p. get_span ( ) ;
516
+ ret spanned( lo, hi, result) ;
500
517
}
501
518
502
519
impure fn parse_lit ( parser p) -> ast . lit {
@@ -667,12 +684,15 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
667
684
case ( token. VEC ) {
668
685
p. bump ( ) ;
669
686
auto pf = parse_expr;
670
- auto es = parse_seq[ @ast. expr ] ( token. LPAREN ,
671
- token. RPAREN ,
672
- some ( token. COMMA ) ,
673
- pf, p) ;
674
- hi = es. span ;
675
- ex = ast. expr_vec ( es. node , ast. ann_none ) ;
687
+
688
+ expect ( p, token. LPAREN ) ;
689
+ auto mut = parse_mutability ( p) ;
690
+
691
+ auto es = parse_seq_to_end[ @ast. expr ] ( token. RPAREN ,
692
+ some ( token. COMMA ) ,
693
+ pf, p) ;
694
+ hi = p. get_span ( ) ;
695
+ ex = ast. expr_vec ( es, mut, ast. ann_none ) ;
676
696
}
677
697
678
698
case ( token. REC ) {
@@ -1004,13 +1024,6 @@ impure fn parse_prefix_expr(parser p) -> @ast.expr {
1004
1024
ex = ast. expr_unary ( ast. box , e, ast. ann_none ) ;
1005
1025
}
1006
1026
1007
- case ( token. MUTABLE ) {
1008
- p. bump ( ) ;
1009
- auto e = parse_prefix_expr ( p) ;
1010
- hi = e. span ;
1011
- ex = ast. expr_unary ( ast. _mutable , e, ast. ann_none ) ;
1012
- }
1013
-
1014
1027
case ( _) {
1015
1028
ret parse_dot_or_call_expr ( p) ;
1016
1029
}
@@ -1558,7 +1571,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
1558
1571
}
1559
1572
case ( ast. stmt_expr ( ?e) ) {
1560
1573
alt ( e. node ) {
1561
- case ( ast. expr_vec ( _, _) ) { ret true ; }
1574
+ case ( ast. expr_vec ( _, _, _ ) ) { ret true ; }
1562
1575
case ( ast. expr_tup ( _, _) ) { ret true ; }
1563
1576
case ( ast. expr_rec ( _, _, _) ) { ret true ; }
1564
1577
case ( ast. expr_call ( _, _, _) ) { ret true ; }
@@ -1722,6 +1735,7 @@ impure fn parse_item_fn_or_iter(parser p, ast.effect eff) -> @ast.item {
1722
1735
1723
1736
1724
1737
impure fn parse_obj_field ( parser p) -> ast. obj_field {
1738
+ auto mut = parse_mutability ( p) ; // TODO: store this, use it in typeck
1725
1739
auto ty = parse_ty ( p) ;
1726
1740
auto ident = parse_ident ( p) ;
1727
1741
ret rec( ty=ty, ident=ident, id=p. next_def_id ( ) , ann=ast. ann_none ) ;
0 commit comments