about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorCorey Richardson <corey@octayn.net>2013-11-24 21:18:20 -0500
committerCorey Richardson <corey@octayn.net>2013-11-24 21:32:38 -0500
commitab1986103738083a5bcf5af4db4be2930459f45f (patch)
tree047257203e9fcd0f32355f3ab00f17ca01bb1683 /src/libsyntax/parse
parentb3ff24adaa8c7f9c48c525f284526c23ffd33fcb (diff)
downloadrust-ab1986103738083a5bcf5af4db4be2930459f45f.tar.gz
rust-ab1986103738083a5bcf5af4db4be2930459f45f.zip
Add a note for unclosed delimiters
Currently, the parser doesn't give any context when it finds an unclosed
delimiter and it's not EOF. Report the most recent unclosed delimiter, to help
the user along.

Closes #10636
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 486a7a800a0..315872ce8cd 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2086,15 +2086,13 @@ impl Parser {
         fn parse_non_delim_tt_tok(p: &Parser) -> token_tree {
             maybe_whole!(deref p, nt_tt);
             match *p.token {
-              token::RPAREN | token::RBRACE | token::RBRACKET
-              => {
-                p.fatal(
-                    format!(
-                        "incorrect close delimiter: `{}`",
-                        p.this_token_to_str()
-                    )
-                );
-              }
+              token::RPAREN | token::RBRACE | token::RBRACKET => {
+                  // This is a conservative error: only report the last unclosed delimiter. The
+                  // previous unclosed delimiters could actually be closed! The parser just hasn't
+                  // gotten to them yet.
+                  p.open_braces.last_opt().map(|sp| p.span_note(*sp, "unclosed delimiter"));
+                  p.fatal(format!("incorrect close delimiter: `{}`", p.this_token_to_str()));
+              },
               /* we ought to allow different depths of unquotation */
               token::DOLLAR if *p.quote_depth > 0u => {
                 p.bump();