]> git.lizzy.rs Git - rust.git/commitdiff
extract parse_prefix_expr
authorMazdak Farrokhzad <twingoow@gmail.com>
Sat, 7 Dec 2019 02:05:51 +0000 (03:05 +0100)
committerMazdak Farrokhzad <twingoow@gmail.com>
Mon, 23 Dec 2019 12:51:21 +0000 (13:51 +0100)
src/librustc_parse/parser/expr.rs

index 71912c7272bf34c769fc0cf06eff9d07f4bf3465..606714b5fa2e6e72ce484507a4ee342ae044bc70 100644 (file)
@@ -453,22 +453,7 @@ fn parse_prefix_expr(&mut self, already_parsed_attrs: Option<AttrVec>) -> PResul
                 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 @@ fn parse_prefix_expr(&mut self, already_parsed_attrs: Option<AttrVec>) -> PResul
         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(); // `-`