Skip to content

Commit 098d80d

Browse files
authored
Rollup merge of rust-lang#53373 - estebank:unclosed, r=petrochenkov
Tweak unclosed delimiter parser error
2 parents 4968eea + c9274c7 commit 098d80d

11 files changed

+58
-61
lines changed

src/libsyntax/parse/lexer/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ pub struct StringReader<'a> {
6767
span_src_raw: Span,
6868
open_braces: Vec<(token::DelimToken, Span)>,
6969
crate override_span: Option<Span>,
70+
last_unclosed_found_span: Option<Span>,
7071
}
7172

7273
impl<'a> StringReader<'a> {
@@ -216,6 +217,7 @@ impl<'a> StringReader<'a> {
216217
span_src_raw: syntax_pos::DUMMY_SP,
217218
open_braces: Vec::new(),
218219
override_span,
220+
last_unclosed_found_span: None,
219221
}
220222
}
221223

src/libsyntax/parse/lexer/tokentrees.rs

+19-11
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,23 @@ impl<'a> StringReader<'a> {
8181
// Incorrect delimiter.
8282
token::CloseDelim(other) => {
8383
let token_str = token_to_string(&self.token);
84-
let msg = format!("incorrect close delimiter: `{}`", token_str);
85-
let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
86-
// This is a conservative error: only report the last unclosed delimiter.
87-
// The previous unclosed delimiters could actually be closed! The parser
88-
// just hasn't gotten to them yet.
89-
if let Some(&(_, sp)) = self.open_braces.last() {
90-
err.span_note(sp, "unclosed delimiter");
91-
};
92-
err.emit();
93-
84+
if self.last_unclosed_found_span != Some(self.span) {
85+
// do not complain about the same unclosed delimiter multiple times
86+
self.last_unclosed_found_span = Some(self.span);
87+
let msg = format!("incorrect close delimiter: `{}`", token_str);
88+
let mut err = self.sess.span_diagnostic.struct_span_err(
89+
self.span,
90+
&msg,
91+
);
92+
err.span_label(self.span, "incorrect close delimiter");
93+
// This is a conservative error: only report the last unclosed
94+
// delimiter. The previous unclosed delimiters could actually be
95+
// closed! The parser just hasn't gotten to them yet.
96+
if let Some(&(_, sp)) = self.open_braces.last() {
97+
err.span_label(sp, "unclosed delimiter");
98+
};
99+
err.emit();
100+
}
94101
self.open_braces.pop().unwrap();
95102

96103
// If the incorrect delimiter matches an earlier opening
@@ -122,7 +129,8 @@ impl<'a> StringReader<'a> {
122129
// matching opening delimiter).
123130
let token_str = token_to_string(&self.token);
124131
let msg = format!("unexpected close delimiter: `{}`", token_str);
125-
let err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
132+
let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
133+
err.span_label(self.span, "unexpected close delimiter");
126134
Err(err)
127135
},
128136
_ => {

src/test/ui-fulldeps/invalid-punct-ident-4.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error: unexpected close delimiter: `)`
22
--> $DIR/invalid-punct-ident-4.rs:16:1
33
|
44
LL | lexer_failure!(); //~ ERROR proc macro panicked
5-
| ^^^^^^^^^^^^^^^^^
5+
| ^^^^^^^^^^^^^^^^^ unexpected close delimiter
66

77
error: proc macro panicked
88
--> $DIR/invalid-punct-ident-4.rs:16:1

src/test/parse-fail/issue-10636-1.rs renamed to src/test/ui/issue-10636-1.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@
1212

1313
struct Obj { //~ NOTE: unclosed delimiter
1414
member: usize
15-
) //~ ERROR: incorrect close delimiter
15+
)
16+
//~^ ERROR incorrect close delimiter
17+
//~| NOTE incorrect close delimiter
18+
19+
fn main() {}

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

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
error: incorrect close delimiter: `)`
2+
--> $DIR/issue-10636-1.rs:15:1
3+
|
4+
LL | struct Obj { //~ NOTE: unclosed delimiter
5+
| - unclosed delimiter
6+
LL | member: usize
7+
LL | )
8+
| ^ incorrect close delimiter
9+
10+
error: aborting due to previous error
11+

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

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
error: incorrect close delimiter: `)`
22
--> $DIR/parser-recovery-2.rs:18:5
33
|
4-
LL | ) //~ ERROR incorrect close delimiter: `)`
5-
| ^
6-
|
7-
note: unclosed delimiter
8-
--> $DIR/parser-recovery-2.rs:16:14
9-
|
104
LL | fn bar() {
11-
| ^
5+
| - unclosed delimiter
6+
LL | let x = foo(); //~ ERROR cannot find function `foo` in this scope
7+
LL | ) //~ ERROR incorrect close delimiter: `)`
8+
| ^ incorrect close delimiter
129

1310
error: unexpected token: `;`
1411
--> $DIR/parser-recovery-2.rs:22:15

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

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
error: incorrect close delimiter: `)`
22
--> $DIR/token-error-correct-2.rs:16:5
33
|
4-
LL | ) //~ ERROR: incorrect close delimiter: `)`
5-
| ^
6-
|
7-
note: unclosed delimiter
8-
--> $DIR/token-error-correct-2.rs:14:12
9-
|
104
LL | if foo {
11-
| ^
5+
| - unclosed delimiter
6+
LL | //~^ ERROR: cannot find value `foo`
7+
LL | ) //~ ERROR: incorrect close delimiter: `)`
8+
| ^ incorrect close delimiter
129

