Skip to content

Commit 1b5e29a

Browse files
committed
Do not emit "incorrect close delimiter" twice in the same place
1 parent 2a74d79 commit 1b5e29a

File tree

4 files changed

+20
-22
lines changed

4 files changed

+20
-22
lines changed

src/libsyntax/parse/lexer/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ pub struct StringReader<'a> {
6767
span_src_raw: Span,
6868
open_braces: Vec<(token::DelimToken, Span)>,
6969
crate override_span: Option<Span>,
70+
last_unclosed_found_span: Option<Span>,
7071
}
7172

7273
impl<'a> StringReader<'a> {
@@ -195,6 +196,7 @@ impl<'a> StringReader<'a> {
195196
span_src_raw: syntax_pos::DUMMY_SP,
196197
open_braces: Vec::new(),
197198
override_span,
199+
last_unclosed_found_span: None,
198200
}
199201
}
200202

src/libsyntax/parse/lexer/tokentrees.rs

+17-11
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,23 @@ impl<'a> StringReader<'a> {
7777
// Incorrect delimiter.
7878
token::CloseDelim(other) => {
7979
let token_str = token_to_string(&self.token);
80-
let msg = format!("incorrect close delimiter: `{}`", token_str);
81-
let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
82-
err.span_label(self.span, "incorrect close delimiter");
83-
// This is a conservative error: only report the last unclosed delimiter.
84-
// The previous unclosed delimiters could actually be closed! The parser
85-
// just hasn't gotten to them yet.
86-
if let Some(&(_, sp)) = self.open_braces.last() {
87-
err.span_label(sp, "unclosed delimiter");
88-
};
89-
err.emit();
90-
80+
if self.last_unclosed_found_span != Some(self.span) {
81+
// do not complain about the same unclosed delimiter multiple times
82+
self.last_unclosed_found_span = Some(self.span);
83+
let msg = format!("incorrect close delimiter: `{}`", token_str);
84+
let mut err = self.sess.span_diagnostic.struct_span_err(
85+
self.span,
86+
&msg,
87+
);
88+
err.span_label(self.span, "incorrect close delimiter");
89+
// This is a conservative error: only report the last unclosed
90+
// delimiter. The previous unclosed delimiters could actually be
91+
// closed! The parser just hasn't gotten to them yet.
92+
if let Some(&(_, sp)) = self.open_braces.last() {
93+
err.span_label(sp, "unclosed delimiter");
94+
};
95+
err.emit();
96+
}
9197
self.open_braces.pop().unwrap();
9298

9399
// If the incorrect delimiter matches an earlier opening

src/test/ui/resolve/token-error-correct.rs

-1
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,3 @@ fn main() {
1515
//~^ ERROR: expected expression, found `;`
1616
}
1717
//~^ ERROR: incorrect close delimiter: `}`
18-
//~| ERROR: incorrect close delimiter: `}`

src/test/ui/resolve/token-error-correct.stderr

+1-10
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,11 @@ LL | //~^ ERROR: expected expression, found `;`
77
LL | }
88
| ^ incorrect close delimiter
99

10-
error: incorrect close delimiter: `}`
11-
--> $DIR/token-error-correct.rs:16:1
12-
|
13-
LL | foo(bar(;
14-
| - unclosed delimiter
15-
LL | //~^ ERROR: expected expression, found `;`
16-
LL | }
17-
| ^ incorrect close delimiter
18-
1910
error: expected expression, found `;`
2011
--> $DIR/token-error-correct.rs:14:13
2112
|
2213
LL | foo(bar(;
2314
| ^ expected expression
2415

25-
error: aborting due to 3 previous errors
16+
error: aborting due to 2 previous errors
2617

0 commit comments

Comments
 (0)