Rollup merge of #53373 - estebank:unclosed, r=petrochenkov
Tweak unclosed delimiter parser error
This commit is contained in:
@@ -67,6 +67,7 @@ pub struct StringReader<'a> {
|
|||||||
span_src_raw: Span,
|
span_src_raw: Span,
|
||||||
open_braces: Vec<(token::DelimToken, Span)>,
|
open_braces: Vec<(token::DelimToken, Span)>,
|
||||||
crate override_span: Option<Span>,
|
crate override_span: Option<Span>,
|
||||||
|
last_unclosed_found_span: Option<Span>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> StringReader<'a> {
|
impl<'a> StringReader<'a> {
|
||||||
@@ -216,6 +217,7 @@ impl<'a> StringReader<'a> {
|
|||||||
span_src_raw: syntax_pos::DUMMY_SP,
|
span_src_raw: syntax_pos::DUMMY_SP,
|
||||||
open_braces: Vec::new(),
|
open_braces: Vec::new(),
|
||||||
override_span,
|
override_span,
|
||||||
|
last_unclosed_found_span: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -81,16 +81,23 @@ impl<'a> StringReader<'a> {
|
|||||||
// Incorrect delimiter.
|
// Incorrect delimiter.
|
||||||
token::CloseDelim(other) => {
|
token::CloseDelim(other) => {
|
||||||
let token_str = token_to_string(&self.token);
|
let token_str = token_to_string(&self.token);
|
||||||
|
if self.last_unclosed_found_span != Some(self.span) {
|
||||||
|
// do not complain about the same unclosed delimiter multiple times
|
||||||
|
self.last_unclosed_found_span = Some(self.span);
|
||||||
let msg = format!("incorrect close delimiter: `{}`", token_str);
|
let msg = format!("incorrect close delimiter: `{}`", token_str);
|
||||||
let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
|
let mut err = self.sess.span_diagnostic.struct_span_err(
|
||||||
// This is a conservative error: only report the last unclosed delimiter.
|
self.span,
|
||||||
// The previous unclosed delimiters could actually be closed! The parser
|
&msg,
|
||||||
// just hasn't gotten to them yet.
|
);
|
||||||
|
err.span_label(self.span, "incorrect close delimiter");
|
||||||
|
// This is a conservative error: only report the last unclosed
|
||||||
|
// delimiter. The previous unclosed delimiters could actually be
|
||||||
|
// closed! The parser just hasn't gotten to them yet.
|
||||||
if let Some(&(_, sp)) = self.open_braces.last() {
|
if let Some(&(_, sp)) = self.open_braces.last() {
|
||||||
err.span_note(sp, "unclosed delimiter");
|
err.span_label(sp, "unclosed delimiter");
|
||||||
};
|
};
|
||||||
err.emit();
|
err.emit();
|
||||||
|
}
|
||||||
self.open_braces.pop().unwrap();
|
self.open_braces.pop().unwrap();
|
||||||
|
|
||||||
// If the incorrect delimiter matches an earlier opening
|
// If the incorrect delimiter matches an earlier opening
|
||||||
@@ -122,7 +129,8 @@ impl<'a> StringReader<'a> {
|
|||||||
// matching opening delimiter).
|
// matching opening delimiter).
|
||||||
let token_str = token_to_string(&self.token);
|
let token_str = token_to_string(&self.token);
|
||||||
let msg = format!("unexpected close delimiter: `{}`", token_str);
|
let msg = format!("unexpected close delimiter: `{}`", token_str);
|
||||||
let err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
|
let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg);
|
||||||
|
err.span_label(self.span, "unexpected close delimiter");
|
||||||
Err(err)
|
Err(err)
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ error: unexpected close delimiter: `)`
|
|||||||
--> $DIR/invalid-punct-ident-4.rs:16:1
|
--> $DIR/invalid-punct-ident-4.rs:16:1
|
||||||
|
|
|
|
||||||
LL | lexer_failure!(); //~ ERROR proc macro panicked
|
LL | lexer_failure!(); //~ ERROR proc macro panicked
|
||||||
| ^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^ unexpected close delimiter
|
||||||
|
|
||||||
error: proc macro panicked
|
error: proc macro panicked
|
||||||
--> $DIR/invalid-punct-ident-4.rs:16:1
|
--> $DIR/invalid-punct-ident-4.rs:16:1
|
||||||
|
|||||||
@@ -12,4 +12,8 @@
|
|||||||
|
|
||||||
struct Obj { //~ NOTE: unclosed delimiter
|
struct Obj { //~ NOTE: unclosed delimiter
|
||||||
member: usize
|
member: usize
|
||||||
) //~ ERROR: incorrect close delimiter
|
)
|
||||||
|
//~^ ERROR incorrect close delimiter
|
||||||
|
//~| NOTE incorrect close delimiter
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
11
src/test/ui/issue-10636-1.stderr
Normal file
11
src/test/ui/issue-10636-1.stderr
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
error: incorrect close delimiter: `)`
|
||||||
|
--> $DIR/issue-10636-1.rs:15:1
|
||||||
|
|
|
||||||
|
LL | struct Obj { //~ NOTE: unclosed delimiter
|
||||||
|
| - unclosed delimiter
|
||||||
|
LL | member: usize
|
||||||
|
LL | )
|
||||||
|
| ^ incorrect close delimiter
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
@@ -1,14 +1,11 @@
|
|||||||
error: incorrect close delimiter: `)`
|
error: incorrect close delimiter: `)`
|
||||||
--> $DIR/parser-recovery-2.rs:18:5
|
--> $DIR/parser-recovery-2.rs:18:5
|
||||||
|
|
|
|
||||||
LL | ) //~ ERROR incorrect close delimiter: `)`
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
note: unclosed delimiter
|
|
||||||
--> $DIR/parser-recovery-2.rs:16:14
|
|
||||||
|
|
|
||||||
LL | fn bar() {
|
LL | fn bar() {
|
||||||
| ^
|
| - unclosed delimiter
|
||||||
|
LL | let x = foo(); //~ ERROR cannot find function `foo` in this scope
|
||||||
|
LL | ) //~ ERROR incorrect close delimiter: `)`
|
||||||
|
| ^ incorrect close delimiter
|
||||||
|
|
||||||
error: unexpected token: `;`
|
error: unexpected token: `;`
|
||||||
--> $DIR/parser-recovery-2.rs:22:15
|
--> $DIR/parser-recovery-2.rs:22:15
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
error: incorrect close delimiter: `)`
|
error: incorrect close delimiter: `)`
|
||||||
--> $DIR/token-error-correct-2.rs:16:5
|
--> $DIR/token-error-correct-2.rs:16:5
|
||||||
|
|
|
|
||||||
LL | ) //~ ERROR: incorrect close delimiter: `)`
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
note: unclosed delimiter
|
|
||||||
--> $DIR/token-error-correct-2.rs:14:12
|
|
||||||
|
|
|
||||||
LL | if foo {
|
LL | if foo {
|
||||||
| ^
|
| - unclosed delimiter
|
||||||
|
LL | //~^ ERROR: cannot find value `foo`
|
||||||
|
LL | ) //~ ERROR: incorrect close delimiter: `)`
|
||||||
|
| ^ incorrect close delimiter
|
||||||
|
|
||||||
error[E0425]: cannot find value `foo` in this scope
|
error[E0425]: cannot find value `foo` in this scope
|
||||||
--> $DIR/token-error-correct-2.rs:14:8
|
--> $DIR/token-error-correct-2.rs:14:8
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
error: incorrect close delimiter: `}`
|
error: incorrect close delimiter: `}`
|
||||||
--> $DIR/token-error-correct-3.rs:30:9
|
--> $DIR/token-error-correct-3.rs:30:9
|
||||||
|
|
|
|
||||||
LL | } else { //~ ERROR: incorrect close delimiter: `}`
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
note: unclosed delimiter
|
|
||||||
--> $DIR/token-error-correct-3.rs:24:21
|
|
||||||
|
|
|
||||||
LL | callback(path.as_ref(); //~ ERROR expected one of
|
LL | callback(path.as_ref(); //~ ERROR expected one of
|
||||||
| ^
|
| - unclosed delimiter
|
||||||
|
...
|
||||||
|
LL | } else { //~ ERROR: incorrect close delimiter: `}`
|
||||||
|
| ^ incorrect close delimiter
|
||||||
|
|
||||||
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
|
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
|
||||||
--> $DIR/token-error-correct-3.rs:24:35
|
--> $DIR/token-error-correct-3.rs:24:35
|
||||||
|
|||||||
@@ -15,4 +15,3 @@ fn main() {
|
|||||||
//~^ ERROR: expected expression, found `;`
|
//~^ ERROR: expected expression, found `;`
|
||||||
}
|
}
|
||||||
//~^ ERROR: incorrect close delimiter: `}`
|
//~^ ERROR: incorrect close delimiter: `}`
|
||||||
//~| ERROR: incorrect close delimiter: `}`
|
|
||||||
|
|||||||
@@ -1,26 +1,11 @@
|
|||||||
error: incorrect close delimiter: `}`
|
error: incorrect close delimiter: `}`
|
||||||
--> $DIR/token-error-correct.rs:16:1
|
--> $DIR/token-error-correct.rs:16:1
|
||||||
|
|
|
|
||||||
LL | }
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
note: unclosed delimiter
|
|
||||||
--> $DIR/token-error-correct.rs:14:12
|
|
||||||
|
|
|
||||||
LL | foo(bar(;
|
LL | foo(bar(;
|
||||||
| ^
|
| - unclosed delimiter
|
||||||
|
LL | //~^ ERROR: expected expression, found `;`
|
||||||
error: incorrect close delimiter: `}`
|
|
||||||
--> $DIR/token-error-correct.rs:16:1
|
|
||||||
|
|
|
||||||
LL | }
|
LL | }
|
||||||
| ^
|
| ^ incorrect close delimiter
|
||||||
|
|
|
||||||
note: unclosed delimiter
|
|
||||||
--> $DIR/token-error-correct.rs:14:8
|
|
||||||
|
|
|
||||||
LL | foo(bar(;
|
|
||||||
| ^
|
|
||||||
|
|
||||||
error: expected expression, found `;`
|
error: expected expression, found `;`
|
||||||
--> $DIR/token-error-correct.rs:14:13
|
--> $DIR/token-error-correct.rs:14:13
|
||||||
@@ -28,5 +13,5 @@ error: expected expression, found `;`
|
|||||||
LL | foo(bar(;
|
LL | foo(bar(;
|
||||||
| ^ expected expression
|
| ^ expected expression
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,11 @@
|
|||||||
error: incorrect close delimiter: `}`
|
error: incorrect close delimiter: `}`
|
||||||
--> $DIR/issue-10636-2.rs:18:1
|
--> $DIR/issue-10636-2.rs:18:1
|
||||||
|
|
|
|
||||||
LL | } //~ ERROR: incorrect close delimiter
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
note: unclosed delimiter
|
|
||||||
--> $DIR/issue-10636-2.rs:15:15
|
|
||||||
|
|
|
||||||
LL | option.map(|some| 42;
|
LL | option.map(|some| 42;
|
||||||
| ^
|
| - unclosed delimiter
|
||||||
|
...
|
||||||
|
LL | } //~ ERROR: incorrect close delimiter
|
||||||
|
| ^ incorrect close delimiter
|
||||||
|
|
||||||
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
|
error: expected one of `)`, `,`, `.`, `?`, or an operator, found `;`
|
||||||
--> $DIR/issue-10636-2.rs:15:25
|
--> $DIR/issue-10636-2.rs:15:25
|
||||||
|
|||||||
Reference in New Issue
Block a user