quote_depth: @mut 0,
obsolete_set: @mut HashSet::new(),
mod_path_stack: @mut ~[],
+ open_braces: @mut ~[]
}
}
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]
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 =
// Parse the close delimiter.
result.push(parse_any_tt_tok(self));
+ self.open_braces.pop();
tt_delim(@mut result)
}
--- /dev/null
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+static foo: int = 2; } //~ ERROR incorrect close delimiter:
+
// option. This file may not be copied, modified, or distributed
// except according to those terms.
-// xfail-test
-/*
- Ideally, the error about the missing close brace in foo would be reported
- near the corresponding open brace. But currently it's reported at the end.
- xfailed for now (see Issue #2354)
- */
-fn foo() { //~ ERROR this open brace is not closed
+fn foo() { //~ NOTE Did you mean to close this delimiter?
match Some(x) {
Some(y) { fail!(); }
None { fail!(); }
while (i < 1000) {}
}
-fn main() {}
+fn main() {} //~ ERROR This file contains an un-closed delimiter