Suggest br if the unknown string prefix rb is found

This commit is contained in:
Fabian Wolff 2021-07-31 15:37:36 +02:00
parent fc24bcead1
commit f2c9654dcd
3 changed files with 41 additions and 3 deletions

View File

@ -505,7 +505,8 @@ fn report_unterminated_raw_string(
// identifier tokens.
fn report_unknown_prefix(&self, start: BytePos) {
let prefix_span = self.mk_sp(start, self.pos);
let msg = format!("prefix `{}` is unknown", self.str_from_to(start, self.pos));
let prefix_str = self.str_from_to(start, self.pos);
let msg = format!("prefix `{}` is unknown", prefix_str);
let expn_data = prefix_span.ctxt().outer_expn_data();
@ -513,12 +514,19 @@ fn report_unknown_prefix(&self, start: BytePos) {
// In Rust 2021, this is a hard error.
let mut err = self.sess.span_diagnostic.struct_span_err(prefix_span, &msg);
err.span_label(prefix_span, "unknown prefix");
if expn_data.is_root() {
if prefix_str == "rb" {
err.span_suggestion_verbose(
prefix_span,
"use `br` for a raw byte string",
"br".to_string(),
Applicability::MaybeIncorrect,
);
} else if expn_data.is_root() {
err.span_suggestion_verbose(
prefix_span.shrink_to_hi(),
"consider inserting whitespace here",
" ".into(),
Applicability::MachineApplicable,
Applicability::MaybeIncorrect,
);
}
err.note("prefixed identifiers and literals are reserved since Rust 2021");

View File

@ -0,0 +1,10 @@
// `br` and `rb` are easy to confuse; check that we issue a suggestion to help.
// edition:2021
fn main() {
rb"abc";
//~^ ERROR: prefix `rb` is unknown
//~| HELP: use `br` for a raw byte string
//~| ERROR: expected one of
}

View File

@ -0,0 +1,20 @@
error: prefix `rb` is unknown
--> $DIR/raw-byte-string-prefix.rs:6:5
|
LL | rb"abc";
| ^^ unknown prefix
|
= note: prefixed identifiers and literals are reserved since Rust 2021
help: use `br` for a raw byte string
|
LL | br"abc";
| ^^
error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `"abc"`
--> $DIR/raw-byte-string-prefix.rs:6:7
|
LL | rb"abc";
| ^^^^^ expected one of 8 possible tokens
error: aborting due to 2 previous errors