@@ -1276,6 +1276,18 @@ impl<'a> Parser<'a> {
1276
1276
}
1277
1277
}
1278
1278
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
+
1279
1291
/// Returns the parsed optional self parameter and whether a self shortcut was used.
1280
1292
///
1281
1293
/// See `parse_self_param_with_attrs` to collect attributes.
@@ -1340,34 +1352,14 @@ impl<'a> Parser<'a> {
1340
1352
return Ok ( None ) ;
1341
1353
} , self . expect_self_ident ( ) , self . prev_span )
1342
1354
}
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 ) ?
1371
1363
}
1372
1364
_ => return Ok ( None ) ,
1373
1365
} ;
0 commit comments