about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2018-08-15 14:26:03 -0700
committerEsteban Küber <esteban@kuber.com.ar>2018-08-15 14:26:03 -0700
commit1b5e29ae6f5f330c01cfe47c3fab5a75e5ddbfa2 (patch)
tree3bc1881bce85f0522b1d4f54f69d6ef4d2f8926a /src
parent2a74d7924a138b720e054fa6ea9610b5ba56d061 (diff)
downloadrust-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.rs2
-rw-r--r--src/libsyntax/parse/lexer/tokentrees.rs28
-rw-r--r--src/test/ui/resolve/token-error-correct.rs1
-rw-r--r--src/test/ui/resolve/token-error-correct.stderr11
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