Skip to content

Commit

Permalink
Rollup merge of #93999 - barzamin:suggest-raw-strings, r=jackh726
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
matthiaskrgr authored Feb 15, 2022
2 parents e1baa3d + e59cda9 commit c6b27db
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 0 deletions.
9 changes: 9 additions & 0 deletions compiler/rustc_parse/src/lexer/unescape_error_reporting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>",
Expand Down
8 changes: 8 additions & 0 deletions src/test/ui/lexer/lex-bad-char-literals-1.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

7 changes: 7 additions & 0 deletions src/test/ui/parser/bad-escape-suggest-raw-string.rs
Original file line number Diff line number Diff line change
@@ -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
}
14 changes: 14 additions & 0 deletions src/test/ui/parser/bad-escape-suggest-raw-string.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c6b27db

Please sign in to comment.