about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2017-03-25 15:36:59 -0700
committerEsteban Küber <esteban@kuber.com.ar>2017-03-25 15:36:59 -0700
commit78ae8feebbf9a2c70d42780d0c646cbbc1f2cdbc (patch)
tree6280f6af76d15fd058ac2175a83c12a70212b496
parent03eca713816ee00ecacde27cc655dc199c6bff40 (diff)
downloadrust-78ae8feebbf9a2c70d42780d0c646cbbc1f2cdbc.tar.gz
rust-78ae8feebbf9a2c70d42780d0c646cbbc1f2cdbc.zip
Improve wording and spans for unexpected token
* Point at where the token was expected instead of the last token
  successfuly parsed.
* Only show `unexpected token` if the next char and the unexpected token
  don't have the same span.
* Change some cfail and pfail tests to ui test.
* Don't show all possible tokens in span label if they are more than 6.
-rw-r--r--src/libsyntax/parse/parser.rs25
-rw-r--r--src/libsyntax_pos/lib.rs6
-rw-r--r--src/test/parse-fail/match-refactor-to-expr.rs2
-rw-r--r--src/test/ui/resolve/token-error-correct-3.stderr6
-rw-r--r--src/test/ui/resolve/token-error-correct.stderr4
-rw-r--r--src/test/ui/token/bounds-obj-parens.rs (renamed from src/test/parse-fail/bounds-obj-parens.rs)0
-rw-r--r--src/test/ui/token/bounds-obj-parens.stderr7
-rw-r--r--src/test/ui/token/issue-10636-2.rs (renamed from src/test/compile-fail/issue-10636-2.rs)0
-rw-r--r--src/test/ui/token/issue-10636-2.stderr27
-rw-r--r--src/test/ui/token/macro-incomplete-parse.rs (renamed from src/test/compile-fail/macro-incomplete-parse.rs)2
-rw-r--r--src/test/ui/token/macro-incomplete-parse.stderr31
-rw-r--r--src/test/ui/token/trailing-plus-in-bounds.rs (renamed from src/test/parse-fail/trailing-plus-in-bounds.rs)0
-rw-r--r--src/test/ui/token/trailing-plus-in-bounds.stderr7
13 files changed, 102 insertions, 15 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 6379015055b..4076368c180 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -548,19 +548,32 @@ impl<'a> Parser<'a> {
             expected.dedup();
             let expect = tokens_to_string(&expected[..]);
             let actual = self.this_token_to_string();
-            let (msg_exp, label_exp) = if expected.len() > 1 {
+            let (msg_exp, (label_sp, label_exp)) = if expected.len() > 1 {
+                let short_expect = if expected.len() > 6 {
+                    format!("{} possible tokens", expected.len())
+                } else {
+                    expect.clone()
+                };
                 (format!("expected one of {}, found `{}`", expect, actual),
-                 format!("expected one of {} after this", expect))
+                 (self.prev_span.next_point(), format!("expected one of {} here", short_expect)))
             } else if expected.is_empty() {
                 (format!("unexpected token: `{}`", actual),
-                 "unexpected token after this".to_string())
+                 (self.prev_span, "unexpected token after this".to_string()))
             } else {
                 (format!("expected {}, found `{}`", expect, actual),
-                 format!("expected {} after this", expect))
+                 (self.prev_span.next_point(), format!("expected {} here", expect)))
             };
             let mut err = self.fatal(&msg_exp);
-            err.span_label(self.prev_span, &label_exp);
-            err.span_label(self.span, &"unexpected token");
+            let sp = if self.token == token::Token::Eof {
+                // This is EOF, don't want to point at the following char, but rather the last token
+                self.prev_span
+            } else {
+                label_sp
+            };
+            err.span_label(sp, &label_exp);
+            if label_sp != self.span {
+                err.span_label(self.span, &"unexpected token");
+            }
             Err(err)
         }
     }
diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs
index 3808923e772..07494ff904e 100644
--- a/src/libsyntax_pos/lib.rs
+++ b/src/libsyntax_pos/lib.rs
@@ -79,6 +79,12 @@ impl Span {
         Span { lo: BytePos(lo), hi: self.hi, expn_id: self.expn_id}
     }
 