1310
error[E0425]: cannot find value `foo` in this scope
1411
--> $DIR/token-error-correct-2.rs:14:8

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

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
error: incorrect close delimiter: `}`
22
--> $DIR/token-error-correct-3.rs:30:9
33
|
4-
LL | } else { //~ ERROR: incorrect close delimiter: `}`
5-
| ^
6-
|
7-
note: unclosed delimiter
8-
--> $DIR/token-error-correct-3.rs:24:21
9-
|
104
LL | callback(path.as_ref(); //~ ERROR expected one of
11-
| ^
5+
| - unclosed delimiter
6+
...
7+
LL | } else { //~ ERROR: incorrect close delimiter: `}`
8+
| ^ incorrect close delimiter
129

1310
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
1411
--> $DIR/token-error-correct-3.rs:24:35

src/test/ui/resolve/token-error-correct.rs

-1
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,3 @@ fn main() {
1515
//~^ ERROR: expected expression, found `;`
1616
}
1717
//~^ ERROR: incorrect close delimiter: `}`
18-
//~| ERROR: incorrect close delimiter: `}`
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,17 @@
11
error: incorrect close delimiter: `}`
22
--> $DIR/token-error-correct.rs:16:1
33
|
4-
LL | }
5-
| ^
6-
|
7-
note: unclosed delimiter
8-
--> $DIR/token-error-correct.rs:14:12
9-
|
104
LL | foo(bar(;
11-
| ^
12-
13-
error: incorrect close delimiter: `}`
14-
--> $DIR/token-error-correct.rs:16:1
15-
|
5+
| - unclosed delimiter
6+
LL | //~^ ERROR: expected expression, found `;`
167
LL | }
17-
| ^
18-
|
19-
note: unclosed delimiter
20-
--> $DIR/token-error-correct.rs:14:8
21-
|
22-
LL | foo(bar(;
23-
| ^
8+
| ^ incorrect close delimiter
249

2510
error: expected expression, found `;`
2611
--> $DIR/token-error-correct.rs:14:13
2712
|
2813
LL | foo(bar(;
2914
| ^ expected expression
3015

31-
error: aborting due to 3 previous errors
16+
error: aborting due to 2 previous errors
3217

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

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
error: incorrect close delimiter: `}`
22
--> $DIR/issue-10636-2.rs:18:1
33
|
4-
LL | } //~ ERROR: incorrect close delimiter
5-
| ^
6-
|
7-
note: unclosed delimiter
8-
--> $DIR/issue-10636-2.rs:15:15
9-
|
104
LL | option.map(|some| 42;
11-
| ^
5+
| - unclosed delimiter
6+
...
7+
LL | } //~ ERROR: incorrect close delimiter
8+
| ^ incorrect close delimiter
129

1310
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
1411
--> $DIR/issue-10636-2.rs:15:25

0 commit comments

Comments
 (0)