Skip to content

Commit

Permalink
Auto merge of rust-lang#8077 - nixxquality:single_char_pattern-false-…
Browse files Browse the repository at this point in the history
…negatives, r=camsteffen

Fix some false negatives for [`single_char_pattern`]

*Please write a short comment explaining your change (or "none" for internal only changes)*

changelog: Fix some false negatives for [`single_char_pattern`]

I noticed that clippy wasn't complaining about my usage of `split_once("x")` in a personal project so I updated the list of functions.

I had to update the test case for an unrelated issue because replace is now included in the list of functions to be linted.
  • Loading branch information
bors committed Dec 6, 2021
2 parents 476d609 + 01e302b commit a5d5976
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 43 deletions.
2 changes: 1 addition & 1 deletion clippy_lints/src/map_unit_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ fn unit_closure<'tcx>(
/// Anything else will return `a`.
fn let_binding_name(cx: &LateContext<'_>, var_arg: &hir::Expr<'_>) -> String {
match &var_arg.kind {
hir::ExprKind::Field(_, _) => snippet(cx, var_arg.span, "_").replace(".", "_"),
hir::ExprKind::Field(_, _) => snippet(cx, var_arg.span, "_").replace('.', "_"),
hir::ExprKind::Path(_) => format!("_{}", snippet(cx, var_arg.span, "")),
_ => "a".to_string(),
}
Expand Down
7 changes: 6 additions & 1 deletion clippy_lints/src/methods/single_char_pattern.rs
Original file line number Diff line number Diff line change
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
2 changes: 1 addition & 1 deletion clippy_lints/src/nonstandard_macro_braces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ fn is_offending_macro<'a>(cx: &EarlyContext<'_>, span: Span, mac_braces: &'a Mac
if snip.starts_with(&format!("{}!", name));
if unnested_or_local();
// make formatting consistent
let c = snip.replace(" ", "");
let c = snip.replace(' ', "");
if !c.starts_with(&format!("{}!{}", name, braces.0));
if !mac_braces.done.contains(&span.ctxt().outer_expn_data().call_site);
then {
Expand Down
2 changes: 1 addition & 1 deletion clippy_lints/src/self_named_constructors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ impl<'tcx> LateLintPass<'tcx> for SelfNamedConstructors {
let self_id = cx.tcx.hir().local_def_id_to_hir_id(self_local_did);
if let Some(Node::Item(x)) = cx.tcx.hir().find(self_id);
let type_name = x.ident.name.as_str().to_lowercase();
if impl_item.ident.name.as_str() == type_name || impl_item.ident.name.as_str().replace("_", "") == type_name;
if impl_item.ident.name.as_str() == type_name || impl_item.ident.name.as_str().replace('_', "") == type_name;

then {
span_lint(
Expand Down
6 changes: 3 additions & 3 deletions clippy_lints/src/unicode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ fn check_str(cx: &LateContext<'_>, span: Span, id: HirId) {
"invisible character detected",
"consider replacing the string with",
string
.replace("\u{200B}", "\\u{200B}")
.replace("\u{ad}", "\\u{AD}")
.replace("\u{2060}", "\\u{2060}"),
.replace('\u{200B}', "\\u{200B}")
.replace('\u{ad}', "\\u{AD}")
.replace('\u{2060}', "\\u{2060}"),
Applicability::MachineApplicable,
);
}
Expand Down
4 changes: 2 additions & 2 deletions clippy_lints/src/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -583,10 +583,10 @@ impl Write {
let replacement: String = match lit.token.kind {
LitKind::Integer | LitKind::Float | LitKind::Err => continue,
LitKind::StrRaw(_) | LitKind::ByteStrRaw(_) if matches!(fmtstr.style, StrStyle::Raw(_)) => {
lit.token.symbol.as_str().replace("{", "{{").replace("}", "}}")
lit.token.symbol.as_str().replace('{', "{{").replace('}', "}}")
},
LitKind::Str | LitKind::ByteStr if matches!(fmtstr.style, StrStyle::Cooked) => {
lit.token.symbol.as_str().replace("{", "{{").replace("}", "}}")
lit.token.symbol.as_str().replace('{', "{{").replace('}', "}}")
},
LitKind::StrRaw(_) | LitKind::Str | LitKind::ByteStrRaw(_) | LitKind::ByteStr => continue,
LitKind::Byte | LitKind::Char => match &*lit.token.symbol.as_str() {
Expand Down
7 changes: 6 additions & 1 deletion tests/ui/single_char_pattern.fixed
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Loading

0 comments on commit a5d5976

Please sign in to comment.