Skip to content

Commit 4306d00

Browse files
committed
syntax refactor parse_self_param (4)
1 parent ac454e9 commit 4306d00

File tree

2 files changed

+37
-30
lines changed

2 files changed

+37
-30
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,17 @@ impl<'a> Parser<'a> {
10631063
}
10641064
}
10651065

1066+
/// Possibly parses mutability (`const` or `mut`).
1067+
fn parse_const_or_mut(&mut self) -> Option<Mutability> {
1068+
if self.eat_keyword(kw::Mut) {
1069+
Some(Mutability::Mutable)
1070+
} else if self.eat_keyword(kw::Const) {
1071+
Some(Mutability::Immutable)
1072+
} else {
1073+
None
1074+
}
1075+
}
1076+
10661077
fn parse_field_name(&mut self) -> PResult<'a, Ident> {
10671078
if let token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) =
10681079
self.token.kind {
@@ -1276,6 +1287,17 @@ impl<'a> Parser<'a> {
12761287
}
12771288
}
12781289

1290+
/// Recover for the grammar `*self`, `*const self`, and `*mut self`.
1291+
fn recover_self_ptr(&mut self) -> PResult<'a, (ast::SelfKind, Ident, Span)> {
1292+
let msg = "cannot pass `self` by raw pointer";
1293+
let span = self.token.span;
1294+
self.struct_span_err(span, msg)
1295+
.span_label(span, msg)
1296+
.emit();
1297+
1298+
Ok((SelfKind::Value(Mutability::Immutable), self.expect_self_ident(), self.prev_span))
1299+
}
1300+
12791301
/// Parse `self` or `self: TYPE`. We already know the current token is `self`.
12801302
fn parse_self_possibly_typed(&mut self, m: Mutability) -> PResult<'a, (SelfKind, Ident, Span)> {
12811303
let eself_ident = self.expect_self_ident();
@@ -1327,30 +1349,19 @@ impl<'a> Parser<'a> {
13271349
return Ok(None);
13281350
}, self.expect_self_ident(), self.prev_span)
13291351
}
1330-
token::BinOp(token::Star) => {
1331-
// `*self`
1332-
// `*const self`
1333-
// `*mut self`
1334-
// `*not_self`
1335-
// Emit special error for `self` cases.
1336-
let msg = "cannot pass `self` by raw pointer";
1337-
(if self.is_isolated_self(1) {
1338-
self.bump();
1339-
self.struct_span_err(self.token.span, msg)
1340-
.span_label(self.token.span, msg)
1341-
.emit();
1342-
SelfKind::Value(Mutability::Immutable)
1343-
} else if self.look_ahead(1, |t| t.is_mutability()) &&
1344-
self.is_isolated_self(2) {
1345-
self.bump();
1346-
self.bump();
1347-
self.struct_span_err(self.token.span, msg)
1348-
.span_label(self.token.span, msg)
1349-
.emit();
1350-
SelfKind::Value(Mutability::Immutable)
1351-
} else {
1352-
return Ok(None);
1353-
}, self.expect_self_ident(), self.prev_span)
1352+
// `*self`
1353+
token::BinOp(token::Star) if self.is_isolated_self(1) => {
1354+
self.bump();
1355+
self.recover_self_ptr()?
1356+
}
1357+
// `*mut self` and `*const self`
1358+
token::BinOp(token::Star) if
1359+
self.look_ahead(1, |t| t.is_mutability())
1360+
&& self.is_isolated_self(2) =>
1361+
{
1362+
self.bump();
1363+
self.bump();
1364+
self.recover_self_ptr()?
13541365
}
13551366
// `self` and `self: TYPE`
13561367
token::Ident(..) if self.is_isolated_self(0) => {

src/libsyntax/parse/parser/ty.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -231,19 +231,15 @@ impl<'a> Parser<'a> {
231231
}
232232

233233
fn parse_ptr(&mut self) -> PResult<'a, MutTy> {
234-
let mutbl = if self.eat_keyword(kw::Mut) {
235-
Mutability::Mutable
236-
} else if self.eat_keyword(kw::Const) {
237-
Mutability::Immutable
238-
} else {
234+
let mutbl = self.parse_const_or_mut().unwrap_or_else(|| {
239235
let span = self.prev_span;
240236
let msg = "expected mut or const in raw pointer type";
241237
self.struct_span_err(span, msg)
242238
.span_label(span, msg)
243239
.help("use `*mut T` or `*const T` as appropriate")
244240
.emit();
245241
Mutability::Immutable
246-
};
242+
});
247243
let t = self.parse_ty_no_plus()?;
248244
Ok(MutTy { ty: t, mutbl })
249245
}

0 commit comments

Comments
 (0)