about summary refs log tree commit diff
path: root/src/libsyntax
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 /src/libsyntax
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.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/parse/parser.rs25
1 files changed, 19 insertions, 6 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)
         }
     }