From e59cda9ee1b9fab3fe966ea7e4b12c14b1f85789 Mon Sep 17 00:00:00 2001 From: Erin Petra Sofiya Moon Date: Mon, 14 Feb 2022 14:21:43 -0500 Subject: [PATCH] suggest using raw string literals when invalid escapes appear 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. --- .../src/lexer/unescape_error_reporting.rs | 9 +++++++++ src/test/ui/lexer/lex-bad-char-literals-1.stderr | 8 ++++++++ .../ui/parser/bad-escape-suggest-raw-string.rs | 7 +++++++ .../ui/parser/bad-escape-suggest-raw-string.stderr | 14 ++++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 src/test/ui/parser/bad-escape-suggest-raw-string.rs create mode 100644 src/test/ui/parser/bad-escape-suggest-raw-string.stderr diff --git a/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs b/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs index 7f68112a427ba..a41956c58f005 100644 --- a/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs +++ b/compiler/rustc_parse/src/lexer/unescape_error_reporting.rs @@ -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 \ ", diff --git a/src/test/ui/lexer/lex-bad-char-literals-1.stderr b/src/test/ui/lexer/lex-bad-char-literals-1.stderr index ed129a1d13388..e6ff1f662bde9 100644 --- a/src/test/ui/lexer/lex-bad-char-literals-1.stderr +++ b/src/test/ui/lexer/lex-bad-char-literals-1.stderr @@ -17,6 +17,10 @@ LL | '\●' | ^ unknown character escape | = help: for more information, visit +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 +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 diff --git a/src/test/ui/parser/bad-escape-suggest-raw-string.rs b/src/test/ui/parser/bad-escape-suggest-raw-string.rs new file mode 100644 index 0000000000000..978b92cbcd211 --- /dev/null +++ b/src/test/ui/parser/bad-escape-suggest-raw-string.rs @@ -0,0 +1,7 @@ +fn main() { + let ok = r"ab\[c"; + let bad = "ab\[c"; + //~^ ERROR unknown character escape: `[` + //~| HELP for more information, visit + //~| HELP if you meant to write a literal backslash (perhaps escaping in a regular expression), consider a raw string literal +} diff --git a/src/test/ui/parser/bad-escape-suggest-raw-string.stderr b/src/test/ui/parser/bad-escape-suggest-raw-string.stderr new file mode 100644 index 0000000000000..fc34bd3281af5 --- /dev/null +++ b/src/test/ui/parser/bad-escape-suggest-raw-string.stderr @@ -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 +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 +