diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2018-08-15 14:26:03 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2018-08-15 14:26:03 -0700 |
| commit | 1b5e29ae6f5f330c01cfe47c3fab5a75e5ddbfa2 (patch) | |
| tree | 3bc1881bce85f0522b1d4f54f69d6ef4d2f8926a /src | |
| parent | 2a74d7924a138b720e054fa6ea9610b5ba56d061 (diff) | |
| download | rust-1b5e29ae6f5f330c01cfe47c3fab5a75e5ddbfa2.tar.gz rust-1b5e29ae6f5f330c01cfe47c3fab5a75e5ddbfa2.zip | |
Do not emit "incorrect close delimiter" twice in the same place
Diffstat (limited to 'src')
| -rw-r--r-- | src/libsyntax/parse/lexer/mod.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/lexer/tokentrees.rs | 28 | ||||
| -rw-r--r-- | src/test/ui/resolve/token-error-correct.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/resolve/token-error-correct.stderr | 11 |
4 files changed, 20 insertions, 22 deletions
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index f9b9e95ead1..ffa6f65dc02 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -67,6 +67,7 @@ pub struct StringReader<'a> { span_src_raw: Span, open_braces: Vec<(token::DelimToken, Span)>, crate override_span: Option<Span>, + last_unclosed_found_span: Option<Span>, } impl<'a> StringReader<'a> { @@ -195,6 +196,7 @@ impl<'a> StringReader<'a> { span_src_raw: syntax_pos::DUMMY_SP, open_braces: Vec::new(), override_span, + last_unclosed_found_span: None, } } diff --git a/src/libsyntax/parse/lexer/tokentrees.rs b/src/libsyntax/parse/lexer/tokentrees.rs index c578108a3fc..af8ac3895c2 100644 --- a/src/libsyntax/parse/lexer/tokentrees.rs +++ b/src/libsyntax/parse/lexer/tokentrees.rs @@ -77,17 +77,23 @@ impl<'a> StringReader<'a> { // Incorrect delimiter. token::CloseDelim(other) => { let token_str = token_to_string(&self.token); - let msg = format!("incorrect close delimiter: `{}`", token_str); - let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg); - err.span_label(self.span, "incorrect close delimiter"); - // 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. - if let Some(&(_, sp)) = self.open_braces.last() { - err.span_label(sp, "unclosed delimiter"); - }; - err.emit(); - + if self.last_unclosed_found_span != Some(self.span) { + // do not complain about the same unclosed delimiter multiple times + self.last_unclosed_found_span = Some(self.span); + let msg = format!("incorrect close delimiter: `{}`", token_str); + let mut err = self.sess.span_diagnostic.struct_span_err( + self.span, + &msg, + ); + err.span_label(self.span, "incorrect close delimiter"); + // 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. + if let Some(&(_, sp)) = self.open_braces.last() { + err.span_label(sp, "unclosed delimiter"); + }; + err.emit(); + } self.open_braces.pop().unwrap(); // If the incorrect delimiter matches an earlier opening diff --git a/src/test/ui/resolve/token-error-correct.rs b/src/test/ui/resolve/token-error-correct.rs index c88f823839d..39c664e270c 100644 --- a/src/test/ui/resolve/token-error-correct.rs +++ b/src/test/ui/resolve/token-error-correct.rs @@ -15,4 +15,3 @@ fn main() { //~^ ERROR: expected expression, found `;` } //~^ ERROR: incorrect close delimiter: `}` -//~| ERROR: incorrect close delimiter: `}` diff --git a/src/test/ui/resolve/token-error-correct.stderr b/src/test/ui/resolve/token-error-correct.stderr index bae57dd77c8..1e246b6f085 100644 --- a/src/test/ui/resolve/token-error-correct.stderr +++ b/src/test/ui/resolve/token-error-correct.stderr @@ -7,20 +7,11 @@ LL | //~^ ERROR: expected expression, found `;` LL | } | ^ incorrect close delimiter -error: incorrect close delimiter: `}` - --> $DIR/token-error-correct.rs:16:1 - | -LL | foo(bar(; - | - unclosed delimiter -LL | //~^ ERROR: expected expression, found `;` -LL | } - | ^ incorrect close delimiter - error: expected expression, found `;` --> $DIR/token-error-correct.rs:14:13 | LL | foo(bar(; | ^ expected expression -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors |
