]> git.lizzy.rs Git - rust.git/commitdiff
Point at last valid token on failed `expect_one_of`
authorEsteban Küber <esteban@kuber.com.ar>
Sat, 25 Mar 2017 02:14:58 +0000 (19:14 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Sat, 25 Mar 2017 06:37:25 +0000 (23:37 -0700)
```rust
error: expected one of `.`, `;`, `?`, `}`, or an operator, found `)`
  --> $DIR/token-error-correct-3.rs:29:9
   |
25 |         foo()
   |             - expected one of `.`, `;`, `?`, `}`, or an operator after this
...
29 |     } else {
   |     ^ unexpected token
```

src/libsyntax/parse/parser.rs
src/test/compile-fail/issue-10636-2.rs
src/test/compile-fail/macro-incomplete-parse.rs
src/test/parse-fail/bounds-obj-parens.rs
src/test/parse-fail/match-refactor-to-expr.rs
src/test/parse-fail/trailing-plus-in-bounds.rs
src/test/ui/resolve/token-error-correct-3.stderr
src/test/ui/resolve/token-error-correct.stderr

index df4ccc94c0421cbb9397a459079f405fac7f5a29..6379015055b60102b7452a23c087c0bfe30649c0 100644 (file)
@@ -548,20 +548,20 @@ fn tokens_to_string(tokens: &[TokenType]) -> String {
             expected.dedup();
             let expect = tokens_to_string(&expected[..]);
             let actual = self.this_token_to_string();
-            Err(self.fatal(
-                &(if expected.len() > 1 {
-                    (format!("expected one of {}, found `{}`",
-                             expect,
-                             actual))
-                } else if expected.is_empty() {
-                    (format!("unexpected token: `{}`",
-                             actual))
-                } else {
-                    (format!("expected {}, found `{}`",
-                             expect,
-                             actual))
-                })[..]
-            ))
+            let (msg_exp, label_exp) = if expected.len() > 1 {
+                (format!("expected one of {}, found `{}`", expect, actual),
+                 format!("expected one of {} after this", expect))
+            } else if expected.is_empty() {
+                (format!("unexpected token: `{}`", actual),
+                 "unexpected token after this".to_string())
+            } else {
+                (format!("expected {}, found `{}`", expect, actual),
+                 format!("expected {} after this", expect))
+            };
+            let mut err = self.fatal(&msg_exp);
+            err.span_label(self.prev_span, &label_exp);
+            err.span_label(self.span, &"unexpected token");
+            Err(err)
         }
     }
 
index beaf9e5059fa232bead2bb0823e178e9f319e3b3..93759123618fbac94701fea954325dc370335dc7 100644 (file)
@@ -14,5 +14,7 @@
 pub fn trace_option(option: Option<isize>) {
     option.map(|some| 42; //~ NOTE: unclosed delimiter
                           //~^ ERROR: expected one of
+                          //~| NOTE: expected one of
+                          //~| NOTE: unexpected token
 } //~ ERROR: incorrect close delimiter
 //~^ ERROR: expected expression, found `)`
index c2ac99d1f6a2d2bdbfc9c4b0dfb8460b08dcab1d..682664df981098dd0f91768468c9f16e423b79b8 100644 (file)
@@ -20,6 +20,8 @@ fn bar() {}
 
 macro_rules! ignored_expr {
     () => ( 1,  //~ ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `,`
+                //~^ NOTE expected one of `.`, `;`, `?`, `}`, or an operator after this
+                //~| NOTE unexpected token
             2 )
 }
 
index ad59d4a52d74c44824fb4a3a7ab5d4d1e6639163..02c119cf727fe473b0518fd58847eb07909cee6e 100644 (file)
@@ -12,4 +12,6 @@
 
 type A = Box<(Fn(D::Error) -> E) + 'static + Send + Sync>; // OK (but see #39318)
 
-FAIL //~ ERROR
+FAIL
+//~^ ERROR
+//~| ERROR
index 37b66601e7092d2f5519c59cad4c4247e720ac7c..7bb1c40118a4d2b9cbddaf30e9a6eaf86c082c4c 100644 (file)
@@ -14,7 +14,9 @@ fn main() {
     let foo =
         match //~ NOTE did you mean to remove this `match` keyword?
         Some(4).unwrap_or_else(5)
-        ; //~ ERROR expected one of `.`, `?`, `{`, or an operator, found `;`
+        //~^ NOTE expected one of `.`, `?`, `{`, or an operator after this
+        ; //~ NOTE unexpected token
+        //~^ ERROR expected one of `.`, `?`, `{`, or an operator, found `;`
 
     println!("{}", foo)
 }
index 4a2e6d5bdcd9c14f86f7293c528f39ad305128b3..2bb2c97790c124fd4427acd4d6f1b1ad5947fa79 100644 (file)
@@ -16,4 +16,6 @@ fn main() {
     let x: Box<Debug+> = box 3 as Box<Debug+>; // Trailing `+` is OK
 }
 
-FAIL //~ ERROR
+FAIL
+//~^ ERROR
+//~| ERROR
index 56e368895750202e634bd4209e61e94e6731a447..2e0edf0c4b8d12153bb42591f1dbb61a6e0358c0 100644 (file)
@@ -14,13 +14,18 @@ error: expected one of `,`, `.`, `?`, or an operator, found `;`
   --> $DIR/token-error-correct-3.rs:23:35
    |
 23 |             callback(path.as_ref();  //~ NOTE: unclosed delimiter
-   |                                   ^
+   |                                  -^ unexpected token
+   |                                  |
+   |                                  expected one of `,`, `.`, `?`, or an operator after this
 
 error: expected one of `.`, `;`, `?`, `}`, or an operator, found `)`
   --> $DIR/token-error-correct-3.rs:29:9
    |
+25 |             fs::create_dir_all(path.as_ref()).map(|()| true) //~ ERROR: mismatched types
+   |                                                            - expected one of `.`, `;`, `?`, `}`, or an operator after this
+...
 29 |         } else { //~ ERROR: incorrect close delimiter: `}`
-   |         ^
+   |         ^ unexpected token
 
 error[E0425]: cannot find function `is_directory` in this scope
   --> $DIR/token-error-correct-3.rs:21:13
index 248a923efaf3641af64a9bfaab05739bfbf3b76e..36f298a456a6097619ba11926e59bc2626a85bd9 100644 (file)
@@ -32,7 +32,9 @@ error: expected one of `)`, `,`, `.`, `<`, `?`, `break`, `continue`, `false`, `f
   --> $DIR/token-error-correct.rs:14:13
    |
 14 |     foo(bar(;
-   |             ^
+   |            -^ unexpected token
+   |            |
+   |            expected one of `)`, `,`, `.`, `<`, `?`, `break`, `continue`, `false`, `for`, `if`, `loop`, `match`, `move`, `return`, `true`, `unsafe`, `while`, or an operator after this
 
 error: expected expression, found `)`
   --> $DIR/token-error-correct.rs:23:1