Skip to content

Commit 30647d1

Browse files
committed
syntax: put helpers of parse_self_param in the method.
1 parent df298b4 commit 30647d1

File tree

1 file changed

+57
-58
lines changed

1 file changed

+57
-58
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 57 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -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
// `&not_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

Comments
 (0)