Do not emit "incorrect close delimiter" twice in the same place
This commit is contained in:
parent
2a74d7924a
commit
1b5e29ae6f
4 changed files with 20 additions and 22 deletions
|
|
@ -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> {
|
||||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -15,4 +15,3 @@ fn main() {
|
|||
//~^ ERROR: expected expression, found `;`
|
||||
}
|
||||
//~^ ERROR: incorrect close delimiter: `}`
|
||||
//~| ERROR: incorrect close delimiter: `}`
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue