diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-09-30 02:06:55 +0200 |
|---|---|---|
| committer | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-09-30 04:36:57 +0200 |
| commit | ac454e9af9389bb41a06ab620599771dcb2e59b6 (patch) | |
| tree | 8dac0426c290a3e9c873a8b41207b1e33f45df13 /src/libsyntax/parse | |
| parent | f688f8aedffcd802012b355c182dafbdf5e819f5 (diff) | |
| download | rust-ac454e9af9389bb41a06ab620599771dcb2e59b6.tar.gz rust-ac454e9af9389bb41a06ab620599771dcb2e59b6.zip | |
syntax refactor `parse_self_param` (3)
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 70a7b4b01d8..ae4f181a119 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1276,6 +1276,18 @@ impl<'a> Parser<'a> { } } + /// Parse `self` or `self: TYPE`. We already know the current token is `self`. + fn parse_self_possibly_typed(&mut self, m: Mutability) -> PResult<'a, (SelfKind, Ident, Span)> { + let eself_ident = self.expect_self_ident(); + let eself_hi = self.prev_span; + let eself = if self.eat(&token::Colon) { + SelfKind::Explicit(self.parse_ty()?, m) + } else { + SelfKind::Value(m) + }; + Ok((eself, eself_ident, eself_hi)) + } + /// Returns the parsed optional self parameter and whether a self shortcut was used. /// /// See `parse_self_param_with_attrs` to collect attributes. @@ -1340,34 +1352,14 @@ impl<'a> Parser<'a> { return Ok(None); }, self.expect_self_ident(), self.prev_span) } - token::Ident(..) => { - if self.is_isolated_self(0) { - // `self` - // `self: TYPE` - let eself_ident = self.expect_self_ident(); - let eself_hi = self.prev_span; - (if self.eat(&token::Colon) { - let ty = self.parse_ty()?; - SelfKind::Explicit(ty, Mutability::Immutable) - } else { - SelfKind::Value(Mutability::Immutable) - }, eself_ident, eself_hi) - } else if self.token.is_keyword(kw::Mut) && - self.is_isolated_self(1) { - // `mut self` - // `mut self: TYPE` - self.bump(); - let eself_ident = self.expect_self_ident(); - let eself_hi = self.prev_span; - (if self.eat(&token::Colon) { - let ty = self.parse_ty()?; - SelfKind::Explicit(ty, Mutability::Mutable) - } else { - SelfKind::Value(Mutability::Mutable) - }, eself_ident, eself_hi) - } else { - return Ok(None); - } + // `self` and `self: TYPE` + token::Ident(..) if self.is_isolated_self(0) => { + self.parse_self_possibly_typed(Mutability::Immutable)? + } + // `mut self` and `mut self: TYPE` + token::Ident(..) if self.token.is_keyword(kw::Mut) && self.is_isolated_self(1) => { + self.bump(); + self.parse_self_possibly_typed(Mutability::Mutable)? } _ => return Ok(None), }; |
