Skip to content

Commit 0ef9c5f

Browse files
committed
error correction for missing or mismatched closing brackets
1 parent 36a9f0c commit 0ef9c5f

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

src/libsyntax/parse/parser.rs

+40-28
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ impl<'a> Parser<'a> {
850850
-> PResult<'a, Vec<T>> where
851851
F: FnMut(&mut Parser<'a>) -> PResult<'a, T>,
852852
{
853-
let val = try!(self.parse_seq_to_before_end(ket, sep, f));
853+
let val = self.parse_seq_to_before_end(ket, sep, f);
854854
self.bump();
855855
Ok(val)
856856
}
@@ -862,23 +862,37 @@ impl<'a> Parser<'a> {
862862
ket: &token::Token,
863863
sep: SeqSep,
864864
mut f: F)
865-
-> PResult<'a, Vec<T>> where
866-
F: FnMut(&mut Parser<'a>) -> PResult<'a, T>,
865+
-> Vec<T>
866+
where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>,
867867
{
868868
let mut first: bool = true;
869869
let mut v = vec!();
870870
while self.token != *ket {
871871
match sep.sep {
872-
Some(ref t) => {
873-
if first { first = false; }
874-
else { try!(self.expect(t)); }
875-
}
876-
_ => ()
872+
Some(ref t) => {
873+
if first {
874+
first = false;
875+
} else {
876+
if let Err(mut e) = self.expect(t) {
877+
e.emit();
878+
break;
879+
}
880+
}
881+
}
882+
_ => ()
877883
}
878884
if sep.trailing_sep_allowed && self.check(ket) { break; }
879-
v.push(try!(f(self)));
885+
886+
match f(self) {
887+
Ok(t) => v.push(t),
888+
Err(mut e) => {
889+
e.emit();
890+
break;
891+
}
892+
}
880893
}
881-
return Ok(v);
894+
895+
v
882896
}
883897

884898
/// Parse a sequence, including the closing delimiter. The function
@@ -893,7 +907,7 @@ impl<'a> Parser<'a> {
893907
F: FnMut(&mut Parser<'a>) -> PResult<'a, T>,
894908
{
895909
try!(self.expect(bra));
896-
let result = try!(self.parse_seq_to_before_end(ket, sep, f));
910+
let result = self.parse_seq_to_before_end(ket, sep, f);
897911
self.bump();
898912
Ok(result)
899913
}
@@ -929,7 +943,7 @@ impl<'a> Parser<'a> {
929943
{
930944
let lo = self.span.lo;
931945
try!(self.expect(bra));
932-
let result = try!(self.parse_seq_to_before_end(ket, sep, f));
946+
let result = self.parse_seq_to_before_end(ket, sep, f);
933947
let hi = self.span.hi;
934948
self.bump();
935949
Ok(spanned(lo, hi, result))
@@ -2643,13 +2657,14 @@ impl<'a> Parser<'a> {
26432657

26442658
match self.token {
26452659
token::Eof => {
2646-
let open_braces = self.open_braces.clone();
26472660
let mut err: DiagnosticBuilder<'a> =
2648-
self.fatal("this file contains an un-closed delimiter");
2649-
for sp in &open_braces {
2661+
self.diagnostic().struct_span_err(self.span,
2662+
"this file contains an un-closed delimiter");
2663+
for sp in &self.open_braces {
26502664
err.span_help(*sp, "did you mean to close this delimiter?");
26512665
}
2652-
return Err(err);
2666+
2667+
Err(err)
26532668
},
26542669
token::OpenDelim(delim) => {
26552670
// The span for beginning of the delimited section
@@ -2661,11 +2676,9 @@ impl<'a> Parser<'a> {
26612676
self.bump();
26622677

26632678
// Parse the token trees within the delimiters
2664-
let tts = try!(self.parse_seq_to_before_end(
2665-
&token::CloseDelim(delim),
2666-
seq_sep_none(),
2667-
|p| p.parse_token_tree()
2668-
));
2679+
let tts = self.parse_seq_to_before_end(&token::CloseDelim(delim),
2680+
seq_sep_none(),
2681+
|p| p.parse_token_tree());
26692682

26702683
// Parse the close delimiter.
26712684
let close_span = self.span;
@@ -2691,7 +2704,7 @@ impl<'a> Parser<'a> {
26912704
match self.token {
26922705
token::CloseDelim(_) => {
26932706
let token_str = self.this_token_to_string();
2694-
let mut err = self.fatal(
2707+
let mut err = self.diagnostic().struct_span_err(self.span,
26952708
&format!("incorrect close delimiter: `{}`", token_str));
26962709
// This is a conservative error: only report the last unclosed delimiter.
26972710
// The previous unclosed delimiters could actually be closed! The parser
@@ -4516,11 +4529,11 @@ impl<'a> Parser<'a> {
45164529
token::Comma => {
45174530
self.bump();
45184531
let sep = seq_sep_trailing_allowed(token::Comma);
4519-
let mut fn_inputs = try!(self.parse_seq_to_before_end(
4532+
let mut fn_inputs = self.parse_seq_to_before_end(
45204533
&token::CloseDelim(token::Paren),
45214534
sep,
45224535
parse_arg_fn
4523-
));
4536+
);
45244537
fn_inputs.insert(0, Arg::new_self(explicit_self_sp, mutbl_self, $self_id));
45254538
fn_inputs
45264539
}
@@ -4539,8 +4552,7 @@ impl<'a> Parser<'a> {
45394552
let fn_inputs = match explicit_self {
45404553
SelfKind::Static => {
45414554
let sep = seq_sep_trailing_allowed(token::Comma);
4542-
try!(self.parse_seq_to_before_end(&token::CloseDelim(token::Paren),
4543-
sep, parse_arg_fn))
4555+
self.parse_seq_to_before_end(&token::CloseDelim(token::Paren), sep, parse_arg_fn)
45444556
}
45454557
SelfKind::Value(id) => parse_remaining_arguments!(id),
45464558
SelfKind::Region(_,_,id) => parse_remaining_arguments!(id),
@@ -4571,11 +4583,11 @@ impl<'a> Parser<'a> {
45714583
} else {
45724584
try!(self.expect(&token::BinOp(token::Or)));
45734585
try!(self.parse_obsolete_closure_kind());
4574-
let args = try!(self.parse_seq_to_before_end(
4586+
let args = self.parse_seq_to_before_end(
45754587
&token::BinOp(token::Or),
45764588
seq_sep_trailing_allowed(token::Comma),
45774589
|p| p.parse_fn_block_arg()
4578-
));
4590+
);
45794591
self.bump();
45804592
args
45814593
}

0 commit comments

Comments
 (0)