use unicode_normalization::UnicodeNormalization;
declare_clippy_lint! {
- /// **What it does:** Checks for the Unicode zero-width space in the code.
+ /// **What it does:** Checks for invisible Unicode characters in the code.
///
/// **Why is this bad?** Having an invisible character in the code makes for all
/// sorts of April fools, but otherwise is very much frowned upon.
///
/// **Known problems:** None.
///
- /// **Example:** You don't see it, but there may be a zero-width space
- /// somewhere in this text.
+ /// **Example:** You don't see it, but there may be a zero-width space or soft hyphen
+ /// somewhere in this text.
pub ZERO_WIDTH_SPACE,
correctness,
- "using a zero-width space in a string literal, which is confusing"
+ "using an invisible character in a string literal, which is confusing"
}
declare_clippy_lint! {
fn check_str(cx: &LateContext<'_>, span: Span, id: HirId) {
let string = snippet(cx, span, "");
- if string.contains('\u{200B}') {
+ if let Some(invisible) = string.chars().find(|c| ['\u{200B}', '\u{ad}'].contains(&c)) {
span_lint_and_sugg(
cx,
ZERO_WIDTH_SPACE,
span,
- "zero-width space detected",
+ &format!("invisible character detected: {:?}", invisible),
"consider replacing the string with",
- string.replace("\u{200B}", "\\u{200B}"),
+ string.replace("\u{200B}", "\\u{200B}").replace("\u{ad}", "\\u{AD}"),
Applicability::MachineApplicable,
);
}
fn zero() {
print!("Here >< is a ZWS, and another");
print!("This\u{200B}is\u{200B}fine");
+ print!("Here >< is a SHY, and another");
+ print!("This\u{ad}is\u{ad}fine");
}
#[warn(clippy::unicode_not_nfc)]
-error: zero-width space detected
+error: invisible character detected: '/u{200b}'
--> $DIR/unicode.rs:3:12
|
LL | print!("Here >< is a ZWS, and another");
|
= note: `-D clippy::zero-width-space` implied by `-D warnings`
+error: invisible character detected: '/u{ad}'
+ --> $DIR/unicode.rs:5:12
+ |
+LL | print!("Here >< is a SHY, and another");
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider replacing the string with: `"Here >/u{AD}< is a SHY, and /u{AD}another"`
+
error: non-NFC Unicode sequence detected
- --> $DIR/unicode.rs:9:12
+ --> $DIR/unicode.rs:11:12
|
LL | print!("̀àh?");
| ^^^^^ help: consider replacing the string with: `"̀àh?"`
= note: `-D clippy::unicode-not-nfc` implied by `-D warnings`
error: literal non-ASCII character detected
- --> $DIR/unicode.rs:15:12
+ --> $DIR/unicode.rs:17:12
|
LL | print!("Üben!");
| ^^^^^^^ help: consider replacing the string with: `"/u{dc}ben!"`
|
= note: `-D clippy::non-ascii-literal` implied by `-D warnings`
-error: aborting due to 3 previous errors
+error: aborting due to 4 previous errors