Skip to content

Commit ce088f0

Browse files
committed
Mark potential matched unclosed delimiter when emit unexpected closing delimiter
Signed-off-by: xizheyin <[email protected]>
1 parent 17f7f62 commit ce088f0

19 files changed

+78
-44
lines changed

compiler/rustc_parse/src/lexer/tokentrees.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,12 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
154154
candidate = Some(*delimiter_span);
155155
}
156156
}
157-
let (_, _) = self.diag_info.open_delimiters.pop().unwrap();
158157
self.diag_info.unmatched_delims.push(UnmatchedDelim {
159158
found_delim: Some(close_delim),
160159
found_span: self.token.span,
161160
unclosed_span: unclosed_delimiter,
162161
candidate_span: candidate,
163162
});
164-
} else {
165-
self.diag_info.open_delimiters.pop();
166163
}
167164

168165
// If the incorrect delimiter matches an earlier opening
@@ -244,6 +241,17 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
244241
let msg = format!("unexpected closing delimiter: `{token_str}`");
245242
let mut err = self.dcx().struct_span_err(self.token.span, msg);
246243

244+
if let Some((open_delim, open_delim_span)) = self.diag_info.open_delimiters.last().cloned()
245+
{
246+
if open_delim == close_delim {
247+
err.span_label(
248+
open_delim_span,
249+
format!("this closing `{}` may be intended to match here", token_str),
250+
);
251+
self.diag_info.open_delimiters.pop();
252+
}
253+
}
254+
247255
report_suspicious_mismatch_block(
248256
&mut err,
249257
&mut self.diag_info,

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
error: unexpected closing delimiter: `}`
22
--> $DIR/deli-ident-issue-2.rs:5:1
33
|
4+
LL | fn main() {
5+
| - this closing `}` may be intended to match here
6+
LL | if 1 < 2 {
47
LL | let _a = vec!];
58
| - missing open `[` for this delimiter
69
LL | }

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ LL | d: [u32; {
1010
LL | #![cfg] {
1111
| - unclosed delimiter
1212
LL | #![w,)
13-
| - missing open `(` for this delimiter
13+
| - - missing open `(` for this delimiter
14+
| |
15+
| unclosed delimiter
1416
LL |
1517
| ^
1618

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+
//~v ERROR this file contains an unclosed delimiter
23
#![c={#![c[)x
3-
//~ ERROR this file contains an unclosed delimiter
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
error: this file contains an unclosed delimiter
2-
--> $DIR/issue-105209.rs:3:68
2+
--> $DIR/issue-105209.rs:3:15
33
|
44
LL | #![c={#![c[)x
5-
| - - - - missing open `(` for this delimiter
6-
| | | |
5+
| - - - -- ^
6+
| | | | ||
7+
| | | | |missing open `(` for this delimiter
8+
| | | | unclosed delimiter
79
| | | unclosed delimiter
810
| | unclosed delimiter
911
| unclosed delimiter
10-
LL |
11-
| ^
1212

1313
error: aborting due to 1 previous error
1414

tests/ui/parser/issues/issue-62895.stderr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ LL | (), w20);
88
| ^ mismatched closing delimiter
99

1010
error: mismatched closing delimiter: `)`
11-
--> $DIR/issue-62895.rs:4:7
11+
--> $DIR/issue-62895.rs:5:22
1212
|
13-
LL | mod _ {
14-
| ^ unclosed delimiter
13+
LL | pub fn g() -> isizee {
14+
| ^ unclosed delimiter
1515
...
1616
LL | (), w20);
1717
| ^ mismatched closing delimiter

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ error: this file contains an unclosed delimiter
22
--> $DIR/issue-62973.rs:8:2
33
|
44
LL | fn p() { match s { v, E { [) {) }
5-
| - - - - missing open `(` for this delimiter
6-
| | | |
7-
| | | missing open `(` for this delimiter
5+
| - - - -- - missing open `(` for this delimiter
6+
| | | | ||
7+
| | | | |missing open `(` for this delimiter
8+
| | | | unclosed delimiter
9+
| | | unclosed delimiter
810
| | unclosed delimiter
911
| unclosed delimiter
1012
LL |

tests/ui/parser/issues/issue-63116.stderr

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ error: this file contains an unclosed delimiter
22
--> $DIR/issue-63116.rs:3:18
33
|
44
LL | impl W <s(f;Y(;]
5-
| - -^
6-
| | |
7-
| | missing open `[` for this delimiter
5+
| - - -^
6+
| | | |
7+
| | | missing open `[` for this delimiter
8+
| | unclosed delimiter
89
| unclosed delimiter
910

1011
error: aborting due to 1 previous error

tests/ui/parser/issues/issue-67377-invalid-syntax-in-enum-discriminant.stderr

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
error: this file contains an unclosed delimiter
22
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:20:65
33
|
4+
LL | mod a {
5+
| - unclosed delimiter
6+
...
47
LL | V = [PhantomData; { [ () ].len() ].len() as isize,
58
| - missing open `[` for this delimiter
69
...
10+
LL | mod b {
11+
| - unclosed delimiter
12+
LL | enum Bug {
713
LL | V = [Vec::new; { [].len() ].len() as isize,
814
| - missing open `[` for this delimiter
915
...
1016
LL | mod c {
1117
| - unclosed delimiter
1218
LL | enum Bug {
19+
| - unclosed delimiter
1320
LL | V = [Vec::new; { [0].len() ].len() as isize,
1421
| - missing open `[` for this delimiter
1522
...

tests/ui/parser/issues/issue-68987-unmatch-issue-2.stderr

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error: unexpected closing delimiter: `}`
22
--> $DIR/issue-68987-unmatch-issue-2.rs:14:1
33
|
4+
LL | async fn obstest() -> Result<> {
5+
| - this closing `}` may be intended to match here
46
LL | let obs_connect = || -> Result<(), MyError) {
57
| - missing open `(` for this delimiter
68
...

0 commit comments

Comments
 (0)