From 9ddbc95937fe4f4b01db3bb5aef129a63d5dad53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Tue, 6 Feb 2024 23:09:37 +0100 Subject: [PATCH] Add a fix for ``DictIterMissingItems`` --- .../pylint/rules/dict_iter_missing_items.rs | 17 ++++++++---- ...s__PLE1141_dict_iter_missing_items.py.snap | 26 +++++++++++++++++-- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs b/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs index 35e3fada8fe587..7a80703dd89290 100644 --- a/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs +++ b/crates/ruff_linter/src/rules/pylint/rules/dict_iter_missing_items.rs @@ -1,6 +1,6 @@ use ruff_python_ast::{Expr, ExprTuple}; -use ruff_diagnostics::{Diagnostic, Violation}; +use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; use ruff_python_semantic::analyze::typing::is_dict; use ruff_text_size::Ranged; @@ -30,11 +30,15 @@ use crate::checkers::ast::Checker; #[violation] pub struct DictIterMissingItems; -impl Violation for DictIterMissingItems { +impl AlwaysFixableViolation for DictIterMissingItems { #[derive_message_formats] fn message(&self) -> String { format!("Call `items()` when unpacking a dictionary for iteration") } + + fn fix_title(&self) -> String { + format!("Add a call to `.items()`") + } } pub(crate) fn dict_iter_missing_items(checker: &mut Checker, target: &Expr, iter: &Expr) { @@ -61,7 +65,10 @@ pub(crate) fn dict_iter_missing_items(checker: &mut Checker, target: &Expr, iter return; } - checker - .diagnostics - .push(Diagnostic::new(DictIterMissingItems, iter.range())); + let mut diagnostic = Diagnostic::new(DictIterMissingItems, iter.range()); + diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement( + format!("{}.items()", name.id.to_string()), + iter.range(), + ))); + checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE1141_dict_iter_missing_items.py.snap b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE1141_dict_iter_missing_items.py.snap index c2990755322eb8..f2bd51eda5fbab 100644 --- a/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE1141_dict_iter_missing_items.py.snap +++ b/crates/ruff_linter/src/rules/pylint/snapshots/ruff_linter__rules__pylint__tests__PLE1141_dict_iter_missing_items.py.snap @@ -1,20 +1,42 @@ --- source: crates/ruff_linter/src/rules/pylint/mod.rs --- -dict_iter_missing_items.py:8:13: PLE1141 Call `items()` when unpacking a dictionary for iteration +dict_iter_missing_items.py:8:13: PLE1141 [*] Call `items()` when unpacking a dictionary for iteration | 7 | # Errors 8 | for k, v in d: | ^ PLE1141 9 | pass | + = help: Add a call to `.items()` -dict_iter_missing_items.py:12:13: PLE1141 Call `items()` when unpacking a dictionary for iteration +ℹ Safe fix +5 5 | s2 = {1, 2, 3} +6 6 | +7 7 | # Errors +8 |-for k, v in d: + 8 |+for k, v in d.items(): +9 9 | pass +10 10 | +11 11 | # False positive, since the keys are all tuples this is valid + +dict_iter_missing_items.py:12:13: PLE1141 [*] Call `items()` when unpacking a dictionary for iteration | 11 | # False positive, since the keys are all tuples this is valid 12 | for a, b in d_tuple: | ^^^^^^^ PLE1141 13 | pass | + = help: Add a call to `.items()` + +ℹ Safe fix +9 9 | pass +10 10 | +11 11 | # False positive, since the keys are all tuples this is valid +12 |-for a, b in d_tuple: + 12 |+for a, b in d_tuple.items(): +13 13 | pass +14 14 | +15 15 | # Non errors