@@ -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