@@ -2954,6 +2954,8 @@ impl<'a> Parser<'a> {
2954
2954
}
2955
2955
_ => unreachable ! ( ) ,
2956
2956
} ;
2957
+ // is lifetime `n` tokens ahead?
2958
+ let is_lifetime = |this : & Self , n| this. look_ahead ( n, |t| t. is_lifetime ( ) ) ;
2957
2959
// Is `self` `n` tokens ahead?
2958
2960
let is_isolated_self = |this : & Self , n| {
2959
2961
this. is_keyword_ahead ( n, & [ kw:: SelfLower ] )
@@ -3023,60 +3025,35 @@ impl<'a> Parser<'a> {
3023
3025
let eself_lo = self . token . span ;
3024
3026
let ( eself, eself_ident, eself_hi) = match self . token . uninterpolate ( ) . kind {
3025
3027
token:: BinOp ( 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`
3037
3032
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`
3044
3037
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 ( ) ) ;
3047
3039
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`
3064
3043
self . bump ( ) ; // &
3065
- let lt = self . expect_lifetime ( ) ;
3044
+ let lifetime = has_lifetime . then ( || self . expect_lifetime ( ) ) ;
3066
3045
self . psess . gated_spans . gate ( sym:: pin_ergonomics, self . token . span ) ;
3067
3046
self . bump ( ) ; // pin
3068
3047
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`
3074
3051
self . bump ( ) ; // &
3075
- let lt = self . expect_lifetime ( ) ;
3052
+ let lifetime = has_lifetime . then ( || self . expect_lifetime ( ) ) ;
3076
3053
self . psess . gated_spans . gate ( sym:: pin_ergonomics, self . token . span ) ;
3077
3054
self . bump ( ) ; // pin
3078
3055
self . bump ( ) ; // mut
3079
- SelfKind :: Pinned ( Some ( lt ) , Mutability :: Mut )
3056
+ SelfKind :: Pinned ( lifetime , Mutability :: Mut )
3080
3057
} else {
3081
3058
// `¬_self`
3082
3059
return Ok ( None ) ;
0 commit comments