Skip to content

Commit 17f7f62

Browse files
committed
Remove unmatched_delims that unexpected closing delimeter error report to reduce confusion
Signed-off-by: xizheyin <[email protected]>
1 parent 229be21 commit 17f7f62

26 files changed

+49
-174
lines changed

compiler/rustc_parse/src/lexer/diagnostics.rs

Lines changed: 11 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
{
@@ -50,18 +53,21 @@ fn report_missing_open_delim(err: &mut Diag<'_>, unmatched_delims: &[UnmatchedDe
5053
format!("missing open `{missed_open}` for this delimiter"),
5154
);
5255
reported_missing_open = true;
56+
false
57+
} else {
58+
true
5359
}
54-
}
60+
});
5561
reported_missing_open
5662
}
5763

5864
pub(super) fn report_suspicious_mismatch_block(
5965
err: &mut Diag<'_>,
60-
diag_info: &TokenTreeDiagInfo,
66+
diag_info: &mut TokenTreeDiagInfo,
6167
sm: &SourceMap,
6268
delim: Delimiter,
6369
) {
64-
if report_missing_open_delim(err, &diag_info.unmatched_delims) {
70+
if report_missing_open_delim(err, &mut diag_info.unmatched_delims) {
6571
return;
6672
}
6773

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: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
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
|
@@ -15,5 +7,5 @@ LL | }
157
LL | }
168
| ^ unexpected closing delimiter
179

18-
error: aborting due to 2 previous errors
10+
error: aborting due to 1 previous error
1911

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: 1 addition & 9 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
|
@@ -22,5 +14,5 @@ LL | #![w,)
2214
LL |
2315
| ^
2416

25-
error: aborting due to 2 previous errors
17+
error: aborting due to 1 previous error
2618

Lines changed: 1 addition & 1 deletion
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
2+
#![c={#![c[)x
33
//~ ERROR this file contains an unclosed delimiter
Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
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
102
--> $DIR/issue-105209.rs:3:68
113
|
@@ -18,5 +10,5 @@ LL | #![c={#![c[)x
1810
LL |
1911
| ^
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: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,5 @@
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 { [) {) }
215
| - - - - missing open `(` for this delimiter
@@ -27,5 +11,5 @@ LL |
2711
LL |
2812
| ^
2913

30-
error: aborting due to 3 previous errors
14+
error: aborting due to 1 previous error
3115

0 commit comments

Comments
 (0)