Rollup merge of #93999 - barzamin:suggest-raw-strings, r=jackh726

suggest using raw strings when invalid escapes appear in literals

i'd guess about 70% of "bad escape" cases occur when someone meant to use a raw string literal because they're passing it directly to `Regex::new()`.
this emits an advisory (`Applicability::MaybeIncorrect`) `help:` suggestion to the user that they use an `r""` string, on top of the normal notes about looking at the string literal documentation/spec.
This commit is contained in:
Matthias Krüger 2022-02-15 16:02:35 +01:00 committed by GitHub
commit c6b27db876
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 0 deletions

View File

@ -185,6 +185,15 @@ pub(crate) fn emit_unescape_error(
version control settings",
);
} else {
if !mode.is_bytes() {
diag.span_suggestion(
span_with_quotes,
"if you meant to write a literal backslash (perhaps escaping in a regular expression), consider a raw string literal",
format!("r\"{}\"", lit),
Applicability::MaybeIncorrect,
);
}
diag.help(
"for more information, visit \
<https://static.rust-lang.org/doc/master/reference.html#literals>",

View File

@ -17,6 +17,10 @@ LL | '\●'
| ^ unknown character escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
help: if you meant to write a literal backslash (perhaps escaping in a regular expression), consider a raw string literal
|
LL | r"\●"
| ~~~~~
error: unknown character escape: `\u{25cf}`
--> $DIR/lex-bad-char-literals-1.rs:14:7
@ -25,6 +29,10 @@ LL | "\●"
| ^ unknown character escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
help: if you meant to write a literal backslash (perhaps escaping in a regular expression), consider a raw string literal
|
LL | r"\●"
| ~~~~~
error: aborting due to 4 previous errors

View File

@ -0,0 +1,7 @@
fn main() {
let ok = r"ab\[c";
let bad = "ab\[c";
//~^ ERROR unknown character escape: `[`
//~| HELP for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
//~| HELP if you meant to write a literal backslash (perhaps escaping in a regular expression), consider a raw string literal
}

View File

@ -0,0 +1,14 @@
error: unknown character escape: `[`
--> $DIR/bad-escape-suggest-raw-string.rs:3:19
|
LL | let bad = "ab\[c";
| ^ unknown character escape
|
= help: for more information, visit <https://static.rust-lang.org/doc/master/reference.html#literals>
help: if you meant to write a literal backslash (perhaps escaping in a regular expression), consider a raw string literal
|
LL | let bad = r"ab\[c";
| ~~~~~~~~
error: aborting due to previous error