@@ -1268,27 +1268,71 @@ impl<'a> Parser<'a> {
1268
1268
///
1269
1269
/// See `parse_self_param_with_attrs` to collect attributes.
1270
1270
fn parse_self_param ( & mut self ) -> PResult < ' a , Option < Param > > {
1271
+ // Extract an identifier *after* having confirmed that the token is one.
1272
+ let expect_self_ident = |this : & mut Self | {
1273
+ match this. token . kind {
1274
+ // Preserve hygienic context.
1275
+ token:: Ident ( name, _) => {
1276
+ let span = this. token . span ;
1277
+ this. bump ( ) ;
1278
+ Ident :: new ( name, span)
1279
+ }
1280
+ _ => unreachable ! ( ) ,
1281
+ }
1282
+ } ;
1283
+ // Is `self` `n` tokens ahead?
1284
+ let is_isolated_self = |this : & Self , n| {
1285
+ this. is_keyword_ahead ( n, & [ kw:: SelfLower ] )
1286
+ && this. look_ahead ( n + 1 , |t| t != & token:: ModSep )
1287
+ } ;
1288
+ // Is `mut self` `n` tokens ahead?
1289
+ let is_isolated_mut_self = |this : & Self , n| {
1290
+ this. is_keyword_ahead ( n, & [ kw:: Mut ] )
1291
+ && is_isolated_self ( this, n + 1 )
1292
+ } ;
1293
+ // Parse `self` or `self: TYPE`. We already know the current token is `self`.
1294
+ let parse_self_possibly_typed = |this : & mut Self , m| {
1295
+ let eself_ident = expect_self_ident ( this) ;
1296
+ let eself_hi = this. prev_span ;
1297
+ let eself = if this. eat ( & token:: Colon ) {
1298
+ SelfKind :: Explicit ( this. parse_ty ( ) ?, m)
1299
+ } else {
1300
+ SelfKind :: Value ( m)
1301
+ } ;
1302
+ Ok ( ( eself, eself_ident, eself_hi) )
1303
+ } ;
1304
+ // Recover for the grammar `*self`, `*const self`, and `*mut self`.
1305
+ let recover_self_ptr = |this : & mut Self | {
1306
+ let msg = "cannot pass `self` by raw pointer" ;
1307
+ let span = this. token . span ;
1308
+ this. struct_span_err ( span, msg)
1309
+ . span_label ( span, msg)
1310
+ . emit ( ) ;
1311
+
1312
+ Ok ( ( SelfKind :: Value ( Mutability :: Immutable ) , expect_self_ident ( this) , this. prev_span ) )
1313
+ } ;
1314
+
1271
1315
// Parse optional `self` parameter of a method.
1272
1316
// Only a limited set of initial token sequences is considered `self` parameters; anything
1273
1317
// else is parsed as a normal function parameter list, so some lookahead is required.
1274
1318
let eself_lo = self . token . span ;
1275
1319
let ( eself, eself_ident, eself_hi) = match self . token . kind {
1276
1320
token:: BinOp ( token:: And ) => {
1277
- let eself = if self . is_isolated_self ( 1 ) {
1321
+ let eself = if is_isolated_self ( self , 1 ) {
1278
1322
// `&self`
1279
1323
self . bump ( ) ;
1280
1324
SelfKind :: Region ( None , Mutability :: Immutable )
1281
- } else if self . is_isolated_mut_self ( 1 ) {
1325
+ } else if is_isolated_mut_self ( self , 1 ) {
1282
1326
// `&mut self`
1283
1327
self . bump ( ) ;
1284
1328
self . bump ( ) ;
1285
1329
SelfKind :: Region ( None , Mutability :: Mutable )
1286
- } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) && self . is_isolated_self ( 2 ) {
1330
+ } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) && is_isolated_self ( self , 2 ) {
1287
1331
// `&'lt self`
1288
1332
self . bump ( ) ;
1289
1333
let lt = self . expect_lifetime ( ) ;
1290
1334
SelfKind :: Region ( Some ( lt) , Mutability :: Immutable )
1291
- } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) && self . is_isolated_mut_self ( 2 ) {
1335
+ } else if self . look_ahead ( 1 , |t| t. is_lifetime ( ) ) && is_isolated_mut_self ( self , 2 ) {
1292
1336
// `&'lt mut self`
1293
1337
self . bump ( ) ;
1294
1338
let lt = self . expect_lifetime ( ) ;
@@ -1298,30 +1342,30 @@ impl<'a> Parser<'a> {
1298
1342
// `¬_self`
1299
1343
return Ok ( None ) ;
1300
1344
} ;
1301
- ( eself, self . expect_self_ident ( ) , self . prev_span )
1345
+ ( eself, expect_self_ident ( self ) , self . prev_span )
1302
1346
}
1303
1347
// `*self`
1304
- token:: BinOp ( token:: Star ) if self . is_isolated_self ( 1 ) => {
1348
+ token:: BinOp ( token:: Star ) if is_isolated_self ( self , 1 ) => {
1305
1349
self . bump ( ) ;
1306
- self . recover_self_ptr ( ) ?
1350
+ recover_self_ptr ( self ) ?
1307
1351
}
1308
1352
// `*mut self` and `*const self`
1309
1353
token:: BinOp ( token:: Star ) if
1310
1354
self . look_ahead ( 1 , |t| t. is_mutability ( ) )
1311
- && self . is_isolated_self ( 2 ) =>
1355
+ && is_isolated_self ( self , 2 ) =>
1312
1356
{
1313
1357
self . bump ( ) ;
1314
1358
self . bump ( ) ;
1315
- self . recover_self_ptr ( ) ?
1359
+ recover_self_ptr ( self ) ?
1316
1360
}
1317
1361
// `self` and `self: TYPE`
1318
- token:: Ident ( ..) if self . is_isolated_self ( 0 ) => {
1319
- self . parse_self_possibly_typed ( Mutability :: Immutable ) ?
1362
+ token:: Ident ( ..) if is_isolated_self ( self , 0 ) => {
1363
+ parse_self_possibly_typed ( self , Mutability :: Immutable ) ?
1320
1364
}
1321
1365
// `mut self` and `mut self: TYPE`
1322
- token:: Ident ( ..) if self . is_isolated_mut_self ( 0 ) => {
1366
+ token:: Ident ( ..) if is_isolated_mut_self ( self , 0 ) => {
1323
1367
self . bump ( ) ;
1324
- self . parse_self_possibly_typed ( Mutability :: Mutable ) ?
1368
+ parse_self_possibly_typed ( self , Mutability :: Mutable ) ?
1325
1369
}
1326
1370
_ => return Ok ( None ) ,
1327
1371
} ;
@@ -1345,51 +1389,6 @@ impl<'a> Parser<'a> {
1345
1389
self . look_ahead ( offset + 1 , |t| t == & token:: Colon )
1346
1390
}
1347
1391
1348
- fn is_isolated_self ( & self , n : usize ) -> bool {
1349
- self . is_keyword_ahead ( n, & [ kw:: SelfLower ] )
1350
- && self . look_ahead ( n + 1 , |t| t != & token:: ModSep )
1351
- }
1352
-
1353
- fn is_isolated_mut_self ( & self , n : usize ) -> bool {
1354
- self . is_keyword_ahead ( n, & [ kw:: Mut ] )
1355
- && self . is_isolated_self ( n + 1 )
1356
- }
1357
-
1358
- fn expect_self_ident ( & mut self ) -> Ident {
1359
- match self . token . kind {
1360
- // Preserve hygienic context.
1361
- token:: Ident ( name, _) => {
1362
- let span = self . token . span ;
1363
- self . bump ( ) ;
1364
- Ident :: new ( name, span)
1365
- }
1366
- _ => unreachable ! ( ) ,
1367
- }
1368
- }
1369
-
1370
- /// Recover for the grammar `*self`, `*const self`, and `*mut self`.
1371
- fn recover_self_ptr ( & mut self ) -> PResult < ' a , ( ast:: SelfKind , Ident , Span ) > {
1372
- let msg = "cannot pass `self` by raw pointer" ;
1373
- let span = self . token . span ;
1374
- self . struct_span_err ( span, msg)
1375
- . span_label ( span, msg)
1376
- . emit ( ) ;
1377
-
1378
- Ok ( ( SelfKind :: Value ( Mutability :: Immutable ) , self . expect_self_ident ( ) , self . prev_span ) )
1379
- }
1380
-
1381
- /// Parse `self` or `self: TYPE`. We already know the current token is `self`.
1382
- fn parse_self_possibly_typed ( & mut self , m : Mutability ) -> PResult < ' a , ( SelfKind , Ident , Span ) > {
1383
- let eself_ident = self . expect_self_ident ( ) ;
1384
- let eself_hi = self . prev_span ;
1385
- let eself = if self . eat ( & token:: Colon ) {
1386
- SelfKind :: Explicit ( self . parse_ty ( ) ?, m)
1387
- } else {
1388
- SelfKind :: Value ( m)
1389
- } ;
1390
- Ok ( ( eself, eself_ident, eself_hi) )
1391
- }
1392
-
1393
1392
fn is_crate_vis ( & self ) -> bool {
1394
1393
self . token . is_keyword ( kw:: Crate ) && self . look_ahead ( 1 , |t| t != & token:: ModSep )
1395
1394
}
0 commit comments