@@ -599,6 +599,12 @@ pub impl Parser {
599
599
}
600
600
}
601
601
602
+ fn region_from_lifetime( & self , l: & ast:: Lifetime ) -> @region {
603
+ // eventually `ast::region` should go away in favor of
604
+ // `ast::Lifetime`. For now we convert between them.
605
+ self . region_from_name( Some ( l. ident) )
606
+ }
607
+
602
608
fn parse_ty( & self , colons_before_params: bool ) -> @Ty {
603
609
maybe_whole!( self , nt_ty) ;
604
610
@@ -944,7 +950,7 @@ pub impl Parser {
944
950
945
951
// Parse the region parameter, if any, which will
946
952
// be written "foo/&x"
947
- let rp = {
953
+ let rp_slash = {
948
954
// Hack: avoid parsing vstores like /@ and /~. This is painful
949
955
// because the notation for region bounds and the notation for
950
956
// vstores is... um... the same. I guess that's my fault. This
@@ -961,9 +967,23 @@ pub impl Parser {
961
967
} ;
962
968
963
969
// Parse any lifetime or type parameters which may appear:
964
- let tps = self . parse_generic_values ( ) ;
970
+ let ( lifetimes , tps) = self . parse_generic_values ( ) ;
965
971
let hi = self . span . lo ;
966
972
973
+ let rp = match ( & rp_slash, & lifetimes) {
974
+ ( & Some ( _) , _) => rp_slash,
975
+ ( & None , v) => {
976
+ if v. len ( ) == 0 {
977
+ None
978
+ } else if v. len ( ) == 1 {
979
+ Some ( self . region_from_lifetime ( v. get ( 0 ) ) )
980
+ } else {
981
+ self . fatal ( fmt ! ( "Expected at most one \
982
+ lifetime name (for now)") ) ;
983
+ }
984
+ }
985
+ } ;
986
+
967
987
@ast:: path { span : mk_sp ( lo, hi) ,
968
988
rp : rp,
969
989
types : tps,
@@ -1316,11 +1336,11 @@ pub impl Parser {
1316
1336
token:: IDENT ( i, _) => {
1317
1337
hi = self . span . hi ;
1318
1338
self . bump ( ) ;
1319
- let tys = if self . eat ( & token:: MOD_SEP ) {
1339
+ let ( _ , tys) = if self . eat ( & token:: MOD_SEP ) {
1320
1340
self . expect ( & token:: LT ) ;
1321
1341
self . parse_generic_values_after_lt ( )
1322
1342
} else {
1323
- ~[ ]
1343
+ ( opt_vec :: Empty , ~[ ] )
1324
1344
} ;
1325
1345
1326
1346
// expr.f() method call
@@ -2776,20 +2796,24 @@ pub impl Parser {
2776
2796
}
2777
2797
}
2778
2798
2779
- fn parse_generic_values ( & self ) -> ~[ @Ty ] {
2799
+ fn parse_generic_values (
2800
+ & self ) -> ( OptVec < ast:: Lifetime > , ~[ @Ty ] )
2801
+ {
2780
2802
if !self . eat ( & token:: LT ) {
2781
- ~[ ]
2803
+ ( opt_vec :: Empty , ~[ ] )
2782
2804
} else {
2783
2805
self . parse_generic_values_after_lt ( )
2784
2806
}
2785
2807
}
2786
2808
2787
- fn parse_generic_values_after_lt ( & self ) -> ~[ @Ty ] {
2788
- let _lifetimes = self . parse_lifetimes ( ) ;
2809
+ fn parse_generic_values_after_lt (
2810
+ & self ) -> ( OptVec < ast:: Lifetime > , ~[ @Ty ] )
2811
+ {
2812
+ let lifetimes = self . parse_lifetimes ( ) ;
2789
2813
let result = self . parse_seq_to_gt (
2790
2814
Some ( token:: COMMA ) ,
2791
2815
|p| p. parse_ty ( false ) ) ;
2792
- opt_vec:: take_vec ( result)
2816
+ ( lifetimes , opt_vec:: take_vec ( result) )
2793
2817
}
2794
2818
2795
2819
fn parse_fn_decl ( & self , parse_arg_fn : fn ( & Parser ) -> arg_or_capture_item )
0 commit comments