From caf885c20af4cca25489f7559c20f2e56ee0c3a8 Mon Sep 17 00:00:00 2001 From: Dylan Date: Mon, 9 Jun 2025 15:38:39 -0500 Subject: [PATCH] [`ruff`] Preserve parentheses around `deque` in fix for `unnecessary-empty-iterable-within-deque-call` (`RUF037`) (#18598) Closes #18552 --- .../resources/test/fixtures/ruff/RUF037.py | 3 +++ .../unnecessary_literal_within_deque_call.rs | 11 ++++++++++- ...er__rules__ruff__tests__RUF037_RUF037.py.snap | 16 +++++++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/crates/ruff_linter/resources/test/fixtures/ruff/RUF037.py b/crates/ruff_linter/resources/test/fixtures/ruff/RUF037.py index 949f30691f..2893daecc6 100644 --- a/crates/ruff_linter/resources/test/fixtures/ruff/RUF037.py +++ b/crates/ruff_linter/resources/test/fixtures/ruff/RUF037.py @@ -56,3 +56,6 @@ def f(): def f(): queue = deque() # Ok + +def f(): + x = 0 or(deque)([]) diff --git a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs index 8ed8719a40..7050f43b9f 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unnecessary_literal_within_deque_call.rs @@ -1,4 +1,5 @@ use ruff_macros::{ViolationMetadata, derive_message_formats}; +use ruff_python_ast::parenthesize::parenthesized_range; use ruff_python_ast::{self as ast, Expr}; use ruff_text_size::Ranged; @@ -107,7 +108,15 @@ fn fix_unnecessary_literal_in_deque( deque: &ast::ExprCall, maxlen: Option<&Expr>, ) -> Fix { - let deque_name = checker.locator().slice(deque.func.range()); + let deque_name = checker.locator().slice( + parenthesized_range( + deque.func.as_ref().into(), + deque.into(), + checker.comment_ranges(), + checker.source(), + ) + .unwrap_or(deque.func.range()), + ); let deque_str = match maxlen { Some(maxlen) => { let len_str = checker.locator().slice(maxlen); diff --git a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF037_RUF037.py.snap b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF037_RUF037.py.snap index 288b5bded4..09d6f86171 100644 --- a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF037_RUF037.py.snap +++ b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF037_RUF037.py.snap @@ -1,6 +1,5 @@ --- source: crates/ruff_linter/src/rules/ruff/mod.rs -snapshot_kind: text --- RUF037.py:6:13: RUF037 [*] Unnecessary empty iterable within a deque call | @@ -127,3 +126,18 @@ RUF037.py:30:13: RUF037 [*] Unnecessary empty iterable within a deque call 31 31 | 32 32 | 33 33 | def f(): + +RUF037.py:61:13: RUF037 [*] Unnecessary empty iterable within a deque call + | +60 | def f(): +61 | x = 0 or(deque)([]) + | ^^^^^^^^^^^ RUF037 + | + = help: Replace with `deque()` + +ℹ Safe fix +58 58 | queue = deque() # Ok +59 59 | +60 60 | def f(): +61 |- x = 0 or(deque)([]) + 61 |+ x = 0 or(deque)()