diff options
| author | bors <bors@rust-lang.org> | 2014-11-14 08:17:19 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-11-14 08:17:19 +0000 |
| commit | bb2168c5252adeda1dd35ccf7050df89655233d7 (patch) | |
| tree | 92a9000b4fbf28afbb55bd93a337bcc9255ed9c3 /src/libsyntax/parse | |
| parent | 6f7081fad5889c7b41460103fc8abc98f3285c60 (diff) | |
| parent | 661598cef0ffafb0a5446d4b2b2aea89466102ec (diff) | |
| download | rust-bb2168c5252adeda1dd35ccf7050df89655233d7.tar.gz rust-bb2168c5252adeda1dd35ccf7050df89655233d7.zip | |
auto merge of #18840 : huonw/rust/tweaks, r=alexcrichton
Fix some old papercuts with diagnostics, e.g. tweaking spans, rewording messages. See individual commits.
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/lexer/mod.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 64 |
2 files changed, 47 insertions, 24 deletions
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index 35d56440b50..01a66243a96 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -806,6 +806,13 @@ impl<'a> StringReader<'a> { if ascii_only { "unknown byte escape" } else { "unknown character escape" }, c); + if e == '\r' { + let sp = codemap::mk_sp(escaped_pos, last_pos); + self.span_diagnostic.span_help( + sp, + "this is an isolated carriage return; consider checking \ + your editor and version control settings.") + } false } } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 42ec1e80342..db10dc1bc90 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -66,6 +66,7 @@ use ast_util::{as_prec, ident_to_path, operator_prec}; use ast_util; use codemap::{Span, BytePos, Spanned, spanned, mk_sp}; use codemap; +use diagnostic; use ext::tt::macro_parser; use parse; use parse::attr::ParserAttr; @@ -941,6 +942,11 @@ impl<'a> Parser<'a> { pub fn span_fatal(&mut self, sp: Span, m: &str) -> ! { self.sess.span_diagnostic.span_fatal(sp, m) } + pub fn span_fatal_help(&mut self, sp: Span, m: &str, help: &str) -> ! { + self.span_err(sp, m); + self.span_help(sp, help); + panic!(diagnostic::FatalError); + } pub fn span_note(&mut self, sp: Span, m: &str) { self.sess.span_diagnostic.span_note(sp, m) } @@ -1641,7 +1647,8 @@ impl<'a> Parser<'a> { token::LitByte(i) => LitByte(parse::byte_lit(i.as_str()).val0()), token::LitChar(i) => LitChar(parse::char_lit(i.as_str()).val0()), token::LitInteger(s) => parse::integer_lit(s.as_str(), - &self.sess.span_diagnostic, self.span), + &self.sess.span_diagnostic, + self.last_span), token::LitFloat(s) => parse::float_lit(s.as_str()), token::LitStr(s) => { LitStr(token::intern_and_get_ident(parse::str_lit(s.as_str()).as_slice()), @@ -3710,7 +3717,14 @@ impl<'a> Parser<'a> { maybe_whole!(no_clone self, NtBlock); let lo = self.span.lo; - self.expect(&token::OpenDelim(token::Brace)); + + if !self.eat(&token::OpenDelim(token::Brace)) { + let sp = self.span; + let tok = self.this_token_to_string(); + self.span_fatal_help(sp, + format!("expected `{{`, found `{}`", tok).as_slice(), + "place this code inside a block"); + } return self.parse_block_tail_(lo, DefaultBlock, Vec::new()); } @@ -4701,9 +4715,10 @@ impl<'a> Parser<'a> { _ => { let span = self.span; let token_str = self.this_token_to_string(); - self.span_fatal(span, - format!("expected `,`, or `}}`, found `{}`", - token_str).as_slice()) + self.span_fatal_help(span, + format!("expected `,`, or `}}`, found `{}`", + token_str).as_slice(), + "struct fields should be separated by commas") } } a_var @@ -4905,19 +4920,24 @@ impl<'a> Parser<'a> { (true, false) => (default_path, false), (false, true) => (secondary_path, true), (false, false) => { - self.span_fatal(id_sp, - format!("file not found for module \ - `{}`", - mod_name).as_slice()); + self.span_fatal_help(id_sp, + format!("file not found for module `{}`", + mod_name).as_slice(), + format!("name the file either {} or {} inside \ + the directory {}", + default_path_str, + secondary_path_str, + dir_path.display()).as_slice()); } (true, true) => { - self.span_fatal( + self.span_fatal_help( id_sp, format!("file for module `{}` found at both {} \ and {}", mod_name, default_path_str, - secondary_path_str).as_slice()); + secondary_path_str).as_slice(), + "delete or rename one of them to remove the ambiguity"); } } } @@ -5070,9 +5090,10 @@ impl<'a> Parser<'a> { // skip the ident if there is one if self.token.is_ident() { self.bump(); } - self.span_err(span, - format!("expected `;`, found `as`; perhaps you meant \ - to enclose the crate name `{}` in a string?", + self.span_err(span, "expected `;`, found `as`"); + self.span_help(span, + format!("perhaps you meant to enclose the crate name `{}` in \ + a string?", the_ident.as_str()).as_slice()); None } else { @@ -5582,16 +5603,12 @@ impl<'a> Parser<'a> { } // FAILURE TO PARSE ITEM - if visibility != Inherited { - let mut s = String::from_str("unmatched visibility `"); - if visibility == Public { - s.push_str("pub") - } else { - s.push_str("priv") + match visibility { + Inherited => {} + Public => { + let last_span = self.last_span; + self.span_fatal(last_span, "unmatched visibility `pub`"); } - s.push('`'); - let last_span = self.last_span; - self.span_fatal(last_span, s.as_slice()); } return IoviNone(attrs); } @@ -5913,4 +5930,3 @@ impl<'a> Parser<'a> { } } } - |
