Skip to content

Commit c6d800d

Browse files
committed
Point at unclosed delimiters as part of the primary MultiSpan
Both the place where the parser encounters a needed closed delimiter and the unclosed opening delimiter are important, so they should get the same level of highlighting in the output.
1 parent 4a6547c commit c6d800d

21 files changed

+82
-67
lines changed

compiler/rustc_parse/src/parser/diagnostics.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -1432,12 +1432,22 @@ impl<'a> Parser<'a> {
14321432
// the most sense, which is immediately after the last token:
14331433
//
14341434
// {foo(bar {}}
1435-
// - ^
1435+
// ^ ^
14361436
// | |
14371437
// | help: `)` may belong here
14381438
// |
14391439
// unclosed delimiter
14401440
if let Some(sp) = unmatched.unclosed_span {
1441+
let mut primary_span: Vec<Span> =
1442+
err.span.primary_spans().iter().cloned().collect();
1443+
primary_span.push(sp);
1444+
let mut primary_span: MultiSpan = primary_span.into();
1445+
for span_label in err.span.span_labels() {
1446+
if let Some(label) = span_label.label {
1447+
primary_span.push_span_label(span_label.span, label);
1448+
}
1449+
}
1450+
err.set_span(primary_span);
14411451
err.span_label(sp, "unclosed delimiter");
14421452
}
14431453
// Backticks should be removed to apply suggestions.

compiler/rustc_parse/src/parser/mod.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use rustc_data_structures::sync::Lrc;
3333
use rustc_errors::PResult;
3434
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, FatalError};
3535
use rustc_session::parse::ParseSess;
36-
use rustc_span::source_map::{Span, DUMMY_SP};
36+
use rustc_span::source_map::{MultiSpan, Span, DUMMY_SP};
3737
use rustc_span::symbol::{kw, sym, Ident, Symbol};
3838
use tracing::debug;
3939

