diff --git a/crates/ruff_linter/resources/test/fixtures/refurb/FURB105.py b/crates/ruff_linter/resources/test/fixtures/refurb/FURB105.py index 47ee2f54c7ac0..ab76d399cec94 100644 --- a/crates/ruff_linter/resources/test/fixtures/refurb/FURB105.py +++ b/crates/ruff_linter/resources/test/fixtures/refurb/FURB105.py @@ -16,6 +16,7 @@ print("foo", "", "bar", sep="") print("", *args) print("", *args, sep="") +print("", **kwargs) # OK. @@ -29,4 +30,3 @@ print("foo", "", sep=",") print("foo", "", "bar", "", sep=",") print("", "", **kwargs) -print("", **kwargs) diff --git a/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs b/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs index c279ad5bd4f21..81e4b8536faf5 100644 --- a/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs +++ b/crates/ruff_linter/src/rules/refurb/rules/print_empty_string.rs @@ -57,27 +57,22 @@ impl Violation for PrintEmptyString { /// FURB105 pub(crate) fn print_empty_string(checker: &mut Checker, call: &ast::ExprCall) { - // Avoid flagging, e.g., `print("", "", **kwargs)`. - if call - .arguments - .keywords - .iter() - .any(|keyword| keyword.arg.is_none()) - { - return; - } - if checker .semantic() .resolve_call_path(&call.func) .as_ref() .is_some_and(|call_path| matches!(call_path.as_slice(), ["", "print"])) { - // Ex) `print("", sep="")` + // Ex) `print("", sep="")` or `print("", "", **kwargs)` let empty_separator = call .arguments .find_keyword("sep") - .map_or(false, |keyword| is_empty_string(&keyword.value)); + .map_or(false, |keyword| is_empty_string(&keyword.value)) + && !call + .arguments + .keywords + .iter() + .any(|keyword| keyword.arg.is_none()); // Avoid flagging, e.g., `print("", "", sep="sep")` if !empty_separator && call.arguments.args.len() != 1 { diff --git a/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB105_FURB105.py.snap b/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB105_FURB105.py.snap index 1cde05cf9133a..366e6fab74ab3 100644 --- a/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB105_FURB105.py.snap +++ b/crates/ruff_linter/src/rules/refurb/snapshots/ruff_linter__rules__refurb__tests__FURB105_FURB105.py.snap @@ -291,7 +291,7 @@ FURB105.py:16:1: FURB105 [*] Unnecessary empty string passed to `print` 16 |+print("foo", "bar", sep="") 17 17 | print("", *args) 18 18 | print("", *args, sep="") -19 19 | +19 19 | print("", **kwargs) FURB105.py:18:1: FURB105 [*] Unnecessary empty string passed to `print` | @@ -299,8 +299,7 @@ FURB105.py:18:1: FURB105 [*] Unnecessary empty string passed to `print` 17 | print("", *args) 18 | print("", *args, sep="") | ^^^^^^^^^^^^^^^^^^^^^^^^ FURB105 -19 | -20 | # OK. +19 | print("", **kwargs) | = help: Remove empty string @@ -310,8 +309,29 @@ FURB105.py:18:1: FURB105 [*] Unnecessary empty string passed to `print` 17 17 | print("", *args) 18 |-print("", *args, sep="") 18 |+print(*args, sep="") -19 19 | -20 20 | # OK. -21 21 | +19 19 | print("", **kwargs) +20 20 | +21 21 | # OK. + +FURB105.py:19:1: FURB105 [*] Unnecessary empty string passed to `print` + | +17 | print("", *args) +18 | print("", *args, sep="") +19 | print("", **kwargs) + | ^^^^^^^^^^^^^^^^^^^ FURB105 +20 | +21 | # OK. + | + = help: Remove empty string + +ℹ Suggested fix +16 16 | print("foo", "", "bar", sep="") +17 17 | print("", *args) +18 18 | print("", *args, sep="") +19 |-print("", **kwargs) + 19 |+print(**kwargs) +20 20 | +21 21 | # OK. +22 22 |