diff --git a/crates/ruff_linter/resources/test/fixtures/ruff/RUF059_0.py b/crates/ruff_linter/resources/test/fixtures/ruff/RUF059_0.py index 558060bc0f..a9f4df2e96 100644 --- a/crates/ruff_linter/resources/test/fixtures/ruff/RUF059_0.py +++ b/crates/ruff_linter/resources/test/fixtures/ruff/RUF059_0.py @@ -94,3 +94,9 @@ def f(): (exponential := (exponential * base_multiplier) % 3): i + 1 for i in range(2) } return hash_map + + +# see: https://github.com/astral-sh/ruff/issues/18507 +def f(_x): + x, = "1" + print(_x) diff --git a/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs b/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs index 2e78152b63..65cb79563c 100644 --- a/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs +++ b/crates/ruff_linter/src/rules/ruff/rules/unused_unpacked_variable.rs @@ -3,6 +3,7 @@ use ruff_python_semantic::Binding; use ruff_text_size::Ranged; use crate::checkers::ast::Checker; +use crate::renamer::ShadowedKind; use crate::{Edit, Fix, FixAvailability, Violation}; /// ## What it does @@ -63,6 +64,11 @@ fn remove_unused_variable(binding: &Binding, checker: &Checker) -> Option { let name = binding.name(checker.source()); let renamed = format!("_{name}"); + + if ShadowedKind::new(binding, &renamed, checker).shadows_any() { + return None; + } + if checker.settings.dummy_variable_rgx.is_match(&renamed) { let edit = Edit::range_replacement(renamed, binding.range()); diff --git a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF059_RUF059_0.py.snap b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF059_RUF059_0.py.snap index 03d9674ce0..0f7d1505c3 100644 --- a/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF059_RUF059_0.py.snap +++ b/crates/ruff_linter/src/rules/ruff/snapshots/ruff_linter__rules__ruff__tests__RUF059_RUF059_0.py.snap @@ -197,4 +197,14 @@ RUF059_0.py:86:29: RUF059 [*] Unpacked variable `that` is never used 86 |+ open("") as ((this, _that)), 87 87 | ): 88 88 | print("hello") -89 89 | +89 89 | + +RUF059_0.py:101:5: RUF059 Unpacked variable `x` is never used + | + 99 | # see: https://github.com/astral-sh/ruff/issues/18507 +100 | def f(_x): +101 | x, = "1" + | ^ RUF059 +102 | print(_x) + | + = help: Prefix it with an underscore or any other dummy variable pattern