Skip to content

Commit

Permalink
Do not emit "incorrect close delimiter" twice in the same place
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Aug 15, 2018
1 parent 2a74d79 commit 1b5e29a
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 22 deletions.
2 changes: 2 additions & 0 deletions src/libsyntax/parse/lexer/mod.rs
Expand Up @@ -67,6 +67,7 @@ pub struct StringReader<'a> {
span_src_raw: Span,
open_braces: Vec<(token::DelimToken, Span)>,
crate override_span: Option<Span>,
last_unclosed_found_span: Option<Span>,
}

impl<'a> StringReader<'a> {
Expand Down Expand Up @@ -195,6 +196,7 @@ impl<'a> StringReader<'a> {
span_src_raw: syntax_pos::DUMMY_SP,
open_braces: Vec::new(),
override_span,
last_unclosed_found_span: None,
}
}

Expand Down
28 changes: 17 additions & 11 deletions src/libsyntax/parse/lexer/tokentrees.rs
Expand Up @@ -77,17 +77,23 @@ impl<'a> StringReader<'a> {
// Incorrect delimiter.
token::CloseDelim(other) => {
let token_str = token_to_string(&self.token);
let msg = format!("incorrect close delimiter: `{}`", token_str);
let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
err.span_label(self.span, "incorrect close delimiter");
// This is a conservative error: only report the last unclosed delimiter.
// The previous unclosed delimiters could actually be closed! The parser
// just hasn't gotten to them yet.
if let Some(&(_, sp)) = self.open_braces.last() {
err.span_label(sp, "unclosed delimiter");
};
err.emit();

if self.last_unclosed_found_span != Some(self.span) {
// do not complain about the same unclosed delimiter multiple times
self.last_unclosed_found_span = Some(self.span);
let msg = format!("incorrect close delimiter: `{}`", token_str);
let mut err = self.sess.span_diagnostic.struct_span_err(
self.span,
&msg,
);
err.span_label(self.span, "incorrect close delimiter");
// This is a conservative error: only report the last unclosed
// delimiter. The previous unclosed delimiters could actually be
// closed! The parser just hasn't gotten to them yet.
if let Some(&(_, sp)) = self.open_braces.last() {
err.span_label(sp, "unclosed delimiter");
};
err.emit();
}
self.open_braces.pop().unwrap();

// If the incorrect delimiter matches an earlier opening
Expand Down
1 change: 0 additions & 1 deletion src/test/ui/resolve/token-error-correct.rs
Expand Up @@ -15,4 +15,3 @@ fn main() {
//~^ ERROR: expected expression, found `;`
}
//~^ ERROR: incorrect close delimiter: `}`
//~| ERROR: incorrect close delimiter: `}`
11 changes: 1 addition & 10 deletions src/test/ui/resolve/token-error-correct.stderr
Expand Up @@ -7,20 +7,11 @@ LL | //~^ ERROR: expected expression, found `;`
LL | }
| ^ incorrect close delimiter

error: incorrect close delimiter: `}`
--> $DIR/token-error-correct.rs:16:1
|
LL | foo(bar(;
| - unclosed delimiter
LL | //~^ ERROR: expected expression, found `;`
LL | }
| ^ incorrect close delimiter

error: expected expression, found `;`
--> $DIR/token-error-correct.rs:14:13
|
LL | foo(bar(;
| ^ expected expression

error: aborting due to 3 previous errors
error: aborting due to 2 previous errors

0 comments on commit 1b5e29a

Please sign in to comment.