about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-12-07 03:05:51 +0100
committerMazdak Farrokhzad <twingoow@gmail.com>2019-12-23 13:51:21 +0100
commitefdea63c432fb1c88000bd1e12566641705fdb13 (patch)
tree71d942543d53dd41ca38a29494ed390969a2b18f
parent4cfcfe9e20f4034481e8ece86f9b2f39a564c0f5 (diff)
downloadrust-efdea63c432fb1c88000bd1e12566641705fdb13.tar.gz
rust-efdea63c432fb1c88000bd1e12566641705fdb13.zip
extract parse_prefix_expr
-rw-r--r--src/librustc_parse/parser/expr.rs33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/librustc_parse/parser/expr.rs b/src/librustc_parse/parser/expr.rs
index 71912c7272b..606714b5fa2 100644
--- a/src/librustc_parse/parser/expr.rs
+++ b/src/librustc_parse/parser/expr.rs
@@ -453,22 +453,7 @@ impl<'a> Parser<'a> {
                 let (span, e) = self.interpolated_or_expr_span(e)?;
                 (lo.to(span), self.mk_unary(UnOp::Not, e))
             }
-            // Suggest `!` for bitwise negation when encountering a `~`
-            token::Tilde => {
-                self.bump();
-                let e = self.parse_prefix_expr(None);
-                let (span, e) = self.interpolated_or_expr_span(e)?;
-                let span_of_tilde = lo;
-                self.struct_span_err(span_of_tilde, "`~` cannot be used as a unary operator")
-                    .span_suggestion_short(
-                        span_of_tilde,
-                        "use `!` to perform bitwise not",
-                        "!".to_owned(),
-                        Applicability::MachineApplicable,
-                    )
-                    .emit();
-                (lo.to(span), self.mk_unary(UnOp::Not, e))
-            }
+            token::Tilde => self.recover_tilde_expr(lo)?,
             token::BinOp(token::Minus) => self.parse_neg_expr(lo)?,
             token::BinOp(token::Star) => self.parse_deref_expr(lo)?,
             token::BinOp(token::And) | token::AndAnd => self.parse_borrow_expr(lo)?,
@@ -481,6 +466,22 @@ impl<'a> Parser<'a> {
         return Ok(self.mk_expr(lo.to(hi), ex, attrs));
     }
 
+    // Recover on `!` suggesting for bitwise negation instead.
+    fn recover_tilde_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
+        self.bump();
+        let expr = self.parse_prefix_expr(None);
+        let (span, expr) = self.interpolated_or_expr_span(expr)?;
+        self.struct_span_err(lo, "`~` cannot be used as a unary operator")
+            .span_suggestion_short(
+                lo,
+                "use `!` to perform bitwise not",
+                "!".to_owned(),
+                Applicability::MachineApplicable,
+            )
+            .emit();
+        Ok((lo.to(span), self.mk_unary(UnOp::Not, expr)))
+    }
+
     /// Parse `-expr`.
     fn parse_neg_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
         self.bump(); // `-`