diff options
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index cad19543608..e9f55c62b6c 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -308,6 +308,7 @@ pub fn Parser(sess: @mut ParseSess, quote_depth: @mut 0, obsolete_set: @mut HashSet::new(), mod_path_stack: @mut ~[], + open_braces: @mut ~[] } } @@ -336,6 +337,8 @@ pub struct Parser { obsolete_set: @mut HashSet<ObsoleteSyntax>, /// Used to determine the path to externally loaded source files mod_path_stack: @mut ~[@str], + /// Stack of spans of open delimiters. Used for error message. + open_braces: @mut ~[@Span] } #[unsafe_destructor] @@ -2022,12 +2025,18 @@ impl Parser { match *self.token { token::EOF => { - self.fatal("file ended with unbalanced delimiters"); + for sp in self.open_braces.iter() { + self.span_note(**sp, "Did you mean to close this delimiter?"); + } + // There shouldn't really be a span, but it's easier for the test runner + // if we give it one + self.fatal("This file contains an un-closed delimiter "); } token::LPAREN | token::LBRACE | token::LBRACKET => { let close_delim = token::flip_delimiter(&*self.token); // Parse the open delimiter. + (*self.open_braces).push(@*self.span); let mut result = ~[parse_any_tt_tok(self)]; let trees = @@ -2038,6 +2047,7 @@ impl Parser { // Parse the close delimiter. result.push(parse_any_tt_tok(self)); + self.open_braces.pop(); tt_delim(@mut result) } |
