@@ -1276,6 +1276,18 @@ impl<'a> Parser<'a> {
12761276 }
12771277 }
12781278
1279+ /// Parse `self` or `self: TYPE`. We already know the current token is `self`.
1280+ fn parse_self_possibly_typed ( & mut self , m : Mutability ) -> PResult < ' a , ( SelfKind , Ident , Span ) > {
1281+ let eself_ident = self . expect_self_ident ( ) ;
1282+ let eself_hi = self . prev_span ;
1283+ let eself = if self . eat ( & token:: Colon ) {
1284+ SelfKind :: Explicit ( self . parse_ty ( ) ?, m)
1285+ } else {
1286+ SelfKind :: Value ( m)
1287+ } ;
1288+ Ok ( ( eself, eself_ident, eself_hi) )
1289+ }
1290+
12791291 /// Returns the parsed optional self parameter and whether a self shortcut was used.
12801292 ///
12811293 /// See `parse_self_param_with_attrs` to collect attributes.
@@ -1340,34 +1352,14 @@ impl<'a> Parser<'a> {
13401352 return Ok ( None ) ;
13411353 } , self . expect_self_ident ( ) , self . prev_span )
13421354 }
1343- token:: Ident ( ..) => {
1344- if self . is_isolated_self ( 0 ) {
1345- // `self`
1346- // `self: TYPE`
1347- let eself_ident = self . expect_self_ident ( ) ;
1348- let eself_hi = self . prev_span ;
1349- ( if self . eat ( & token:: Colon ) {
1350- let ty = self . parse_ty ( ) ?;
1351- SelfKind :: Explicit ( ty, Mutability :: Immutable )
1352- } else {
1353- SelfKind :: Value ( Mutability :: Immutable )
1354- } , eself_ident, eself_hi)
1355- } else if self . token . is_keyword ( kw:: Mut ) &&
1356- self . is_isolated_self ( 1 ) {
1357- // `mut self`
1358- // `mut self: TYPE`
1359- self . bump ( ) ;
1360- let eself_ident = self . expect_self_ident ( ) ;
1361- let eself_hi = self . prev_span ;
1362- ( if self . eat ( & token:: Colon ) {
1363- let ty = self . parse_ty ( ) ?;
1364- SelfKind :: Explicit ( ty, Mutability :: Mutable )
1365- } else {
1366- SelfKind :: Value ( Mutability :: Mutable )
1367- } , eself_ident, eself_hi)
1368- } else {
1369- return Ok ( None ) ;
1370- }
1355+ // `self` and `self: TYPE`
1356+ token:: Ident ( ..) if self . is_isolated_self ( 0 ) => {
1357+ self . parse_self_possibly_typed ( Mutability :: Immutable ) ?
1358+ }
1359+ // `mut self` and `mut self: TYPE`
1360+ token:: Ident ( ..) if self . token . is_keyword ( kw:: Mut ) && self . is_isolated_self ( 1 ) => {
1361+ self . bump ( ) ;
1362+ self . parse_self_possibly_typed ( Mutability :: Mutable ) ?
13711363 }
13721364 _ => return Ok ( None ) ,
13731365 } ;
0 commit comments