Skip to content

Commit

Permalink
fix some false negatives for single_char_pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
nixxquality committed Dec 5, 2021
1 parent 907f6d9 commit e3c6044
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 35 deletions.
7 changes: 6 additions & 1 deletion clippy_lints/src/methods/single_char_pattern.rs
Expand Up @@ -9,18 +9,21 @@ use rustc_span::symbol::Symbol;

use super::SINGLE_CHAR_PATTERN;

const PATTERN_METHODS: [(&str, usize); 19] = [
const PATTERN_METHODS: [(&str, usize); 24] = [
("contains", 1),
("starts_with", 1),
("ends_with", 1),
("find", 1),
("rfind", 1),
("split", 1),
("split_inclusive", 1),
("rsplit", 1),
("split_terminator", 1),
("rsplit_terminator", 1),
("splitn", 2),
("rsplitn", 2),
("split_once", 1),
("rsplit_once", 1),
("matches", 1),
("rmatches", 1),
("match_indices", 1),
Expand All @@ -29,6 +32,8 @@ const PATTERN_METHODS: [(&str, usize); 19] = [
("strip_suffix", 1),
("trim_start_matches", 1),
("trim_end_matches", 1),
("replace", 1),
("replacen", 1),
];

/// lint for length-1 `str`s for methods in `PATTERN_METHODS`
Expand Down
7 changes: 6 additions & 1 deletion tests/ui/single_char_pattern.fixed
Expand Up @@ -17,6 +17,7 @@ fn main() {
x.split('💣');
// Can't use this lint for unicode code points which don't fit in a char
x.split("❤️");
x.split_inclusive('x');
x.contains('x');
x.starts_with('x');
x.ends_with('x');
Expand All @@ -27,6 +28,8 @@ fn main() {
x.rsplit_terminator('x');
x.splitn(2, 'x');
x.rsplitn(2, 'x');
x.split_once('x');
x.rsplit_once('x');
x.matches('x');
x.rmatches('x');
x.match_indices('x');
Expand All @@ -35,6 +38,8 @@ fn main() {
x.trim_end_matches('x');
x.strip_prefix('x');
x.strip_suffix('x');
x.replace('x', "y");
x.replacen('x', "y", 3);
// Make sure we escape characters correctly.
x.split('\n');
x.split('\'');
Expand All @@ -43,7 +48,7 @@ fn main() {
let h = HashSet::<String>::new();
h.contains("X"); // should not warn

x.replace(";", ",").split(','); // issue #2978
x.replace(';', ",").split(','); // issue #2978
x.starts_with('\x03'); // issue #2996

// Issue #3204
Expand Down
7 changes: 6 additions & 1 deletion tests/ui/single_char_pattern.rs
Expand Up @@ -17,6 +17,7 @@ fn main() {
x.split("💣");
// Can't use this lint for unicode code points which don't fit in a char
x.split("❤️");
x.split_inclusive("x");
x.contains("x");
x.starts_with("x");
x.ends_with("x");
Expand All @@ -27,6 +28,8 @@ fn main() {
x.rsplit_terminator("x");
x.splitn(2, "x");
x.rsplitn(2, "x");
x.split_once("x");
x.rsplit_once("x");
x.matches("x");
x.rmatches("x");
x.match_indices("x");
Expand All @@ -35,6 +38,8 @@ fn main() {
x.trim_end_matches("x");
x.strip_prefix("x");
x.strip_suffix("x");
x.replace("x", "y");
x.replacen("x", "y", 3);
// Make sure we escape characters correctly.
x.split("\n");
x.split("'");
Expand All @@ -43,7 +48,7 @@ fn main() {
let h = HashSet::<String>::new();
h.contains("X"); // should not warn

x.replace(";", ",").split(","); // issue #2978
x.replace(';', ",").split(","); // issue #2978
x.starts_with("\x03"); // issue #2996

// Issue #3204
Expand Down
94 changes: 62 additions & 32 deletions tests/ui/single_char_pattern.stderr
Expand Up @@ -25,184 +25,214 @@ LL | x.split("💣");
| ^^^^ help: try using a `char` instead: `'💣'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:20:16
--> $DIR/single_char_pattern.rs:20:23
|
LL | x.split_inclusive("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:21:16
|
LL | x.contains("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:21:19
--> $DIR/single_char_pattern.rs:22:19
|
LL | x.starts_with("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:22:17
--> $DIR/single_char_pattern.rs:23:17
|
LL | x.ends_with("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:23:12
--> $DIR/single_char_pattern.rs:24:12
|
LL | x.find("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:24:13
--> $DIR/single_char_pattern.rs:25:13
|
LL | x.rfind("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:25:14
--> $DIR/single_char_pattern.rs:26:14
|
LL | x.rsplit("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:26:24
--> $DIR/single_char_pattern.rs:27:24
|
LL | x.split_terminator("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:27:25
--> $DIR/single_char_pattern.rs:28:25
|
LL | x.rsplit_terminator("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:28:17
--> $DIR/single_char_pattern.rs:29:17
|
LL | x.splitn(2, "x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:29:18
--> $DIR/single_char_pattern.rs:30:18
|
LL | x.rsplitn(2, "x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:30:15
--> $DIR/single_char_pattern.rs:31:18
|
LL | x.split_once("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:32:19
|
LL | x.rsplit_once("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:33:15
|
LL | x.matches("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:31:16
--> $DIR/single_char_pattern.rs:34:16
|
LL | x.rmatches("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:32:21
--> $DIR/single_char_pattern.rs:35:21
|
LL | x.match_indices("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:33:22
--> $DIR/single_char_pattern.rs:36:22
|
LL | x.rmatch_indices("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:34:26
--> $DIR/single_char_pattern.rs:37:26
|
LL | x.trim_start_matches("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:35:24
--> $DIR/single_char_pattern.rs:38:24
|
LL | x.trim_end_matches("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:36:20
--> $DIR/single_char_pattern.rs:39:20
|
LL | x.strip_prefix("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:37:20
--> $DIR/single_char_pattern.rs:40:20
|
LL | x.strip_suffix("x");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:39:13
--> $DIR/single_char_pattern.rs:41:15
|
LL | x.replace("x", "y");
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:42:16
|
LL | x.replacen("x", "y", 3);
| ^^^ help: try using a `char` instead: `'x'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:44:13
|
LL | x.split("/n");
| ^^^^ help: try using a `char` instead: `'/n'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:40:13
--> $DIR/single_char_pattern.rs:45:13
|
LL | x.split("'");
| ^^^ help: try using a `char` instead: `'/''`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:41:13
--> $DIR/single_char_pattern.rs:46:13
|
LL | x.split("/'");
| ^^^^ help: try using a `char` instead: `'/''`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:46:31
--> $DIR/single_char_pattern.rs:51:31
|
LL | x.replace(";", ",").split(","); // issue #2978
LL | x.replace(';', ",").split(","); // issue #2978
| ^^^ help: try using a `char` instead: `','`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:47:19
--> $DIR/single_char_pattern.rs:52:19
|
LL | x.starts_with("/x03"); // issue #2996
| ^^^^^^ help: try using a `char` instead: `'/x03'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:54:13
--> $DIR/single_char_pattern.rs:59:13
|
LL | x.split(r"a");
| ^^^^ help: try using a `char` instead: `'a'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:55:13
--> $DIR/single_char_pattern.rs:60:13
|
LL | x.split(r#"a"#);
| ^^^^^^ help: try using a `char` instead: `'a'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:56:13
--> $DIR/single_char_pattern.rs:61:13
|
LL | x.split(r###"a"###);
| ^^^^^^^^^^ help: try using a `char` instead: `'a'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:57:13
--> $DIR/single_char_pattern.rs:62:13
|
LL | x.split(r###"'"###);
| ^^^^^^^^^^ help: try using a `char` instead: `'/''`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:58:13
--> $DIR/single_char_pattern.rs:63:13
|
LL | x.split(r###"#"###);
| ^^^^^^^^^^ help: try using a `char` instead: `'#'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:60:13
--> $DIR/single_char_pattern.rs:65:13
|
LL | x.split(r#"/"#);
| ^^^^^^ help: try using a `char` instead: `'/'`

error: single-character string constant used as pattern
--> $DIR/single_char_pattern.rs:61:13
--> $DIR/single_char_pattern.rs:66:13
|
LL | x.split(r"/");
| ^^^^ help: try using a `char` instead: `'/'`

error: aborting due to 34 previous errors
error: aborting due to 39 previous errors

0 comments on commit e3c6044

Please sign in to comment.