diff --git a/crates/ruff/resources/test/fixtures/ruff/RUF017.py b/crates/ruff/resources/test/fixtures/ruff/RUF017.py index f7c062d894778..546d08be57b59 100644 --- a/crates/ruff/resources/test/fixtures/ruff/RUF017.py +++ b/crates/ruff/resources/test/fixtures/ruff/RUF017.py @@ -12,3 +12,10 @@ # OK sum([x, y]) sum([[1, 2, 3], [4, 5, 6]]) + + +# Regression test for: https://github.com/astral-sh/ruff/issues/7059 +def func(): + import functools, operator + + sum([x, y], []) diff --git a/crates/ruff/src/rules/ruff/rules/quadratic_list_summation.rs b/crates/ruff/src/rules/ruff/rules/quadratic_list_summation.rs index 62f51692fe7a5..1d85555132c8f 100644 --- a/crates/ruff/src/rules/ruff/rules/quadratic_list_summation.rs +++ b/crates/ruff/src/rules/ruff/rules/quadratic_list_summation.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use itertools::Itertools; use ruff_diagnostics::{AlwaysAutofixableViolation, Diagnostic, Edit, Fix}; use ruff_macros::{derive_message_formats, violation}; @@ -106,7 +107,7 @@ fn convert_to_reduce(iterable: &Expr, call: &ast::ExprCall, checker: &Checker) - format!("{reduce_binding}({iadd_binding}, {iterable}, [])"), call.range(), ), - [reduce_edit, iadd_edit], + [reduce_edit, iadd_edit].into_iter().dedup(), )) } diff --git a/crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__RUF017_RUF017.py.snap b/crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__RUF017_RUF017.py.snap index b05d32ea23020..4cda3a5c809a8 100644 --- a/crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__RUF017_RUF017.py.snap +++ b/crates/ruff/src/rules/ruff/snapshots/ruff__rules__ruff__tests__RUF017_RUF017.py.snap @@ -131,4 +131,20 @@ RUF017.py:9:1: RUF017 [*] Avoid quadratic list summation 12 13 | # OK 13 14 | sum([x, y]) +RUF017.py:21:5: RUF017 [*] Avoid quadratic list summation + | +19 | import functools, operator +20 | +21 | sum([x, y], []) + | ^^^^^^^^^^^^^^^ RUF017 + | + = help: Replace with `functools.reduce` + +ℹ Suggested fix +18 18 | def func(): +19 19 | import functools, operator +20 20 | +21 |- sum([x, y], []) + 21 |+ functools.reduce(operator.iadd, [x, y], []) +