about summary refs log tree commit diff
path: root/src/librustc_parse/parser
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-12-07 02:37:03 +0100
committerMazdak Farrokhzad <twingoow@gmail.com>2019-12-23 13:48:45 +0100
commit84f9bf1a06e1ae9293a6f6a3caf66140f46beb46 (patch)
treef926a8fdc0f2da158163e4d95ec4cf286f531df1 /src/librustc_parse/parser
parentaf5ac23a23b3e17c47c216858620b01d3b16e471 (diff)
downloadrust-84f9bf1a06e1ae9293a6f6a3caf66140f46beb46.tar.gz
rust-84f9bf1a06e1ae9293a6f6a3caf66140f46beb46.zip
refactor parse_address_of -> parse_borrow_expr
Diffstat (limited to 'src/librustc_parse/parser')
-rw-r--r--src/librustc_parse/parser/expr.rs21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs
index 24c7654e8ad..141da96e834 100644
--- a/src/librustc_parse/parser/expr.rs
+++ b/src/librustc_parse/parser/expr.rs
@@ -481,7 +481,7 @@ impl<'a> Parser<'a> {
                 let (span, e) = self.interpolated_or_expr_span(e)?;
                 (lo.to(span), self.mk_unary(UnOp::Deref, e))
             }
-            token::BinOp(token::And) | token::AndAnd => self.parse_address_of(lo)?,
+            token::BinOp(token::And) | token::AndAnd => self.parse_borrow_expr(lo)?,
             token::Ident(..) if self.token.is_keyword(kw::Box) => {
                 self.bump();
                 let e = self.parse_prefix_expr(None);
@@ -637,20 +637,27 @@ impl<'a> Parser<'a> {
     }
 
     /// Parse `& mut? <expr>` or `& raw [ const | mut ] <expr>`.
-    fn parse_address_of(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
+    fn parse_borrow_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
         self.expect_and()?;
-        let (k, m) = if self.check_keyword(kw::Raw) && self.look_ahead(1, Token::is_mutability) {
+        let (borrow_kind, mutbl) = self.parse_borrow_modifiers(lo);
+        let expr = self.parse_prefix_expr(None);
+        let (span, expr) = self.interpolated_or_expr_span(expr)?;
+        Ok((lo.to(span), ExprKind::AddrOf(borrow_kind, mutbl, expr)))
+    }
+
+    /// Parse `mut?` or `raw [ const | mut ]`.
+    fn parse_borrow_modifiers(&mut self, lo: Span) -> (ast::BorrowKind, ast::Mutability) {
+        if self.check_keyword(kw::Raw) && self.look_ahead(1, Token::is_mutability) {
+            // `raw [ const | mut ]`.
             let found_raw = self.eat_keyword(kw::Raw);
             assert!(found_raw);
             let mutability = self.parse_const_or_mut().unwrap();
             self.sess.gated_spans.gate(sym::raw_ref_op, lo.to(self.prev_span));
             (ast::BorrowKind::Raw, mutability)
         } else {
+            // `mut?`
             (ast::BorrowKind::Ref, self.parse_mutability())
-        };
-        let e = self.parse_prefix_expr(None);
-        let (span, e) = self.interpolated_or_expr_span(e)?;
-        Ok((lo.to(span), ExprKind::AddrOf(k, m, e)))
+        }
     }
 
     /// Parses `a.b` or `a(13)` or `a[4]` or just `a`.