Skip to content

Commit c1fb965

Browse files
committed
Deduplicate unmatched_delims in rustc_parse to reduce confusion
Signed-off-by: xizheyin <[email protected]>
1 parent 229be21 commit c1fb965

26 files changed

+100
-199
lines changed

compiler/rustc_parse/src/lexer/diagnostics.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@ pub(super) fn same_indentation_level(sm: &SourceMap, open_sp: Span, close_sp: Sp
3434

3535
// When we get a `)` or `]` for `{`, we should emit help message here
3636
// it's more friendly compared to report `unmatched error` in later phase
37-
fn report_missing_open_delim(err: &mut Diag<'_>, unmatched_delims: &[UnmatchedDelim]) -> bool {
37+
fn report_missing_open_delim(
38+
err: &mut Diag<'_>,
39+
unmatched_delims: &mut Vec<UnmatchedDelim>,
40+
) -> bool {
3841
let mut reported_missing_open = false;
39-
for unmatch_brace in unmatched_delims.iter() {
42+
unmatched_delims.retain(|unmatch_brace| {
4043
if let Some(delim) = unmatch_brace.found_delim
4144
&& matches!(delim, Delimiter::Parenthesis | Delimiter::Bracket)
4245
{
@@ -45,23 +48,30 @@ fn report_missing_open_delim(err: &mut Diag<'_>, unmatched_delims: &[UnmatchedDe
4548
Delimiter::Bracket => "[",
4649
_ => unreachable!(),
4750
};
51+
52+
if let Some(unclosed_span) = unmatch_brace.unclosed_span {
53+
err.span_label(unclosed_span, "unclosed delimiter before unmatched delimiter");
54+
}
4855
err.span_label(
4956
unmatch_brace.found_span.shrink_to_lo(),
5057
format!("missing open `{missed_open}` for this delimiter"),
5158
);
5259
reported_missing_open = true;
60+
false
61+
} else {
62+
true
5363
}
54-
}
64+
});
5565
reported_missing_open
5666
}
5767

5868
pub(super) fn report_suspicious_mismatch_block(
5969
err: &mut Diag<'_>,
60-
diag_info: &TokenTreeDiagInfo,
70+
diag_info: &mut TokenTreeDiagInfo,
6171
sm: &SourceMap,
6272
delim: Delimiter,
6373
) {
64-
if report_missing_open_delim(err, &diag_info.unmatched_delims) {
74+
if report_missing_open_delim(err, &mut diag_info.unmatched_delims) {
6575
return;
6676
}
6777

compiler/rustc_parse/src/lexer/tokentrees.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
7777
);
7878
}
7979

80-
if let Some((delim, _)) = self.diag_info.open_delimiters.last() {
80+
if let Some((delim, _)) = self.diag_info.open_delimiters.last().cloned() {
8181
report_suspicious_mismatch_block(
8282
&mut err,
83-
&self.diag_info,
83+
&mut self.diag_info,
8484
self.psess.source_map(),
85-
*delim,
85+
delim,
8686
)
8787
}
8888
err
@@ -238,13 +238,18 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
238238
this_spacing
239239
}
240240

241-
fn close_delim_err(&mut self, delim: Delimiter) -> Diag<'psess> {
241+
fn close_delim_err(&mut self, close_delim: Delimiter) -> Diag<'psess> {
242242
// An unexpected closing delimiter (i.e., there is no matching opening delimiter).
243243
let token_str = token_to_string(&self.token);
244244
let msg = format!("unexpected closing delimiter: `{token_str}`");
245245
let mut err = self.dcx().struct_span_err(self.token.span, msg);
246246

247-
report_suspicious_mismatch_block(&mut err, &self.diag_info, self.psess.source_map(), delim);
247+
report_suspicious_mismatch_block(
248+
&mut err,
249+
&mut self.diag_info,
250+
self.psess.source_map(),
251+
close_delim,
252+
);
248253
err.span_label(self.token.span, "unexpected closing delimiter");
249254
err
250255
}

tests/ui/parser/deli-ident-issue-2.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
fn main() {
22
if 1 < 2 {
3-
let _a = vec!]; //~ ERROR mismatched closing delimiter
3+
let _a = vec!];
44
}
55
} //~ ERROR unexpected closing delimiter
66

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
1-
error: mismatched closing delimiter: `]`
2-
--> $DIR/deli-ident-issue-2.rs:2:14
3-
|
4-
LL | if 1 < 2 {
5-
| ^ unclosed delimiter
6-
LL | let _a = vec!];
7-
| ^ mismatched closing delimiter
8-
91
error: unexpected closing delimiter: `}`
102
--> $DIR/deli-ident-issue-2.rs:5:1
113
|
4+
LL | if 1 < 2 {
5+
| - the last unclosed delimiter before unmatched delimiter
126
LL | let _a = vec!];
137
| - missing open `[` for this delimiter
148
LL | }
159
LL | }
1610
| ^ unexpected closing delimiter
1711

