about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-09-30 02:06:55 +0200
committerMazdak Farrokhzad <twingoow@gmail.com>2019-09-30 04:36:57 +0200
commitac454e9af9389bb41a06ab620599771dcb2e59b6 (patch)
tree8dac0426c290a3e9c873a8b41207b1e33f45df13 /src/libsyntax/parse
parentf688f8aedffcd802012b355c182dafbdf5e819f5 (diff)
downloadrust-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.rs48
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),
         };