Auto merge of #87662 - FabianWolff:rb-string, r=estebank

Suggest `br` if the unknown string prefix `rb` is found

Currently, for the following code:
```rust
fn main() {
    rb"abc";
}
```
we issue the following suggestion:
```
help: consider inserting whitespace here
  |
2 |     rb "abc";
  |       --
```
With my changes (only in edition 2021, where unknown prefixes became an error), I get:
```
help: use `br` for a raw byte string
  |
2 |     br"abc";
  |     ^^
```
This commit is contained in:
bors 2021-07-31 20:20:18 +00:00
commit 4e282795d7
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