18-
error: aborting due to 2 previous errors
12+
error: aborting due to 1 previous error
1913

tests/ui/parser/issues/issue-104367.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
struct S {
33
d: [u32; {
44
#![cfg] {
5-
#![w,) //~ ERROR mismatched closing delimiter
5+
#![w,)
66
//~ ERROR this file contains an unclosed delimiter
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
error: mismatched closing delimiter: `)`
2-
--> $DIR/issue-104367.rs:5:15
3-
|
4-
LL | #![w,)
5-
| ^ ^ mismatched closing delimiter
6-
| |
7-
| unclosed delimiter
8-
91
error: this file contains an unclosed delimiter
102
--> $DIR/issue-104367.rs:6:71
113
|
@@ -18,9 +10,11 @@ LL | d: [u32; {
1810
LL | #![cfg] {
1911
| - unclosed delimiter
2012
LL | #![w,)
21-
| - missing open `(` for this delimiter
13+
| - - missing open `(` for this delimiter
14+
| |
15+
| the last unclosed delimiter before unmatched delimiter
2216
LL |
2317
| ^
2418

25-
error: aborting due to 2 previous errors
19+
error: aborting due to 1 previous error
2620

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
//@ compile-flags: -Zunpretty=ast-tree
2-
#![c={#![c[)x //~ ERROR mismatched closing delimiter
3-
//~ ERROR this file contains an unclosed delimiter
2+
//~v ERROR this file contains an unclosed delimiter
3+
#![c={#![c[)x
Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,14 @@
1-
error: mismatched closing delimiter: `)`
2-
--> $DIR/issue-105209.rs:2:11
3-
|
4-
LL | #![c={#![c[)x
5-
| ^^ mismatched closing delimiter
6-
| |
7-
| unclosed delimiter
8-
91
error: this file contains an unclosed delimiter
10-
--> $DIR/issue-105209.rs:3:68
2+
--> $DIR/issue-105209.rs:3:15
113
|
124
LL | #![c={#![c[)x
13-
| - - - - missing open `(` for this delimiter
14-
| | | |
5+
| - - - -- ^
6+
| | | | ||
7+
| | | | |missing open `(` for this delimiter
8+
| | | | the last unclosed delimiter before unmatched delimiter
159
| | | unclosed delimiter
1610
| | unclosed delimiter
1711
| unclosed delimiter
18-
LL |
19-
| ^
2012

21-
error: aborting due to 2 previous errors
13+
error: aborting due to 1 previous error
2214

tests/ui/parser/issues/issue-62973.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
fn main() {}
44

5-
//~vvv ERROR mismatched closing delimiter: `)`
6-
//~vv ERROR mismatched closing delimiter: `)`
75
//~vvv ERROR this file contains an unclosed delimiter
86
fn p() { match s { v, E { [) {) }
97

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,17 @@
1-
error: mismatched closing delimiter: `)`
2-
--> $DIR/issue-62973.rs:8:27
3-
|
4-
LL | fn p() { match s { v, E { [) {) }
5-
| ^^ mismatched closing delimiter
6-
| |
7-
| unclosed delimiter
8-
9-
error: mismatched closing delimiter: `)`
10-
--> $DIR/issue-62973.rs:8:30
11-
|
12-
LL | fn p() { match s { v, E { [) {) }
13-
| ^^ mismatched closing delimiter
14-
| |
15-
| unclosed delimiter
16-
171
error: this file contains an unclosed delimiter
18-
--> $DIR/issue-62973.rs:10:2
2+
--> $DIR/issue-62973.rs:8:2
193
|
204
LL | fn p() { match s { v, E { [) {) }
21-
| - - - - missing open `(` for this delimiter
22-
| | | |
23-
| | | missing open `(` for this delimiter
5+
| - - -- -- missing open `(` for this delimiter
6+
| | | || |
7+
| | | || the last unclosed delimiter before unmatched delimiter
8+
| | | |missing open `(` for this delimiter
9+
| | | the last unclosed delimiter before unmatched delimiter
2410
| | unclosed delimiter
2511
| unclosed delimiter
2612
LL |
2713
LL |
2814
| ^
2915

30-
error: aborting due to 3 previous errors
16+
error: aborting due to 1 previous error
3117

0 commit comments

Comments
 (0)