Print escaped string if char literal has multiple characters, but only one printable character
Fixes #90857
I'm not sure about the error message here, it could get rather long and *maybe* using the names of characters would be better? That wouldn't help the length any, though.
Applicability::MachineApplicable,
);
}
+ } else {
+ let printable: Vec<char> = lit
+ .chars()
+ .filter(|&x| {
+ unicode_width::UnicodeWidthChar::width(x).unwrap_or(0) != 0
+ && !x.is_whitespace()
+ })
+ .collect();
+
+ if let [ch] = printable.as_slice() {
+ has_help = true;
+
+ handler.span_note(
+ span,
+ &format!(
+ "there are non-printing characters, the full sequence is `{}`",
+ lit.escape_default(),
+ ),
+ );
+
+ handler.span_suggestion(
+ span,
+ "consider removing the non-printing characters",
+ ch.to_string(),
+ Applicability::MaybeIncorrect,
+ );
+ }
}
if !has_help {
--- /dev/null
+// This tests that the error generated when a character literal has multiple
+// characters in it contains a note about non-printing characters.
+
+fn main() {
+ let _hair_space_around = ' x';
+ //~^ ERROR: character literal may only contain one codepoint
+ //~| NOTE: there are non-printing characters, the full sequence is `\u{200a}x\u{200b}`
+ //~| HELP: consider removing the non-printing characters
+ //~| SUGGESTION: x
+}
--- /dev/null
+error: character literal may only contain one codepoint
+ --> $DIR/whitespace-character-literal.rs:5:30
+ |
+LL | let _hair_space_around = ' x';
+ | ^--^
+ | |
+ | help: consider removing the non-printing characters: `x`
+ |
+note: there are non-printing characters, the full sequence is `\u{200a}x\u{200b}`
+ --> $DIR/whitespace-character-literal.rs:5:31
+ |
+LL | let _hair_space_around = ' x';
+ | ^^
+
+error: aborting due to previous error
+
// FIXME: The following limits should be reduced eventually.
const ROOT_ENTRY_LIMIT: usize = 1102;
const ISSUES_ENTRY_LIMIT: usize = 2310;
-const PARSER_LIMIT: usize = 1004;
+const PARSER_LIMIT: usize = 1005;
fn check_entries(path: &Path, bad: &mut bool) {
let dirs = walkdir::WalkDir::new(&path.join("test/ui"))