@@ -599,6 +599,12 @@ pub impl Parser {
599599 }
600600 }
601601
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+
602608 fn parse_ty( & self , colons_before_params: bool ) -> @Ty {
603609 maybe_whole!( self , nt_ty) ;
604610
@@ -944,7 +950,7 @@ pub impl Parser {
944950
945951 // Parse the region parameter, if any, which will
946952 // be written "foo/&x"
947- let rp = {
953+ let rp_slash = {
948954 // Hack: avoid parsing vstores like /@ and /~. This is painful
949955 // because the notation for region bounds and the notation for
950956 // vstores is... um... the same. I guess that's my fault. This
@@ -961,9 +967,23 @@ pub impl Parser {
961967 } ;
962968
963969 // Parse any lifetime or type parameters which may appear:
964- let tps = self . parse_generic_values ( ) ;
970+ let ( lifetimes , tps) = self . parse_generic_values ( ) ;
965971 let hi = self . span . lo ;
966972
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+
967987 @ast:: path { span : mk_sp ( lo, hi) ,
968988 rp : rp,
969989 types : tps,
@@ -1316,11 +1336,11 @@ pub impl Parser {
13161336 token:: IDENT ( i, _) => {
13171337 hi = self . span . hi ;
13181338 self . bump ( ) ;
1319- let tys = if self . eat ( & token:: MOD_SEP ) {
1339+ let ( _ , tys) = if self . eat ( & token:: MOD_SEP ) {
13201340 self . expect ( & token:: LT ) ;
13211341 self . parse_generic_values_after_lt ( )
13221342 } else {
1323- ~[ ]
1343+ ( opt_vec :: Empty , ~[ ] )
13241344 } ;
13251345
13261346 // expr.f() method call
@@ -2776,20 +2796,24 @@ pub impl Parser {
27762796 }
27772797 }
27782798
2779- fn parse_generic_values ( & self ) -> ~[ @Ty ] {
2799+ fn parse_generic_values (
2800+ & self ) -> ( OptVec < ast:: Lifetime > , ~[ @Ty ] )
2801+ {
27802802 if !self . eat ( & token:: LT ) {
2781- ~[ ]
2803+ ( opt_vec :: Empty , ~[ ] )
27822804 } else {
27832805 self . parse_generic_values_after_lt ( )
27842806 }
27852807 }
27862808
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 ( ) ;
27892813 let result = self . parse_seq_to_gt (
27902814 Some ( token:: COMMA ) ,
27912815 |p| p. parse_ty ( false ) ) ;
2792- opt_vec:: take_vec ( result)
2816+ ( lifetimes , opt_vec:: take_vec ( result) )
27932817 }
27942818
27952819 fn parse_fn_decl ( & self , parse_arg_fn : fn ( & Parser ) -> arg_or_capture_item )
0 commit comments