diff options
| author | bors <bors@rust-lang.org> | 2018-08-16 17:53:29 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-08-16 17:53:29 +0000 |
| commit | b2028828db7e4870cb6a310f8ad8169ac9ea134d (patch) | |
| tree | bc4f6c4442f67a7b62f9afe54c0b1368a3ca210f /src/libsyntax/parse | |
| parent | b5590423e6ceb048dd7d792382e960d66b7615d2 (diff) | |
| parent | a68e61a9f207fd2be27584bbea184822e22d8cfe (diff) | |
| download | rust-b2028828db7e4870cb6a310f8ad8169ac9ea134d.tar.gz rust-b2028828db7e4870cb6a310f8ad8169ac9ea134d.zip | |
Auto merge of #53433 - kennytm:rollup, r=kennytm
Rollup of 10 pull requests Successful merges: - #52946 (Documented impl From on line 367 of libserialize/json.rs) - #53234 (Remove Travis shutdown debug scripts, and remove CI-specific DNS settings) - #53313 (Two small improvements) - #53360 (Addressed #51602) - #53364 (Warn if the user tries to use GATs) - #53373 (Tweak unclosed delimiter parser error) - #53377 (std: Use target_pointer_width for BACKTRACE_ELF_SIZE) - #53395 (Use #[non_exhaustive] on internal enums) - #53399 (Tidy: ignore non-Markdown files when linting for the Unstable Book) - #53412 (syntax_ext: remove leftover span_err_if_not_stage0 macro.)
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/lexer/mod.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/parse/lexer/tokentrees.rs | 30 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 8 |
3 files changed, 28 insertions, 12 deletions
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index 5913c63bfaa..bdf25618f47 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> { @@ -216,6 +217,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 1e7855e68dd..e2fd7faf903 100644 --- a/src/libsyntax/parse/lexer/tokentrees.rs +++ b/src/libsyntax/parse/lexer/tokentrees.rs @@ -81,16 +81,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); - // 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_note(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 @@ -122,7 +129,8 @@ impl<'a> StringReader<'a> { // matching opening delimiter). let token_str = token_to_string(&self.token); let msg = format!("unexpected close delimiter: `{}`", token_str); - let err = self.sess.span_diagnostic.struct_span_err(self.span, &msg); + let mut err = self.sess.span_diagnostic.struct_span_err(self.span, &msg); + err.span_label(self.span, "unexpected close delimiter"); Err(err) }, _ => { diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index b1e1cdee2ee..345464c6664 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4719,7 +4719,12 @@ impl<'a> Parser<'a> { if !self.eat(&token::OpenDelim(token::Brace)) { let sp = self.span; let tok = self.this_token_to_string(); + let mut do_not_suggest_help = false; let mut e = self.span_fatal(sp, &format!("expected `{{`, found `{}`", tok)); + if self.token.is_keyword(keywords::In) || self.token == token::Colon { + do_not_suggest_help = true; + e.span_label(sp, "expected `{`"); + } // Check to see if the user has written something like // @@ -4729,7 +4734,8 @@ impl<'a> Parser<'a> { // Which is valid in other languages, but not Rust. match self.parse_stmt_without_recovery(false) { Ok(Some(stmt)) => { - if self.look_ahead(1, |t| t == &token::OpenDelim(token::Brace)) { + if self.look_ahead(1, |t| t == &token::OpenDelim(token::Brace)) + || do_not_suggest_help { // if the next token is an open brace (e.g., `if a b {`), the place- // inside-a-block suggestion would be more likely wrong than right return Err(e); |
