@@ -34,9 +34,12 @@ pub(super) fn same_indentation_level(sm: &SourceMap, open_sp: Span, close_sp: Sp
3434
3535// When we get a `)` or `]` for `{`, we should emit help message here
3636// 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 {
3841 let mut reported_missing_open = false ;
39- for unmatch_brace in unmatched_delims. iter ( ) {
42+ unmatched_delims. retain ( |unmatch_brace| {
4043 if let Some ( delim) = unmatch_brace. found_delim
4144 && matches ! ( delim, Delimiter :: Parenthesis | Delimiter :: Bracket )
4245 {
@@ -45,13 +48,20 @@ fn report_missing_open_delim(err: &mut Diag<'_>, unmatched_delims: &[UnmatchedDe
4548 Delimiter :: Bracket => "[" ,
4649 _ => unreachable ! ( ) ,
4750 } ;
51+
52+ if let Some ( unclosed_span) = unmatch_brace. unclosed_span {
53+ err. span_label ( unclosed_span, "the nearest open delimiter" ) ;
54+ }
4855 err. span_label (
4956 unmatch_brace. found_span . shrink_to_lo ( ) ,
5057 format ! ( "missing open `{missed_open}` for this delimiter" ) ,
5158 ) ;
5259 reported_missing_open = true ;
60+ false
61+ } else {
62+ true
5363 }
54- }
64+ } ) ;
5565 reported_missing_open
5666}
5767
@@ -61,10 +71,6 @@ pub(super) fn report_suspicious_mismatch_block(
6171 sm : & SourceMap ,
6272 delim : Delimiter ,
6373) {
64- if report_missing_open_delim ( err, & diag_info. unmatched_delims ) {
65- return ;
66- }
67-
6874 let mut matched_spans: Vec < ( Span , bool ) > = diag_info
6975 . matching_block_spans
7076 . iter ( )
0 commit comments