]> git.lizzy.rs Git - rust.git/commitdiff
Look for soft hyphens as well
authorDániel Buga <bugadani@gmail.com>
Fri, 2 Oct 2020 09:54:31 +0000 (11:54 +0200)
committerDániel Buga <bugadani@gmail.com>
Fri, 2 Oct 2020 09:56:21 +0000 (11:56 +0200)
clippy_lints/src/unicode.rs
tests/ui/unicode.rs
tests/ui/unicode.stderr

index d8c57f0e7ae7fd643ae07868c774aa1aecdbff80..d3fe60042a87cf908b574876b8510cd4351df8ab 100644 (file)
@@ -8,18 +8,18 @@
 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,
         );
     }
index 27db9594f3b3305c7385ccea3506a22f534740f1..f3fd1c57da6324549588c59e55fc1175bf92ede8 100644 (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)]
index 4575a132e5b2c8de599253e5e944993133443138..b0445b070fdd3e1bffbf73fdf5cf5b0d0ebce6c5 100644 (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