@@ -272,7 +272,7 @@ fn parse_ty_fn(proto: ast::proto, p: &parser, lo: uint) -> ast::ty_ {
272
272
p. bump ( ) ;
273
273
mode = ast:: alias ( eat_word ( p, "mutable" ) ) ;
274
274
}
275
- let t = parse_ty ( p) ;
275
+ let t = parse_ty ( p, false ) ;
276
276
ret spanned( lo, t. span . hi , { mode: mode, ty: t} ) ;
277
277
}
278
278
let lo = p. get_lo_pos ( ) ;
@@ -337,7 +337,7 @@ fn parse_ty_obj(p: &parser, hi: &mutable uint) -> ast::ty_ {
337
337
338
338
fn parse_mt ( p : & parser ) -> ast:: mt {
339
339
let mut = parse_mutability( p) ;
340
- let t = parse_ty ( p) ;
340
+ let t = parse_ty ( p, false ) ;
341
341
ret { ty : t, mut : mut} ;
342
342
}
343
343
@@ -346,7 +346,7 @@ fn parse_ty_field(p: &parser) -> ast::ty_field {
346
346
let mut = parse_mutability( p) ;
347
347
let id = parse_ident ( p) ;
348
348
expect ( p, token:: COLON ) ;
349
- let ty = parse_ty ( p) ;
349
+ let ty = parse_ty ( p, false ) ;
350
350
ret spanned( lo, ty. span . hi , { ident : id, mt: { ty : ty, mut : mut} } ) ;
351
351
}
352
352
@@ -421,46 +421,52 @@ fn parse_type_constraints(p: &parser) -> [@ast::ty_constr] {
421
421
ret parse_constrs ( parse_constr_in_type, p) ;
422
422
}
423
423
424
- fn parse_ty_postfix ( orig_t : ast:: ty_ , p : & parser ) -> @ast:: ty {
424
+ fn parse_ty_postfix ( orig_t : ast:: ty_ , p : & parser , colons_before_params : bool )
425
+ -> @ast:: ty {
425
426
let lo = p. get_lo_pos ( ) ;
426
- if p. peek ( ) == token:: LBRACKET || p. peek ( ) == token:: LT {
427
- let end;
428
- if p. peek ( ) == token:: LBRACKET {
429
- end = token:: RBRACKET ;
430
- } else {
431
- end = token:: GT ;
432
- }
433
427
434
- // This is explicit type parameter instantiation.
428
+ let end;
429
+ if p. peek ( ) == token:: LBRACKET {
430
+ p. bump ( ) ;
431
+ end = token:: RBRACKET ;
432
+ } else if colons_before_params && p. peek ( ) == token:: MOD_SEP {
433
+ p. bump ( ) ;
434
+ expect ( p, token:: LT ) ;
435
+ end = token:: GT ;
436
+ } else if !colons_before_params && p. peek ( ) == token:: LT {
435
437
p. bump ( ) ;
438
+ end = token:: GT ;
439
+ } else {
440
+ ret @spanned ( lo, p. get_lo_pos ( ) , orig_t) ;
441
+ }
436
442
437
- let seq = parse_seq_to_end ( end, some ( token:: COMMA ) , parse_ty, p) ;
443
+ // If we're here, we have explicit type parameter instantiation.
444
+ let seq = parse_seq_to_end ( end, some ( token:: COMMA ) ,
445
+ bind parse_ty ( _, false ) , p) ;
438
446
439
- alt orig_t {
440
- ast : : ty_path ( pth, ann) {
441
- let hi = p. get_hi_pos ( ) ;
442
- ret @spanned ( lo, hi,
443
- ast:: ty_path ( spanned ( lo, hi,
444
- { global: pth. node . global ,
445
- idents: pth. node . idents ,
446
- types: seq} ) , ann) ) ;
447
- }
448
- _ {
449
- p. fatal ( "type parameter instantiation only allowed for paths" ) ;
450
- }
451
- }
447
+ alt orig_t {
448
+ ast : : ty_path ( pth, ann) {
449
+ let hi = p. get_hi_pos ( ) ;
450
+ ret @spanned ( lo, hi,
451
+ ast:: ty_path ( spanned ( lo, hi,
452
+ { global: pth. node . global ,
453
+ idents: pth. node . idents ,
454
+ types: seq} ) , ann) ) ;
455
+ }
456
+ _ {
457
+ p. fatal ( "type parameter instantiation only allowed for paths" ) ;
458
+ }
452
459
}
453
- ret @spanned ( lo, p. get_lo_pos ( ) , orig_t) ;
454
460
}
455
461
456
462
fn parse_ty_or_bang ( p : & parser ) -> ty_or_bang {
457
463
alt p. peek ( ) {
458
464
token:: NOT . { p . bump ( ) ; ret a_bang; }
459
- _ { ret a_ty( parse_ty ( p) ) ; }
465
+ _ { ret a_ty( parse_ty ( p, false ) ) ; }
460
466
}
461
467
}
462
468
463
- fn parse_ty ( p : & parser ) -> @ast:: ty {
469
+ fn parse_ty ( p : & parser , colons_before_params : bool ) -> @ast:: ty {
464
470
let lo = p. get_lo_pos ( ) ;
465
471
let hi = lo;
466
472
let t: ast:: ty_ ;
@@ -511,10 +517,10 @@ fn parse_ty(p: &parser) -> @ast::ty {
511
517
p. bump ( ) ;
512
518
t = ast:: ty_nil;
513
519
} else {
514
- let ts = ~[ parse_ty ( p) ] ;
520
+ let ts = ~[ parse_ty ( p, false ) ] ;
515
521
while p. peek ( ) == token:: COMMA {
516
522
p. bump ( ) ;
517
- ts += ~[ parse_ty ( p) ] ;
523
+ ts += ~[ parse_ty ( p, false ) ] ;
518
524
}
519
525
if ivec:: len ( ts) == 1 u {
520
526
t = ts. ( 0 ) . node ;
@@ -572,25 +578,25 @@ fn parse_ty(p: &parser) -> @ast::ty {
572
578
t = parse_ty_obj ( p, hi) ;
573
579
} else if ( eat_word ( p, "port" ) ) {
574
580
expect ( p, token:: LBRACKET ) ;
575
- t = ast:: ty_port ( parse_ty ( p) ) ;
581
+ t = ast:: ty_port ( parse_ty ( p, false ) ) ;
576
582
hi = p. get_hi_pos ( ) ;
577
583
expect ( p, token:: RBRACKET ) ;
578
584
} else if ( eat_word ( p, "chan" ) ) {
579
585
expect ( p, token:: LBRACKET ) ;
580
- t = ast:: ty_chan ( parse_ty ( p) ) ;
586
+ t = ast:: ty_chan ( parse_ty ( p, false ) ) ;
581
587
hi = p. get_hi_pos ( ) ;
582
588
expect ( p, token:: RBRACKET ) ;
583
589
} else if ( eat_word ( p, "mutable" ) ) {
584
590
p. warn ( "ignoring deprecated 'mutable' type constructor" ) ;
585
- let typ = parse_ty ( p) ;
591
+ let typ = parse_ty ( p, false ) ;
586
592
t = typ. node ;
587
593
hi = typ. span . hi ;
588
594
} else if ( p. peek ( ) == token:: MOD_SEP || is_ident ( p. peek ( ) ) ) {
589
595
let path = parse_path ( p) ;
590
596
t = ast:: ty_path ( path, p. get_id ( ) ) ;
591
597
hi = path. span . hi ;
592
598
} else { p. fatal ( "expecting type" ) ; }
593
- ret parse_ty_postfix ( t, p) ;
599
+ ret parse_ty_postfix ( t, p, colons_before_params ) ;
594
600
}
595
601
596
602
fn parse_arg ( p : & parser ) -> ast:: arg {
@@ -602,7 +608,7 @@ fn parse_arg(p: &parser) -> ast::arg {
602
608
} else if eat ( p, token:: BINOP ( token:: MINUS ) ) {
603
609
m = ast:: move;
604
610
}
605
- let t: @ast:: ty = parse_ty ( p) ;
611
+ let t: @ast:: ty = parse_ty ( p, false ) ;
606
612
ret { mode : m, ty : t, ident : i, id : p. get_id ( ) } ;
607
613
}
608
614
@@ -706,7 +712,11 @@ fn parse_path(p: &parser) -> ast::path {
706
712
ids += ~[ p. get_str ( i) ] ;
707
713
hi = p. get_hi_pos ( ) ;
708
714
p. bump ( ) ;
709
- if p. peek ( ) == token:: MOD_SEP { p. bump ( ) ; } else { break ; }
715
+ if p. peek ( ) == token:: MOD_SEP && p. look_ahead ( 1 u) != token:: LT {
716
+ p. bump ( ) ;
717
+ } else {
718
+ break ;
719
+ }
710
720
}
711
721
_ { break; }
712
722
}
@@ -720,7 +730,7 @@ fn parse_path_and_ty_param_substs(p: &parser) -> ast::path {
720
730
if p. peek ( ) == token:: LBRACKET {
721
731
let seq =
722
732
parse_seq ( token:: LBRACKET , token:: RBRACKET , some ( token:: COMMA ) ,
723
- parse_ty, p) ;
733
+ bind parse_ty ( _ , false ) , p) ;
724
734
let hi = seq. span . hi ;
725
735
path =
726
736
spanned ( lo, hi,
@@ -830,7 +840,7 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
830
840
ex = ast:: expr_vec ( es, mut, ast:: sk_rc) ;
831
841
} else if ( p. peek ( ) == token:: POUND_LT ) {
832
842
p. bump ( ) ;
833
- let ty = parse_ty ( p) ;
843
+ let ty = parse_ty ( p, false ) ;
834
844
expect ( p, token:: GT ) ;
835
845
836
846
/* hack: early return to take advantage of specialized function */
@@ -976,7 +986,7 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
976
986
let ty = @spanned ( lo, hi, ast:: ty_infer) ;
977
987
if token:: LBRACKET == p. peek ( ) {
978
988
expect ( p, token:: LBRACKET ) ;
979
- ty = parse_ty ( p) ;
989
+ ty = parse_ty ( p, false ) ;
980
990
expect ( p, token:: RBRACKET ) ;
981
991
}
982
992
expect ( p, token:: LPAREN ) ;
@@ -1201,7 +1211,7 @@ fn parse_more_binops(p: &parser, lhs: @ast::expr, min_prec: int) ->
1201
1211
}
1202
1212
}
1203
1213
if as_prec > min_prec && eat_word ( p, "as" ) {
1204
- let rhs = parse_ty ( p) ;
1214
+ let rhs = parse_ty ( p, true ) ;
1205
1215
let _as =
1206
1216
mk_expr ( p, lhs. span . lo , rhs. span . hi , ast:: expr_cast ( lhs, rhs) ) ;
1207
1217
ret parse_more_binops ( p, _as, min_prec) ;
@@ -1521,7 +1531,7 @@ fn parse_local(p: &parser, allow_init: bool) -> @ast::local {
1521
1531
let lo = p. get_lo_pos ( ) ;
1522
1532
let pat = parse_pat ( p) ;
1523
1533
let ty = @spanned ( lo, lo, ast:: ty_infer) ;
1524
- if eat ( p, token:: COLON ) { ty = parse_ty ( p) ; }
1534
+ if eat ( p, token:: COLON ) { ty = parse_ty ( p, false ) ; }
1525
1535
let init = if allow_init { parse_initializer ( p) } else { none } ;
1526
1536
ret @spanned ( lo, p. get_last_hi_pos ( ) ,
1527
1537
{ ty: ty,
@@ -1814,15 +1824,15 @@ fn parse_obj_field(p: &parser) -> ast::obj_field {
1814
1824
let mut = parse_mutability( p) ;
1815
1825
let ident = parse_value_ident ( p) ;
1816
1826
expect ( p, token:: COLON ) ;
1817
- let ty = parse_ty ( p) ;
1827
+ let ty = parse_ty ( p, false ) ;
1818
1828
ret { mut : mut, ty : ty, ident : ident, id : p. get_id ( ) } ;
1819
1829
}
1820
1830
1821
1831
fn parse_anon_obj_field ( p : & parser ) -> ast:: anon_obj_field {
1822
1832
let mut = parse_mutability( p) ;
1823
1833
let ident = parse_value_ident ( p) ;
1824
1834
expect ( p, token:: COLON ) ;
1825
- let ty = parse_ty ( p) ;
1835
+ let ty = parse_ty ( p, false ) ;
1826
1836
expect ( p, token:: EQ ) ;
1827
1837
let expr = parse_expr ( p) ;
1828
1838
ret { mut : mut, ty : ty, expr : expr, ident : ident, id : p. get_id ( ) } ;
@@ -1865,7 +1875,7 @@ fn parse_item_res(p: &parser, attrs: &[ast::attribute]) ->
1865
1875
expect ( p, token:: LPAREN ) ;
1866
1876
let arg_ident = parse_value_ident ( p) ;
1867
1877
expect ( p, token:: COLON ) ;
1868
- let t = parse_ty ( p) ;
1878
+ let t = parse_ty ( p, false ) ;
1869
1879
expect ( p, token:: RPAREN ) ;
1870
1880
let dtor = parse_block ( p) ;
1871
1881
let decl =
@@ -1909,7 +1919,7 @@ fn parse_item_const(p: &parser, attrs: &[ast::attribute]) -> @ast::item {
1909
1919
let lo = p. get_last_lo_pos ( ) ;
1910
1920
let id = parse_value_ident ( p) ;
1911
1921
expect ( p, token:: COLON ) ;
1912
- let ty = parse_ty ( p) ;
1922
+ let ty = parse_ty ( p, false ) ;
1913
1923
expect ( p, token:: EQ ) ;
1914
1924
let e = parse_expr ( p) ;
1915
1925
let hi = p. get_hi_pos ( ) ;
@@ -2031,7 +2041,7 @@ fn parse_item_type(p: &parser, attrs: &[ast::attribute]) -> @ast::item {
2031
2041
let t = parse_type_decl ( p) ;
2032
2042
let tps = parse_ty_params ( p) ;
2033
2043
expect ( p, token:: EQ ) ;
2034
- let ty = parse_ty ( p) ;
2044
+ let ty = parse_ty ( p, false ) ;
2035
2045
let hi = p. get_hi_pos ( ) ;
2036
2046
expect ( p, token:: SEMI ) ;
2037
2047
ret mk_item( p, t. lo , hi, t. ident , ast:: item_ty ( ty, tps) , attrs) ;
@@ -2048,7 +2058,7 @@ fn parse_item_tag(p: &parser, attrs: &[ast::attribute]) -> @ast::item {
2048
2058
p. fatal ( "found " + id + " in tag constructor position" ) ;
2049
2059
}
2050
2060
p. bump ( ) ;
2051
- let ty = parse_ty ( p) ;
2061
+ let ty = parse_ty ( p, false ) ;
2052
2062
expect ( p, token:: SEMI ) ;
2053
2063
let variant =
2054
2064
spanned ( ty. span . lo , ty. span . hi ,
@@ -2072,7 +2082,7 @@ fn parse_item_tag(p: &parser, attrs: &[ast::attribute]) -> @ast::item {
2072
2082
token:: LPAREN . {
2073
2083
let arg_tys =
2074
2084
parse_seq ( token:: LPAREN , token:: RPAREN ,
2075
- some ( token:: COMMA ) , parse_ty, p) ;
2085
+ some ( token:: COMMA ) , bind parse_ty ( _ , false ) , p) ;
2076
2086
for ty: @ast:: ty in arg_tys. node {
2077
2087
args += ~[ { ty: ty, id: p. get_id ( ) } ] ;
2078
2088
}
0 commit comments