Skip to content

Commit 94a3fd7

Browse files
committed
add limit for unclosed delimiters in lexer diagnostic
1 parent 9a5e41c commit 94a3fd7

File tree

4 files changed

+25
-32
lines changed

4 files changed

+25
-32
lines changed

compiler/rustc_parse/src/lexer/tokentrees.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,31 @@ impl<'psess, 'src> TokenTreesReader<'psess, 'src> {
7272
fn eof_err(&mut self) -> PErr<'psess> {
7373
let msg = "this file contains an unclosed delimiter";
7474
let mut err = self.string_reader.dcx().struct_span_err(self.token.span, msg);
75-
for &(_, sp) in &self.diag_info.open_braces {
76-
err.span_label(sp, "unclosed delimiter");
75+
76+
let unclosed_delimiter_show_limit = 5;
77+
let len = usize::min(unclosed_delimiter_show_limit, self.diag_info.open_braces.len());
78+
for &(_, span) in &self.diag_info.open_braces[..len] {
79+
err.span_label(span, "unclosed delimiter");
7780
self.diag_info.unmatched_delims.push(UnmatchedDelim {
7881
found_delim: None,
7982
found_span: self.token.span,
80-
unclosed_span: Some(sp),
83+
unclosed_span: Some(span),
8184
candidate_span: None,
8285
});
8386
}
8487

88+
if let Some((_, span)) = self.diag_info.open_braces.get(unclosed_delimiter_show_limit)
89+
&& self.diag_info.open_braces.len() >= unclosed_delimiter_show_limit + 2
90+
{
91+
err.span_label(
92+
*span,
93+
format!(
94+
"another {} unclosed delimiters begin from here",
95+
self.diag_info.open_braces.len() - unclosed_delimiter_show_limit
96+
),
97+
);
98+
}
99+
85100
if let Some((delim, _)) = self.diag_info.open_braces.last() {
86101
report_suspicious_mismatch_block(
87102
&mut err,

tests/ui/parser/brace-in-let-chain.stderr

+1-7
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,8 @@ LL | fn qux() {
1717
| - unclosed delimiter
1818
...
1919
LL | fn foo() {
20-
| - unclosed delimiter
21-
...
22-
LL | fn bar() {
23-
| - unclosed delimiter
20+
| - another 3 unclosed delimiters begin from here
2421
...
25-
LL | fn baz() {
26-
| - unclosed delimiter
27-
LL | if false {
2822
LL | {
2923
| - this delimiter might not be properly closed...
3024
LL | && let () = ()
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
// ignore-tidy-trailing-newlines
21
// issue: rust-lang/rust#127868
32

43
fn main() {
54
let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
65
} //~ ERROR mismatched closing delimiter: `}`
7-
//~ ERROR this file contains an unclosed delimiter
6+
//~ ERROR this file contains an unclosed delimiter

tests/ui/parser/mismatched-delimiter-corner-case-issue-127868.stderr

+5-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: mismatched closing delimiter: `}`
2-
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:5:42
2+
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:4:42
33
|
44
LL | fn main() {
55
| - closing delimiter possibly meant for this
@@ -9,29 +9,14 @@ LL | }
99
| ^ mismatched closing delimiter
1010

1111
error: this file contains an unclosed delimiter
12-
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:7:51
12+
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:6:52
1313
|
1414
LL | fn main() {
1515
| - unclosed delimiter
1616
LL | let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
17-
| -------------------- - this delimiter might not be properly closed...
18-
| ||||||||||||||||||||
19-
| |||||||||||||||||||unclosed delimiter
20-
| ||||||||||||||||||unclosed delimiter
21-
| |||||||||||||||||unclosed delimiter
22-
| ||||||||||||||||unclosed delimiter
23-
| |||||||||||||||unclosed delimiter
24-
| ||||||||||||||unclosed delimiter
25-
| |||||||||||||unclosed delimiter
26-
| ||||||||||||unclosed delimiter
27-
| |||||||||||unclosed delimiter
28-
| ||||||||||unclosed delimiter
29-
| |||||||||unclosed delimiter
30-
| ||||||||unclosed delimiter
31-
| |||||||unclosed delimiter
32-
| ||||||unclosed delimiter
33-
| |||||unclosed delimiter
34-
| ||||unclosed delimiter
17+
| ----- - this delimiter might not be properly closed...
18+
| |||||
19+
| ||||another 16 unclosed delimiters begin from here
3520
| |||unclosed delimiter
3621
| ||unclosed delimiter
3722
| |unclosed delimiter

0 commit comments

Comments
 (0)