@@ -49,9 +49,26 @@ impl<'a> StringReader<'a> {
4949                let  msg = "this file contains an un-closed delimiter" ; 
5050                let  mut  err = self . sess . span_diagnostic . struct_span_err ( self . span ,  msg) ; 
5151                for  & ( _,  sp)  in  & self . open_braces  { 
52-                     err. span_help ( sp,  "did you mean to close this  delimiter? " ) ; 
52+                     err. span_label ( sp,  "un-closed  delimiter" ) ; 
5353                } 
5454
55+                 if  let  Some ( ( delim,  _) )  = self . open_braces . last ( )  { 
56+                     if  let  Some ( ( d,  open_sp,  close_sp) )  = self . suspicious_open_spans . iter ( ) 
57+                         . filter ( |( d,  _,  _) | delim == d) 
58+                         . next ( )   // these are in reverse order as they get inserted on close, but 
59+                     {             // we want the last open/first close 
60+                         if  d == delim { 
61+                             err. span_label ( 
62+                                 * open_sp, 
63+                                 "this delimiter might not be properly closed..." , 
64+                             ) ; 
65+                             err. span_label ( 
66+                                 * close_sp, 
67+                                 "...as it matches this but it has different indentation" , 
68+                             ) ; 
69+                         } 
70+                     } 
71+                 } 
5572                Err ( err) 
5673            } , 
5774            token:: OpenDelim ( delim)  => { 
@@ -70,11 +87,20 @@ impl<'a> StringReader<'a> {
7087                // Expand to cover the entire delimited token tree 
7188                let  span = pre_span. with_hi ( self . span . hi ( ) ) ; 
7289
90+                 let  sm = self . sess . source_map ( ) ; 
7391                match  self . token  { 
7492                    // Correct delimiter. 
7593                    token:: CloseDelim ( d)  if  d == delim => { 
76-                         self . open_braces . pop ( ) . unwrap ( ) ; 
77- 
94+                         let  ( open_brace,  open_brace_span)  = self . open_braces . pop ( ) . unwrap ( ) ; 
95+                         if  let  Some ( current_padding)  = sm. span_to_margin ( self . span )  { 
96+                             if  let  Some ( padding)  = sm. span_to_margin ( open_brace_span)  { 
97+                                 if  current_padding != padding { 
98+                                     self . suspicious_open_spans . push ( 
99+                                         ( open_brace,  open_brace_span,  self . span ) , 
100+                                     ) ; 
101+                                 } 
102+                             } 
103+                         } 
78104                        // Parse the close delimiter. 
79105                        self . real_token ( ) ; 
80106                    } 
@@ -94,8 +120,21 @@ impl<'a> StringReader<'a> {
94120                            // delimiter. The previous unclosed delimiters could actually be 
95121                            // closed! The parser just hasn't gotten to them yet. 
96122                            if  let  Some ( & ( _,  sp) )  = self . open_braces . last ( )  { 
97-                                 err. span_label ( sp,  "unclosed  delimiter" ) ; 
123+                                 err. span_label ( sp,  "un-closed  delimiter" ) ; 
98124                            } ; 
125+                             if  let  Some ( current_padding)  = sm. span_to_margin ( self . span )  { 
126+                                 for  ( brace,  brace_span)  in  & self . open_braces  { 
127+                                     if  let  Some ( padding)  = sm. span_to_margin ( * brace_span)  { 
128+                                         // high likelihood of these two corresponding 
129+                                         if  current_padding == padding && brace == & other { 
130+                                             err. span_label ( 
131+                                                 * brace_span, 
132+                                                 "close delimiter possibly meant for this" , 
133+                                             ) ; 
134+                                         } 
135+                                     } 
136+                                 } 
137+                             } 
99138                            err. emit ( ) ; 
100139                        } 
101140                        self . open_braces . pop ( ) . unwrap ( ) ; 
0 commit comments