@@ -34,9 +34,12 @@ pub(super) fn same_indentation_level(sm: &SourceMap, open_sp: Span, close_sp: Sp
34
34
35
35
// When we get a `)` or `]` for `{`, we should emit help message here
36
36
// it's more friendly compared to report `unmatched error` in later phase
37
- fn report_missing_open_delim ( err : & mut Diag < ' _ > , unmatched_delims : & [ UnmatchedDelim ] ) -> bool {
37
+ fn report_missing_open_delim (
38
+ err : & mut Diag < ' _ > ,
39
+ unmatched_delims : & mut Vec < UnmatchedDelim > ,
40
+ ) -> bool {
38
41
let mut reported_missing_open = false ;
39
- for unmatch_brace in unmatched_delims. iter ( ) {
42
+ unmatched_delims. retain ( |unmatch_brace| {
40
43
if let Some ( delim) = unmatch_brace. found_delim
41
44
&& matches ! ( delim, Delimiter :: Parenthesis | Delimiter :: Bracket )
42
45
{
@@ -45,23 +48,30 @@ fn report_missing_open_delim(err: &mut Diag<'_>, unmatched_delims: &[UnmatchedDe
45
48
Delimiter :: Bracket => "[" ,
46
49
_ => unreachable ! ( ) ,
47
50
} ;
51
+
52
+ if let Some ( unclosed_span) = unmatch_brace. unclosed_span {
53
+ err. span_label ( unclosed_span, "unclosed delimiter before unmatched delimiter" ) ;
54
+ }
48
55
err. span_label (
49
56
unmatch_brace. found_span . shrink_to_lo ( ) ,
50
57
format ! ( "missing open `{missed_open}` for this delimiter" ) ,
51
58
) ;
52
59
reported_missing_open = true ;
60
+ false
61
+ } else {
62
+ true
53
63
}
54
- }
64
+ } ) ;
55
65
reported_missing_open
56
66
}
57
67
58
68
pub ( super ) fn report_suspicious_mismatch_block (
59
69
err : & mut Diag < ' _ > ,
60
- diag_info : & TokenTreeDiagInfo ,
70
+ diag_info : & mut TokenTreeDiagInfo ,
61
71
sm : & SourceMap ,
62
72
delim : Delimiter ,
63
73
) {
64
- if report_missing_open_delim ( err, & diag_info. unmatched_delims ) {
74
+ if report_missing_open_delim ( err, & mut diag_info. unmatched_delims ) {
65
75
return ;
66
76
}
67
77
0 commit comments