+    /// Returns a new span representing the next character after the end-point of this span
+    pub fn next_point(self) -> Span {
+        let lo = BytePos(cmp::max(self.hi.0, self.lo.0 + 1));
+        Span { lo: lo, hi: lo, expn_id: self.expn_id}
+    }
+
     /// Returns `self` if `self` is not the dummy span, and `other` otherwise.
     pub fn substitute_dummy(self, other: Span) -> Span {
         if self.source_equal(&DUMMY_SP) { other } else { self }
diff --git a/src/test/parse-fail/match-refactor-to-expr.rs b/src/test/parse-fail/match-refactor-to-expr.rs
index 7bb1c40118a..e2fee1d1895 100644
--- a/src/test/parse-fail/match-refactor-to-expr.rs
+++ b/src/test/parse-fail/match-refactor-to-expr.rs
@@ -14,7 +14,7 @@ fn main() {
     let foo =
         match //~ NOTE did you mean to remove this `match` keyword?
         Some(4).unwrap_or_else(5)
-        //~^ NOTE expected one of `.`, `?`, `{`, or an operator after this
+        //~^ NOTE expected one of `.`, `?`, `{`, or an operator here
         ; //~ NOTE unexpected token
         //~^ ERROR expected one of `.`, `?`, `{`, or an operator, found `;`
 
diff --git a/src/test/ui/resolve/token-error-correct-3.stderr b/src/test/ui/resolve/token-error-correct-3.stderr
index 2e0edf0c4b8..bf7db67e728 100644
--- a/src/test/ui/resolve/token-error-correct-3.stderr
+++ b/src/test/ui/resolve/token-error-correct-3.stderr
@@ -14,15 +14,13 @@ 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
+   |                                   ^ expected one of `,`, `.`, `?`, or an operator here
 
 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
+   |                                                             - expected one of `.`, `;`, `?`, `}`, or an operator here
 ...
 29 |         } else { //~ ERROR: incorrect close delimiter: `}`
    |         ^ unexpected token
diff --git a/src/test/ui/resolve/token-error-correct.stderr b/src/test/ui/resolve/token-error-correct.stderr
index 36f298a456a..226fa6469bc 100644
--- a/src/test/ui/resolve/token-error-correct.stderr
+++ b/src/test/ui/resolve/token-error-correct.stderr
@@ -32,9 +32,7 @@ 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
+   |             ^ expected one of 18 possible tokens here
 
 error: expected expression, found `)`
   --> $DIR/token-error-correct.rs:23:1
diff --git a/src/test/parse-fail/bounds-obj-parens.rs b/src/test/ui/token/bounds-obj-parens.rs
index 02c119cf727..02c119cf727 100644
--- a/src/test/parse-fail/bounds-obj-parens.rs
+++ b/src/test/ui/token/bounds-obj-parens.rs
diff --git a/src/test/ui/token/bounds-obj-parens.stderr b/src/test/ui/token/bounds-obj-parens.stderr
new file mode 100644
index 00000000000..ebee363f278
--- /dev/null
+++ b/src/test/ui/token/bounds-obj-parens.stderr
@@ -0,0 +1,7 @@
+error: expected one of `!` or `::`, found `<eof>`
+  --> $DIR/bounds-obj-parens.rs:15:1
+   |
+15 | FAIL
+   | ^^^^ expected one of `!` or `::` here
+
+error: aborting due to previous error
diff --git a/src/test/compile-fail/issue-10636-2.rs b/src/test/ui/token/issue-10636-2.rs
index 93759123618..93759123618 100644
--- a/src/test/compile-fail/issue-10636-2.rs
+++ b/src/test/ui/token/issue-10636-2.rs
diff --git a/src/test/ui/token/issue-10636-2.stderr b/src/test/ui/token/issue-10636-2.stderr
new file mode 100644
index 00000000000..183ad30c4ef
--- /dev/null
+++ b/src/test/ui/token/issue-10636-2.stderr
@@ -0,0 +1,27 @@
+error: incorrect close delimiter: `}`
+  --> $DIR/issue-10636-2.rs:19:1
+   |
+19 | } //~ ERROR: incorrect close delimiter
+   | ^
+   |
+note: unclosed delimiter
+  --> $DIR/issue-10636-2.rs:15:15
+   |
+15 |     option.map(|some| 42; //~ NOTE: unclosed delimiter
+   |               ^
+
+error: expected one of `,`, `.`, `?`, or an operator, found `;`
+  --> $DIR/issue-10636-2.rs:15:25
+   |
+15 |     option.map(|some| 42; //~ NOTE: unclosed delimiter
+   |                         ^ expected one of `,`, `.`, `?`, or an operator here
+
+error: expected expression, found `)`
+  --> $DIR/issue-10636-2.rs:19:1
+   |
+19 | } //~ ERROR: incorrect close delimiter
+   | ^
+
+error: main function not found
+
+error: aborting due to 4 previous errors
diff --git a/src/test/compile-fail/macro-incomplete-parse.rs b/src/test/ui/token/macro-incomplete-parse.rs
index 682664df981..47374fc3c60 100644
--- a/src/test/compile-fail/macro-incomplete-parse.rs
+++ b/src/test/ui/token/macro-incomplete-parse.rs
@@ -20,7 +20,7 @@ macro_rules! ignored_item {
 
 macro_rules! ignored_expr {
     () => ( 1,  //~ ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `,`
-                //~^ NOTE expected one of `.`, `;`, `?`, `}`, or an operator after this
+                //~^ NOTE expected one of `.`, `;`, `?`, `}`, or an operator here
                 //~| NOTE unexpected token
             2 )
 }
diff --git a/src/test/ui/token/macro-incomplete-parse.stderr b/src/test/ui/token/macro-incomplete-parse.stderr
new file mode 100644
index 00000000000..bea00a6444c
--- /dev/null
+++ b/src/test/ui/token/macro-incomplete-parse.stderr
@@ -0,0 +1,31 @@
+error: macro expansion ignores token `,` and any following
+  --> $DIR/macro-incomplete-parse.rs:17:9
+   |
+17 |         , //~ ERROR macro expansion ignores token `,`
+   |         ^
+   |
+note: caused by the macro expansion here; the usage of `ignored_item!` is likely invalid in item context
+  --> $DIR/macro-incomplete-parse.rs:32:1
+   |
+32 | ignored_item!(); //~ NOTE caused by the macro expansion here
+   | ^^^^^^^^^^^^^^^^
+
+error: expected one of `.`, `;`, `?`, `}`, or an operator, found `,`
+  --> $DIR/macro-incomplete-parse.rs:22:14
+   |
+22 |     () => ( 1,  //~ ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `,`
+   |              ^ expected one of `.`, `;`, `?`, `}`, or an operator here
+
+error: macro expansion ignores token `,` and any following
+  --> $DIR/macro-incomplete-parse.rs:29:14
+   |
+29 |     () => ( 1, 2 ) //~ ERROR macro expansion ignores token `,`
+   |              ^
+   |
+note: caused by the macro expansion here; the usage of `ignored_pat!` is likely invalid in pattern context
+  --> $DIR/macro-incomplete-parse.rs:37:9
+   |
+37 |         ignored_pat!() => (), //~ NOTE caused by the macro expansion here
+   |         ^^^^^^^^^^^^^^
+
+error: aborting due to 3 previous errors
diff --git a/src/test/parse-fail/trailing-plus-in-bounds.rs b/src/test/ui/token/trailing-plus-in-bounds.rs
index 2bb2c97790c..2bb2c97790c 100644
--- a/src/test/parse-fail/trailing-plus-in-bounds.rs
+++ b/src/test/ui/token/trailing-plus-in-bounds.rs
diff --git a/src/test/ui/token/trailing-plus-in-bounds.stderr b/src/test/ui/token/trailing-plus-in-bounds.stderr
new file mode 100644
index 00000000000..74caf8f5c2b
--- /dev/null
+++ b/src/test/ui/token/trailing-plus-in-bounds.stderr
@@ -0,0 +1,7 @@
+error: expected one of `!` or `::`, found `<eof>`
+  --> ../../src/test/ui/token/trailing-plus-in-bounds.rs:19:1
+   |
+19 | FAIL
+   | ^^^^ expected one of `!` or `::` here
+
+error: aborting due to previous error