@@ -1335,8 +1335,13 @@ crate fn make_unclosed_delims_error(
13351335
// `None` here means an `Eof` was found. We already emit those errors elsewhere, we add them to
13361336
// `unmatched_braces` only for error recovery in the `Parser`.
13371337
let found_delim = unmatched.found_delim?;
1338+
let span: MultiSpan = if let Some(sp) = unmatched.unclosed_span {
1339+
vec![unmatched.found_span, sp].into()
1340+
} else {
1341+
unmatched.found_span.into()
1342+
};
13381343
let mut err = sess.span_diagnostic.struct_span_err(
1339-
unmatched.found_span,
1344+
span,
13401345
&format!(
13411346
"mismatched closing delimiter: `{}`",
13421347
pprust::token_kind_to_string(&token::CloseDelim(found_delim)),

src/test/ui/parser/issue-10636-1.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: mismatched closing delimiter: `)`
2-
--> $DIR/issue-10636-1.rs:4:1
2+
--> $DIR/issue-10636-1.rs:1:12
33
|
44
LL | struct Obj {
5-
| - unclosed delimiter
5+
| ^ unclosed delimiter
66
...
77
LL | )
88
| ^ mismatched closing delimiter

src/test/ui/parser/issue-10636-2.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
2-
--> $DIR/issue-10636-2.rs:5:25
2+
--> $DIR/issue-10636-2.rs:5:15
33
|
44
LL | option.map(|some| 42;
5-
| - ^ help: `)` may belong here
5+
| ^ ^ help: `)` may belong here
66
| |
77
| unclosed delimiter
88

src/test/ui/parser/issue-58856-1.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: expected one of `)`, `,`, or `:`, found `>`
2-
--> $DIR/issue-58856-1.rs:3:14
2+
--> $DIR/issue-58856-1.rs:3:9
33
|
44
LL | fn b(self>
5-
| - ^ help: `)` may belong here
5+
| ^ ^ help: `)` may belong here
66
| |
77
| unclosed delimiter
88

src/test/ui/parser/issue-58856-2.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: expected one of `)` or `,`, found `->`
2-
--> $DIR/issue-58856-2.rs:6:26
2+
--> $DIR/issue-58856-2.rs:6:19
33
|
44
LL | fn how_are_you(&self -> Empty {
5-
| - -^^
5+
| ^ -^^
66
| | |
77
| | help: `)` may belong here
88
| unclosed delimiter

src/test/ui/parser/issue-60075.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ LL | }
1717
| - item list ends here
1818

1919
error: mismatched closing delimiter: `)`
20-
--> $DIR/issue-60075.rs:6:10
20+
--> $DIR/issue-60075.rs:4:31
2121
|
2222
LL | fn qux() -> Option<usize> {
23-
| - unclosed delimiter
23+
| ^ unclosed delimiter
2424
LL | let _ = if true {
2525
LL | });
2626
| ^ mismatched closing delimiter

src/test/ui/parser/issue-62973.stderr

+6-6
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ LL |
2121
| ^
2222

2323
error: expected one of `,` or `}`, found `{`
24-
--> $DIR/issue-62973.rs:6:25
24+
--> $DIR/issue-62973.rs:6:8
2525
|
2626
LL | fn p() { match s { v, E { [) {) }
27-
| - - -^ expected one of `,` or `}`
27+
| ^ - -^ expected one of `,` or `}`
2828
| | | |
2929
| | | help: `}` may belong here
3030
| | while parsing this struct
@@ -56,18 +56,18 @@ LL |
5656
| ^ expected one of `.`, `?`, `{`, or an operator
5757

5858
error: mismatched closing delimiter: `)`
59-
--> $DIR/issue-62973.rs:6:28
59+
--> $DIR/issue-62973.rs:6:27
6060
|
6161
LL | fn p() { match s { v, E { [) {) }
62-
| -^ mismatched closing delimiter
62+
| ^^ mismatched closing delimiter
6363
| |
6464
| unclosed delimiter
6565

6666
error: mismatched closing delimiter: `)`
67-
--> $DIR/issue-62973.rs:6:31
67+
--> $DIR/issue-62973.rs:6:30
6868
|
6969
LL | fn p() { match s { v, E { [) {) }
70-
| -^ mismatched closing delimiter
70+
| ^^ mismatched closing delimiter
7171
| |
7272
| unclosed delimiter
7373

src/test/ui/parser/issue-63116.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ LL | impl W <s(f;Y(;]
1313
| ^ expected one of 7 possible tokens
1414

1515
error: mismatched closing delimiter: `]`
16-
--> $DIR/issue-63116.rs:3:16
16+
--> $DIR/issue-63116.rs:3:14
1717
|
1818
LL | impl W <s(f;Y(;]
19-
| - ^ mismatched closing delimiter
19+
| ^ ^ mismatched closing delimiter
2020
| |
2121
| unclosed delimiter
2222

src/test/ui/parser/issue-66357-unexpected-unreachable.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ LL | fn f() { |[](* }
55
| ^ expected one of `,` or `:`
66

77
error: expected one of `&`, `(`, `)`, `-`, `...`, `..=`, `..`, `[`, `_`, `box`, `mut`, `ref`, `|`, identifier, or path, found `*`
8-
--> $DIR/issue-66357-unexpected-unreachable.rs:12:14
8+
--> $DIR/issue-66357-unexpected-unreachable.rs:12:13
99
|
1010
LL | fn f() { |[](* }
11-
| -^ help: `)` may belong here
11+
| ^^ help: `)` may belong here
1212
| |
1313
| unclosed delimiter
1414

src/test/ui/parser/issue-67377-invalid-syntax-in-enum-discriminant.stderr

+24-24
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,107 @@
11
error: mismatched closing delimiter: `]`
2-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:42
2+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:27
33
|
44
LL | V = [PhantomData; { [ () ].len() ].len() as isize,
5-
| - - ^ mismatched closing delimiter
5+
| - ^ ^ mismatched closing delimiter
66
| | |
77
| | unclosed delimiter
88
| closing delimiter possibly meant for this
99

1010
error: mismatched closing delimiter: `]`
11-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:36
11+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:24
1212
|
1313
LL | V = [Vec::new; { [].len() ].len() as isize,
14-
| - - ^ mismatched closing delimiter
14+
| - ^ ^ mismatched closing delimiter
1515
| | |
1616
| | unclosed delimiter
1717
| closing delimiter possibly meant for this
1818

1919
error: mismatched closing delimiter: `]`
20-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:36
20+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:24
2121
|
2222
LL | V = [Vec::new; { [0].len() ].len() as isize,
23-
| - - ^ mismatched closing delimiter
23+
| - ^ ^ mismatched closing delimiter
2424
| | |
2525
| | unclosed delimiter
2626
| closing delimiter possibly meant for this
2727

2828
error: mismatched closing delimiter: `]`
29-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:42
29+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:27
3030
|
3131
LL | V = [PhantomData; { [ () ].len() ].len() as isize,
32-
| - - ^ mismatched closing delimiter
32+
| - ^ ^ mismatched closing delimiter
3333
| | |
3434
| | unclosed delimiter
3535
| closing delimiter possibly meant for this
3636

3737
error: mismatched closing delimiter: `]`
38-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:36
38+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:24
3939
|
4040
LL | V = [Vec::new; { [].len() ].len() as isize,
41-
| - - ^ mismatched closing delimiter
41+
| - ^ ^ mismatched closing delimiter
4242
| | |
4343
| | unclosed delimiter
4444
| closing delimiter possibly meant for this
4545

4646
error: mismatched closing delimiter: `]`
47-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:36
47+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:24
4848
|
4949
LL | V = [Vec::new; { [0].len() ].len() as isize,
50-
| - - ^ mismatched closing delimiter
50+
| - ^ ^ mismatched closing delimiter
5151
| | |
5252
| | unclosed delimiter
5353
| closing delimiter possibly meant for this
5454

5555
error: mismatched closing delimiter: `]`
56-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:42
56+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:27
5757
|
5858
LL | V = [PhantomData; { [ () ].len() ].len() as isize,
59-
| - - ^ mismatched closing delimiter
59+
| - ^ ^ mismatched closing delimiter
6060
| | |
6161
| | unclosed delimiter
6262
| closing delimiter possibly meant for this
6363

6464
error: mismatched closing delimiter: `]`
65-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:36
65+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:24
6666
|
6767
LL | V = [Vec::new; { [].len() ].len() as isize,
68-
| - - ^ mismatched closing delimiter
68+
| - ^ ^ mismatched closing delimiter
6969
| | |
7070
| | unclosed delimiter
7171
| closing delimiter possibly meant for this
7272

7373
error: mismatched closing delimiter: `]`
74-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:36
74+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:24
7575
|
7676
LL | V = [Vec::new; { [0].len() ].len() as isize,
77-
| - - ^ mismatched closing delimiter
77+
| - ^ ^ mismatched closing delimiter
7878
| | |
7979
| | unclosed delimiter
8080
| closing delimiter possibly meant for this
8181

8282
error: mismatched closing delimiter: `]`
83-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:42
83+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:5:27
8484
|
8585
LL | V = [PhantomData; { [ () ].len() ].len() as isize,
86-
| - - ^ mismatched closing delimiter
86+
| - ^ ^ mismatched closing delimiter
8787
| | |
8888
| | unclosed delimiter
8989
| closing delimiter possibly meant for this
9090

9191
error: mismatched closing delimiter: `]`
92-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:36
92+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:15:24
9393
|
9494
LL | V = [Vec::new; { [].len() ].len() as isize,
95-
| - - ^ mismatched closing delimiter
95+
| - ^ ^ mismatched closing delimiter
9696
| | |
9797
| | unclosed delimiter
9898
| closing delimiter possibly meant for this
9999

100100
error: mismatched closing delimiter: `]`
101-
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:36
101+
--> $DIR/issue-67377-invalid-syntax-in-enum-discriminant.rs:26:24
102102
|
103103
LL | V = [Vec::new; { [0].len() ].len() as isize,
104-
| - - ^ mismatched closing delimiter
104+
| - ^ ^ mismatched closing delimiter
105105
| | |
106106
| | unclosed delimiter
107107
| closing delimiter possibly meant for this

src/test/ui/parser/macro-mismatched-delim-brace-paren.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: mismatched closing delimiter: `)`
2-
--> $DIR/macro-mismatched-delim-brace-paren.rs:6:5
2+
--> $DIR/macro-mismatched-delim-brace-paren.rs:4:10
33
|
44
LL | foo! {
5-
| - unclosed delimiter
5+
| ^ unclosed delimiter
66
LL | bar, "baz", 1, 2.0
77
LL | )
88
| ^ mismatched closing delimiter

src/test/ui/parser/macro-mismatched-delim-paren-brace.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ LL | }
1010
| ^ unexpected closing delimiter
1111

1212
error: mismatched closing delimiter: `}`
13-
--> $DIR/macro-mismatched-delim-paren-brace.rs:4:5
13+
--> $DIR/macro-mismatched-delim-paren-brace.rs:2:10
1414
|
1515
LL | foo! (
16-
| - unclosed delimiter
16+
| ^ unclosed delimiter
1717
LL | bar, "baz", 1, 2.0
1818
LL | }
1919
| ^ mismatched closing delimiter

src/test/ui/parser/parser-recovery-2.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ LL | let x = y.;
55
| ^
66

77
error: mismatched closing delimiter: `)`
8-
--> $DIR/parser-recovery-2.rs:6:5
8+
--> $DIR/parser-recovery-2.rs:4:14
99
|
1010
LL | fn bar() {
11-
| - unclosed delimiter
11+
| ^ unclosed delimiter
1212
LL | let x = foo();
1313
LL | )
1414
| ^ mismatched closing delimiter

src/test/ui/parser/unclosed-delimiter-in-dep.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
error: mismatched closing delimiter: `}`
2-
--> $DIR/unclosed_delim_mod.rs:7:1
2+
--> $DIR/unclosed_delim_mod.rs:5:7
33
|
44
LL | pub fn new() -> Result<Value, ()> {
55
| - closing delimiter possibly meant for this
66
LL | Ok(Value {
7-
| - unclosed delimiter
7+
| ^ unclosed delimiter
88
LL | }
99
LL | }
1010
| ^ mismatched closing delimiter

src/test/ui/parser/unclosed_delim_mod.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
error: mismatched closing delimiter: `}`
2-
--> $DIR/unclosed_delim_mod.rs:7:1
2+
--> $DIR/unclosed_delim_mod.rs:5:7
33
|
44
LL | pub fn new() -> Result<Value, ()> {
55
| - closing delimiter possibly meant for this
66
LL | Ok(Value {
7-
| - unclosed delimiter
7+
| ^ unclosed delimiter
88
LL | }
99
LL | }
1010
| ^ mismatched closing delimiter

src/test/ui/parser/use-unclosed-brace.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ LL | fn main() {}
88
| ^
99

1010
error: expected one of `,`, `::`, `as`, or `}`, found `;`
11-
--> $DIR/use-unclosed-brace.rs:4:19
11+
--> $DIR/use-unclosed-brace.rs:4:10
1212
|
1313
LL | use foo::{bar, baz;
14-
| - ^
14+
| ^ ^
1515
| | |
1616
| | expected one of `,`, `::`, `as`, or `}`
1717
| | help: `}` may belong here

src/test/ui/resolve/token-error-correct-2.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: mismatched closing delimiter: `)`
2-
--> $DIR/token-error-correct-2.rs:6:5
2+
--> $DIR/token-error-correct-2.rs:4:12
33
|
44
LL | if foo {
5-
| - unclosed delimiter
5+
| ^ unclosed delimiter
66
LL |
77
LL | )
88
| ^ mismatched closing delimiter

src/test/ui/resolve/token-error-correct-3.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
2-
--> $DIR/token-error-correct-3.rs:13:35
2+
--> $DIR/token-error-correct-3.rs:13:21
33
|
44
LL | callback(path.as_ref();
5-
| - ^ help: `)` may belong here
5+
| ^ ^ help: `)` may belong here
66
| |
77
| unclosed delimiter
88

0 commit comments

Comments
 (0)