diff options
| author | bors <bors@rust-lang.org> | 2017-12-02 20:06:42 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-12-02 20:06:42 +0000 |
| commit | f9b0897c5d42a4dfa425db799073c6feb21b0178 (patch) | |
| tree | b92f2c4d8290b9998018f15f984e73e6bf8416c9 /src/libsyntax | |
| parent | 377decc352e58aa2bb0e2deb2eb66c3e7241a622 (diff) | |
| parent | fe897409579177d1ffd964b6d5a8de0024e5df68 (diff) | |
| download | rust-f9b0897c5d42a4dfa425db799073c6feb21b0178.tar.gz rust-f9b0897c5d42a4dfa425db799073c6feb21b0178.zip | |
Auto merge of #46381 - estebank:expected-span, r=nikomatsakis
Point to next token when it is in the expected line r? @nikomatsakis
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/codemap.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 27 |
2 files changed, 23 insertions, 6 deletions
diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index 3aac5334a38..3906ed431ce 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -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(); diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index a02c6b764b7..2461e65585f 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -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) } |
