[refurb] Detect empty f-strings (FURB105)
#21348
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes FURB105 (
print-empty-string) to detect empty f-strings in addition to regular empty strings. Previously, the rule only flaggedprint("")but missedprint(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. Theis_empty_stringhelper function was only checking forExpr::StringLiteralwith empty values, but did not handleExpr::FString(f-strings). As a result,print(f"")was not being flagged as a violation, even though it's semantically equivalent toprint("")and should be simplified toprint().The issue occurred because the function used a
matches!macro that only checked for string literals:Approach
Import the helper function: Added
is_empty_f_stringto the imports fromruff_python_ast::helpers, which already provides logic to detect empty f-strings.Update
is_empty_stringfunction: Changed the implementation from amatches!macro to amatchexpression that handles both string literals and f-strings:The fix leverages the existing
is_empty_f_stringhelper 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.