]> git.lizzy.rs Git - rust.git/commitdiff
Point to previous line for single expected token
authorEsteban Küber <esteban@kuber.com.ar>
Sun, 10 Jun 2018 01:39:14 +0000 (18:39 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Tue, 19 Jun 2018 22:19:16 +0000 (15:19 -0700)
src/libsyntax/parse/parser.rs

index 5d04aa711c1370ecc2e1791baa6fcd124a1304c5..4045053283e9cdcafd16757258d18eac2916c92d 100644 (file)
@@ -637,7 +637,26 @@ pub fn expect(&mut self, t: &token::Token) -> PResult<'a,  ()> {
                 let mut err = self.fatal(&format!("expected `{}`, found `{}`",
                                                   token_str,
                                                   this_token_str));
-                err.span_label(self.span, format!("expected `{}`", token_str));
+
+                let sp = if self.token == token::Token::Eof {
+                    // EOF, don't want to point at the following char, but rather the last token
+                    self.prev_span
+                } else {
+                    self.sess.codemap().next_point(self.prev_span)
+                };
+                let label_exp = format!("expected `{}`", token_str);
+                let cm = self.sess.codemap();
+                match (cm.lookup_line(self.span.lo()), cm.lookup_line(sp.lo())) {
+                    (Ok(ref a), Ok(ref b)) if a.line == b.line => {
+                        // When the spans are in the same line, it means that the only content between
+                        // them is whitespace, point only at the found token.
+                        err.span_label(self.span, label_exp);
+                    }
+                    _ => {
+                        err.span_label(sp, label_exp);
+                        err.span_label(self.span, "unexpected token");
+                    }
+                }
                 Err(err)
             }
         } else {