ruff
e4dc406a - [`refurb`] Detect empty f-strings (`FURB105`) (#21348)

Commit
110 days ago
[`refurb`] Detect empty f-strings (`FURB105`) (#21348) ## Summary Fixes FURB105 (`print-empty-string`) to detect empty f-strings in addition to regular empty strings. Previously, the rule only flagged `print("")` but missed `print(f"")`. This fix ensures both cases are detected and can be automatically fixed. Fixes #21346 ## Problem Analysis The FURB105 rule checks for unnecessary empty strings passed to `print()` calls. The `is_empty_string` helper function was only checking for `Expr::StringLiteral` with empty values, but did not handle `Expr::FString` (f-strings). As a result, `print(f"")` was not being flagged as a violation, even though it's semantically equivalent to `print("")` and should be simplified to `print()`. The issue occurred because the function used a `matches!` macro that only checked for string literals: ```rust fn is_empty_string(expr: &Expr) -> bool { matches!( expr, Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) if value.is_empty() ) } ``` ## Approach 1. **Import the helper function**: Added `is_empty_f_string` to the imports from `ruff_python_ast::helpers`, which already provides logic to detect empty f-strings. 2. **Update `is_empty_string` function**: Changed the implementation from a `matches!` macro to a `match` expression that handles both string literals and f-strings: ```rust fn is_empty_string(expr: &Expr) -> bool { match expr { Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => value.is_empty(), Expr::FString(f_string) => is_empty_f_string(f_string), _ => false, } } ``` The fix leverages the existing `is_empty_f_string` helper function which properly handles the complexity of f-strings, including nested f-strings and interpolated expressions. This ensures the detection is accurate and consistent with how empty strings are detected elsewhere in the codebase.
Author
Parents
Loading