@@ -1268,27 +1268,71 @@ impl<'a> Parser<'a> {
12681268 ///
12691269 /// See `parse_self_param_with_attrs` to collect attributes.
12701270 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+
12711315 // Parse optional `self` parameter of a method.
12721316 // Only a limited set of initial token sequences is considered `self` parameters; anything
12731317 // else is parsed as a normal function parameter list, so some lookahead is required.
12741318 let eself_lo = self . token . span ;
12751319 let ( eself, eself_ident, eself_hi) = match self . token . kind {
12761320 token:: BinOp ( token:: And ) => {
1277- let eself = if self . is_isolated_self ( 1 ) {
1321+ let eself = if is_isolated_self ( self , 1 ) {
12781322 // `&self`
12791323 self . bump ( ) ;
12801324 SelfKind :: Region ( None , Mutability :: Immutable )
1281- } else if self . is_isolated_mut_self ( 1 ) {
1325+ } else if is_isolated_mut_self ( self , 1 ) {
12821326 // `&mut self`
12831327 self . bump ( ) ;
12841328 self . bump ( ) ;
12851329 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 ) {
12871331 // `&'lt self`
12881332 self . bump ( ) ;
12891333 let lt = self . expect_lifetime ( ) ;
12901334 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 ) {
12921336 // `&'lt mut self`
12931337 self . bump ( ) ;
12941338 let lt = self . expect_lifetime ( ) ;
@@ -1298,30 +1342,30 @@ impl<'a> Parser<'a> {
12981342 // `¬_self`
12991343 return Ok ( None ) ;
13001344 } ;
1301- ( eself, self . expect_self_ident ( ) , self . prev_span )
1345+ ( eself, expect_self_ident ( self ) , self . prev_span )
13021346 }
13031347 // `*self`
1304- token:: BinOp ( token:: Star ) if self . is_isolated_self ( 1 ) => {
1348+ token:: BinOp ( token:: Star ) if is_isolated_self ( self , 1 ) => {
13051349 self . bump ( ) ;
1306- self . recover_self_ptr ( ) ?
1350+ recover_self_ptr ( self ) ?
13071351 }
13081352 // `*mut self` and `*const self`
13091353 token:: BinOp ( token:: Star ) if
13101354 self . look_ahead ( 1 , |t| t. is_mutability ( ) )
1311- && self . is_isolated_self ( 2 ) =>
1355+ && is_isolated_self ( self , 2 ) =>
13121356 {
13131357 self . bump ( ) ;
13141358 self . bump ( ) ;
1315- self . recover_self_ptr ( ) ?
1359+ recover_self_ptr ( self ) ?
13161360 }
13171361 // `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 ) ?
13201364 }
13211365 // `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 ) => {
13231367 self . bump ( ) ;
1324- self . parse_self_possibly_typed ( Mutability :: Mutable ) ?
1368+ parse_self_possibly_typed ( self , Mutability :: Mutable ) ?
13251369 }
13261370 _ => return Ok ( None ) ,
13271371 } ;
@@ -1345,51 +1389,6 @@ impl<'a> Parser<'a> {
13451389 self . look_ahead ( offset + 1 , |t| t == & token:: Colon )
13461390 }
13471391
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-
13931392 fn is_crate_vis ( & self ) -> bool {
13941393 self . token . is_keyword ( kw:: Crate ) && self . look_ahead ( 1 , |t| t != & token:: ModSep )
13951394 }
0 commit comments