about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDániel Buga <bugadani@gmail.com>2020-10-02 11:54:31 +0200
committerDániel Buga <bugadani@gmail.com>2020-10-02 11:56:21 +0200
commit515ca9312393bd00af0e867fceee9aff9b6e565d (patch)
treee0e0d862d2185cd005c41ee61cc0d5b7612fd787
parentf0eac45db4c065cd45fde8413623b9fc338fee4b (diff)
downloadrust-515ca9312393bd00af0e867fceee9aff9b6e565d.tar.gz
rust-515ca9312393bd00af0e867fceee9aff9b6e565d.zip
Look for soft hyphens as well
-rw-r--r--clippy_lints/src/unicode.rs14
-rw-r--r--tests/ui/unicode.rs2
-rw-r--r--tests/ui/unicode.stderr14
3 files changed, 19 insertions, 11 deletions
diff --git a/clippy_lints/src/unicode.rs b/clippy_lints/src/unicode.rs
index d8c57f0e7ae..d3fe60042a8 100644
--- a/clippy_lints/src/unicode.rs
+++ b/clippy_lints/src/unicode.rs
@@ -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,
         );
     }
diff --git a/tests/ui/unicode.rs b/tests/ui/unicode.rs
index 27db9594f3b..f3fd1c57da6 100644
--- a/tests/ui/unicode.rs
+++ b/tests/ui/unicode.rs
@@ -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)]
diff --git a/tests/ui/unicode.stderr b/tests/ui/unicode.stderr
index 4575a132e5b..b0445b070fd 100644
--- a/tests/ui/unicode.stderr
+++ b/tests/ui/unicode.stderr
@@ -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