Skip to content

Commit 595316b

Browse files
committed
Auto merge of rust-lang#127955 - chenyukang:yukang-fix-mismatched-delimiter-issue-12786, r=nnethercote
Add limit for unclosed delimiters in lexer diagnostic Fixes rust-lang#127868 The first commit shows the original diagnostic, and the second commit shows the changes.
2 parents 1ddedba + 94a3fd7 commit 595316b

File tree

4 files changed

+55
-10
lines changed

4 files changed

+55
-10
lines changed

Diff for: compiler/rustc_parse/src/lexer/tokentrees.rs

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

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

Diff for: 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
@@ -0,0 +1,6 @@
1+
// issue: rust-lang/rust#127868
2+
3+
fn main() {
4+
let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
5+
} //~ ERROR mismatched closing delimiter: `}`
6+
//~ ERROR this file contains an unclosed delimiter
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
error: mismatched closing delimiter: `}`
2+
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:4:42
3+
|
4+
LL | fn main() {
5+
| - closing delimiter possibly meant for this
6+
LL | let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
7+
| ^ unclosed delimiter
8+
LL | }
9+
| ^ mismatched closing delimiter
10+
11+
error: this file contains an unclosed delimiter
12+
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:6:52
13+
|
14+
LL | fn main() {
15+
| - unclosed delimiter
16+
LL | let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
17+
| ----- - this delimiter might not be properly closed...
18+
| |||||
19+
| ||||another 16 unclosed delimiters begin from here
20+
| |||unclosed delimiter
21+
| ||unclosed delimiter
22+
| |unclosed delimiter
23+
| unclosed delimiter
24+
LL | }
25+
| - ...as it matches this but it has different indentation
26+
LL |
27+
| ^
28+
29+
error: aborting due to 2 previous errors
30+

0 commit comments

Comments
 (0)