From dbe2699321ad0173a3e0c136baf0a9c818b8206e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Sun, 21 Jun 2026 14:22:57 +0200 Subject: [PATCH] fix: relax length comparison lint to skip non-empty checks --- .../lints/ast_walk/checks/manual_is_empty.rs | 14 +++----- tests/ui/lint/mod.rs | 32 ++++++++++++++++--- .../manual_is_empty_greater_than_zero.snap | 12 ------- .../manual_is_empty_not_equals_zero.snap | 12 ------- 4 files changed, 32 insertions(+), 38 deletions(-) delete mode 100644 tests/ui/lint/snapshots/manual_is_empty_greater_than_zero.snap delete mode 100644 tests/ui/lint/snapshots/manual_is_empty_not_equals_zero.snap diff --git a/crates/passes/src/passes/lints/ast_walk/checks/manual_is_empty.rs b/crates/passes/src/passes/lints/ast_walk/checks/manual_is_empty.rs index 32c40ef84..f86af9b07 100644 --- a/crates/passes/src/passes/lints/ast_walk/checks/manual_is_empty.rs +++ b/crates/passes/src/passes/lints/ast_walk/checks/manual_is_empty.rs @@ -39,21 +39,15 @@ pub fn check_manual_is_empty(expression: &Expression, ctx: &NodeCtx) { return; } - let negate = match operator { - Equal | LessThanOrEqual => false, - NotEqual | GreaterThan => true, - _ => return, - }; + if !matches!(operator, Equal | LessThanOrEqual) { + return; + } let Some(receiver_text) = receiver.as_dotted_path() else { return; }; - let replacement = if negate { - format!("!{receiver_text}.is_empty()") - } else { - format!("{receiver_text}.is_empty()") - }; + let replacement = format!("{receiver_text}.is_empty()"); ctx.sink .push(diagnostics::lint::manual_is_empty(span, &replacement)); diff --git a/tests/ui/lint/mod.rs b/tests/ui/lint/mod.rs index 0e3c5a227..710eb0a22 100644 --- a/tests/ui/lint/mod.rs +++ b/tests/ui/lint/mod.rs @@ -844,8 +844,8 @@ fn main() { } #[test] -fn manual_is_empty_not_equals_zero() { - assert_lint_snapshot!( +fn manual_is_empty_not_equals_zero_no_warning() { + assert_no_lint_warnings!( r#" fn main() { let xs = [1, 2, 3] @@ -856,8 +856,8 @@ fn main() { } #[test] -fn manual_is_empty_greater_than_zero() { - assert_lint_snapshot!( +fn manual_is_empty_greater_than_zero_no_warning() { + assert_no_lint_warnings!( r#" fn main() { let xs = [1, 2, 3] @@ -931,6 +931,30 @@ fn main() { ); } +#[test] +fn manual_is_empty_zero_less_than_no_warning() { + assert_no_lint_warnings!( + r#" +fn main() { + let xs = [1, 2, 3] + let _ = 0 < xs.length() +} +"# + ); +} + +#[test] +fn manual_is_empty_zero_not_equals_no_warning() { + assert_no_lint_warnings!( + r#" +fn main() { + let xs = [1, 2, 3] + let _ = 0 != xs.length() +} +"# + ); +} + #[test] fn manual_is_empty_compare_one_no_warning() { assert_no_lint_warnings!( diff --git a/tests/ui/lint/snapshots/manual_is_empty_greater_than_zero.snap b/tests/ui/lint/snapshots/manual_is_empty_greater_than_zero.snap deleted file mode 100644 index b54aeef1b..000000000 --- a/tests/ui/lint/snapshots/manual_is_empty_greater_than_zero.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/ui/lint/mod.rs ---- - [info] Length comparison can use `is_empty()` - ╭─[test.lis:4:11] - 3 │ let xs = [1, 2, 3] - 4 │ let _ = xs.length() > 0 - · ───────┬─────── - · ╰── can be simpler - 5 │ } - ╰──── - help: Simplify to `!xs.is_empty()` · code: [lint.manual_is_empty] diff --git a/tests/ui/lint/snapshots/manual_is_empty_not_equals_zero.snap b/tests/ui/lint/snapshots/manual_is_empty_not_equals_zero.snap deleted file mode 100644 index 2fdf2766f..000000000 --- a/tests/ui/lint/snapshots/manual_is_empty_not_equals_zero.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/ui/lint/mod.rs ---- - [info] Length comparison can use `is_empty()` - ╭─[test.lis:4:11] - 3 │ let xs = [1, 2, 3] - 4 │ let _ = xs.length() != 0 - · ────────┬─────── - · ╰── can be simpler - 5 │ } - ╰──── - help: Simplify to `!xs.is_empty()` · code: [lint.manual_is_empty]