@@ -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
+ pub ( super ) 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,13 +48,20 @@ 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, "the nearest open 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
@@ -61,10 +71,6 @@ pub(super) fn report_suspicious_mismatch_block(
61
71
sm : & SourceMap ,
62
72
delim : Delimiter ,
63
73
) {
64
- if report_missing_open_delim ( err, & diag_info. unmatched_delims ) {
65
- return ;
66
- }
67
-
68
74
let mut matched_spans: Vec < ( Span , bool ) > = diag_info
69
75
. matching_block_spans
70
76
. iter ( )
0 commit comments