Look for soft hyphens as well

This commit is contained in:
Dániel Buga 2020-10-02 11:54:31 +02:00
parent f0eac45db4
commit 515ca93123
3 changed files with 19 additions and 11 deletions

View File

@ -8,18 +8,18 @@ use rustc_span::source_map::Span;
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
/// some­where 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! {
@ -91,14 +91,14 @@ fn escape<T: Iterator<Item = char>>(s: T) -> String {
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,
);
}

View File

@ -2,6 +2,8 @@
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)]

View File

@ -1,4 +1,4 @@
error: zero-width space detected
error: invisible character detected: '/u{200b}'
--> $DIR/unicode.rs:3:12
|
LL | print!("Here >< is a ZWS, and another");
@ -6,8 +6,14 @@ 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?"`
@ -15,12 +21,12 @@ LL | print!("̀à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