@@ -2954,6 +2954,8 @@ impl<'a> Parser<'a> {
29542954 }
29552955 _ => unreachable ! ( ) ,
29562956 } ;
2957+ // is lifetime `n` tokens ahead?
2958+ let is_lifetime = |this : & Self , n| this. look_ahead ( n, |t| t. is_lifetime ( ) ) ;
29572959 // Is `self` `n` tokens ahead?
29582960 let is_isolated_self = |this : & Self , n| {
29592961 this. is_keyword_ahead ( n, & [ kw:: SelfLower ] )
@@ -3023,60 +3025,35 @@ impl<'a> Parser<'a> {
30233025 let eself_lo = self . token . span ;
30243026 let ( eself, eself_ident, eself_hi) = match self . token . uninterpolate ( ) . kind {
30253027 token:: And => {
3026- let eself = if is_isolated_self ( self , 1 ) {
3027- // `&self`
3028- self . bump ( ) ;
3029- SelfKind :: Region ( None , Mutability :: Not )
3030- } else if is_isolated_mut_self ( self , 1 ) {
3031- // `&mut self`
3032- self . bump ( ) ;
3033- self . bump ( ) ;
3034- SelfKind :: Region ( None , Mutability :: Mut )
3035- } else if is_isolated_pin_const_self ( self , 1 ) {
3036- // `&pin const self`
3028+ let has_lifetime = is_lifetime ( self , 1 ) ;
3029+ let skip_lifetime_count = has_lifetime as usize ;
3030+ let eself = if is_isolated_self ( self , skip_lifetime_count + 1 ) {
3031+ // `&{'lt} self`
30373032 self . bump ( ) ; // &
3038- self . psess . gated_spans . gate ( sym:: pin_ergonomics, self . token . span ) ;
3039- self . bump ( ) ; // pin
3040- self . bump ( ) ; // const
3041- SelfKind :: Pinned ( None , Mutability :: Not )
3042- } else if is_isolated_pin_mut_self ( self , 1 ) {
3043- // `&pin mut self`
3033+ let lifetime = has_lifetime. then ( || self . expect_lifetime ( ) ) ;
3034+ SelfKind :: Region ( lifetime, Mutability :: Not )
3035+ } else if is_isolated_mut_self ( self , skip_lifetime_count + 1 ) {
3036+ // `&{'lt} mut self`
30443037 self . bump ( ) ; // &
3045- self . psess . gated_spans . gate ( sym:: pin_ergonomics, self . token . span ) ;
3046- self . bump ( ) ; // pin
3038+ let lifetime = has_lifetime. then ( || self . expect_lifetime ( ) ) ;
30473039 self . bump ( ) ; // mut
3048- SelfKind :: Pinned ( None , Mutability :: Mut )
3049- } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) && is_isolated_self ( self , 2 ) {
3050- // `&'lt self`
3051- self . bump ( ) ;
3052- let lt = self . expect_lifetime ( ) ;
3053- SelfKind :: Region ( Some ( lt) , Mutability :: Not )
3054- } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) && is_isolated_mut_self ( self , 2 ) {
3055- // `&'lt mut self`
3056- self . bump ( ) ;
3057- let lt = self . expect_lifetime ( ) ;
3058- self . bump ( ) ;
3059- SelfKind :: Region ( Some ( lt) , Mutability :: Mut )
3060- } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) )
3061- && is_isolated_pin_const_self ( self , 2 )
3062- {
3063- // `&'lt pin const self`
3040+ SelfKind :: Region ( lifetime, Mutability :: Mut )
3041+ } else if is_isolated_pin_const_self ( self , skip_lifetime_count + 1 ) {
3042+ // `&{'lt} pin const self`
30643043 self . bump ( ) ; // &
3065- let lt = self . expect_lifetime ( ) ;
3044+ let lifetime = has_lifetime . then ( || self . expect_lifetime ( ) ) ;
30663045 self . psess . gated_spans . gate ( sym:: pin_ergonomics, self . token . span ) ;
30673046 self . bump ( ) ; // pin
30683047 self . bump ( ) ; // const
3069- SelfKind :: Pinned ( Some ( lt) , Mutability :: Not )
3070- } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) )
3071- && is_isolated_pin_mut_self ( self , 2 )
3072- {
3073- // `&'lt pin mut self`
3048+ SelfKind :: Pinned ( lifetime, Mutability :: Not )
3049+ } else if is_isolated_pin_mut_self ( self , skip_lifetime_count + 1 ) {
3050+ // `&{'lt} pin mut self`
30743051 self . bump ( ) ; // &
3075- let lt = self . expect_lifetime ( ) ;
3052+ let lifetime = has_lifetime . then ( || self . expect_lifetime ( ) ) ;
30763053 self . psess . gated_spans . gate ( sym:: pin_ergonomics, self . token . span ) ;
30773054 self . bump ( ) ; // pin
30783055 self . bump ( ) ; // mut
3079- SelfKind :: Pinned ( Some ( lt ) , Mutability :: Mut )
3056+ SelfKind :: Pinned ( lifetime , Mutability :: Mut )
30803057 } else {
30813058 // `¬_self`
30823059 return Ok ( None ) ;
0 commit comments