Skip to content

Point to next token when it is in the expected line #46381

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 2, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/libsyntax/codemap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ impl CodeMap {
}

// If the relevant filemap is empty, we don't return a line number.
fn lookup_line(&self, pos: BytePos) -> Result<FileMapAndLine, Rc<FileMap>> {
pub fn lookup_line(&self, pos: BytePos) -> Result<FileMapAndLine, Rc<FileMap>> {
let idx = self.lookup_filemap_idx(pos);

let files = self.files.borrow();
Expand Down
27 changes: 22 additions & 5 deletions src/libsyntax/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -660,11 +660,28 @@ impl<'a> Parser<'a> {
} else {
label_sp
};
if self.span.contains(sp) {
err.span_label(self.span, label_exp);
} else {
err.span_label(sp, label_exp);
err.span_label(self.span, "unexpected token");

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 at the found token in that case:
//
// X | () => { syntax error };
// | ^^^^^ expected one of 8 possible tokens here
//
// instead of having:
//
// X | () => { syntax error };
// | -^^^^^ unexpected token
// | |
// | expected one of 8 possible tokens here
err.span_label(self.span, label_exp);
}
_ => {
err.span_label(sp, label_exp);
err.span_label(self.span, "unexpected token");
}
}
Err(err)
}
Expand Down
4 changes: 1 addition & 3 deletions src/test/ui/did_you_mean/issue-40006.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,7 @@ error: expected one of `!` or `::`, found `(`
--> $DIR/issue-40006.rs:24:9
|
24 | ::Y (); //~ ERROR expected one of
| -^ unexpected token
| |
| expected one of `!` or `::` here
| ^ expected one of `!` or `::` here

error: missing `fn`, `type`, or `const` for impl-item declaration
--> $DIR/issue-40006.rs:28:8
Expand Down
8 changes: 2 additions & 6 deletions src/test/ui/macro_backtrace/main.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,14 @@ error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found
--> $DIR/main.rs:19:20
|
19 | () => { syntax error }; //~ ERROR expected one of
| -^^^^^ unexpected token
| |
| expected one of 8 possible tokens here
| ^^^^^ expected one of 8 possible tokens here
$DIR/main.rs:24:5: 24:13 note: in this expansion of pong! (defined in $DIR/main.rs)

error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `error`
--> $DIR/main.rs:19:20
|
19 | () => { syntax error }; //~ ERROR expected one of
| -^^^^^ unexpected token
| |
| expected one of 8 possible tokens here
| ^^^^^ expected one of 8 possible tokens here
$DIR/main.rs:25:5: 25:13 note: in this expansion of ping! (defined in <ping macros>)
<ping macros>:1:11: 1:24 note: in this expansion of pong! (defined in $DIR/main.rs)

Expand Down