1
Fork 0

add limit for unclosed delimiters in lexer diagnostic

This commit is contained in:
yukang 2024-07-19 14:58:16 +08:00
parent 9a5e41c56f
commit 94a3fd7678
4 changed files with 25 additions and 32 deletions

View file

@ -72,16 +72,31 @@ impl<'psess, 'src> TokenTreesReader<'psess, 'src> {
fn eof_err(&mut self) -> PErr<'psess> { fn eof_err(&mut self) -> PErr<'psess> {
let msg = "this file contains an unclosed delimiter"; let msg = "this file contains an unclosed delimiter";
let mut err = self.string_reader.dcx().struct_span_err(self.token.span, msg); let mut err = self.string_reader.dcx().struct_span_err(self.token.span, msg);
for &(_, sp) in &self.diag_info.open_braces {
err.span_label(sp, "unclosed delimiter"); let unclosed_delimiter_show_limit = 5;
let len = usize::min(unclosed_delimiter_show_limit, self.diag_info.open_braces.len());
for &(_, span) in &self.diag_info.open_braces[..len] {
err.span_label(span, "unclosed delimiter");
self.diag_info.unmatched_delims.push(UnmatchedDelim { self.diag_info.unmatched_delims.push(UnmatchedDelim {
found_delim: None, found_delim: None,
found_span: self.token.span, found_span: self.token.span,
unclosed_span: Some(sp), unclosed_span: Some(span),
candidate_span: None, candidate_span: None,
}); });
} }
if let Some((_, span)) = self.diag_info.open_braces.get(unclosed_delimiter_show_limit)
&& self.diag_info.open_braces.len() >= unclosed_delimiter_show_limit + 2
{
err.span_label(
*span,
format!(
"another {} unclosed delimiters begin from here",
self.diag_info.open_braces.len() - unclosed_delimiter_show_limit
),
);
}
if let Some((delim, _)) = self.diag_info.open_braces.last() { if let Some((delim, _)) = self.diag_info.open_braces.last() {
report_suspicious_mismatch_block( report_suspicious_mismatch_block(
&mut err, &mut err,

View file

@ -17,14 +17,8 @@ LL | fn qux() {
| - unclosed delimiter | - unclosed delimiter
... ...
LL | fn foo() { LL | fn foo() {
| - unclosed delimiter | - another 3 unclosed delimiters begin from here
... ...
LL | fn bar() {
| - unclosed delimiter
...
LL | fn baz() {
| - unclosed delimiter
LL | if false {
LL | { LL | {
| - this delimiter might not be properly closed... | - this delimiter might not be properly closed...
LL | && let () = () LL | && let () = ()

View file

@ -1,7 +1,6 @@
// ignore-tidy-trailing-newlines
// issue: rust-lang/rust#127868 // issue: rust-lang/rust#127868
fn main() { fn main() {
let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,; let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
} //~ ERROR mismatched closing delimiter: `}` } //~ ERROR mismatched closing delimiter: `}`
//~ ERROR this file contains an unclosed delimiter //~ ERROR this file contains an unclosed delimiter

View file

@ -1,5 +1,5 @@
error: mismatched closing delimiter: `}` error: mismatched closing delimiter: `}`
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:5:42 --> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:4:42
| |
LL | fn main() { LL | fn main() {
| - closing delimiter possibly meant for this | - closing delimiter possibly meant for this
@ -9,29 +9,14 @@ LL | }
| ^ mismatched closing delimiter | ^ mismatched closing delimiter
error: this file contains an unclosed delimiter error: this file contains an unclosed delimiter
--> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:7:51 --> $DIR/mismatched-delimiter-corner-case-issue-127868.rs:6:52
| |
LL | fn main() { LL | fn main() {
| - unclosed delimiter | - unclosed delimiter
LL | let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,; LL | let a = [[[[[[[[[[[[[[[[[[[[1, {, (, [,;
| -------------------- - this delimiter might not be properly closed... | ----- - this delimiter might not be properly closed...
| |||||||||||||||||||| | |||||
| |||||||||||||||||||unclosed delimiter | ||||another 16 unclosed delimiters begin from here
| ||||||||||||||||||unclosed delimiter
| |||||||||||||||||unclosed delimiter
| ||||||||||||||||unclosed delimiter
| |||||||||||||||unclosed delimiter
| ||||||||||||||unclosed delimiter
| |||||||||||||unclosed delimiter
| ||||||||||||unclosed delimiter
| |||||||||||unclosed delimiter
| ||||||||||unclosed delimiter
| |||||||||unclosed delimiter
| ||||||||unclosed delimiter
| |||||||unclosed delimiter
| ||||||unclosed delimiter
| |||||unclosed delimiter
| ||||unclosed delimiter
| |||unclosed delimiter | |||unclosed delimiter
| ||unclosed delimiter | ||unclosed delimiter
| |unclosed delimiter | |unclosed delimiter