[pyupgrade] Avoid syntax error when the iterable is an non-parenthesized tuple (UP028) (#15543)

## Summary

Resolves #15540.

## Test Plan

`cargo nextest run` and `cargo insta test`.
This commit is contained in:
InSync 2025-01-17 08:13:50 +07:00 committed by GitHub
parent 3950b00ee4
commit fa239f76ea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 29 additions and 2 deletions

View file

@ -121,3 +121,9 @@ def f():
def f():
for x, y in z:
yield x, y, x + y
# https://github.com/astral-sh/ruff/issues/15540
def f():
for a in 1,:
yield a

View file

@ -114,6 +114,7 @@ pub(crate) fn yield_in_for_loop(checker: &mut Checker, stmt_for: &ast::StmtFor)
}
let mut diagnostic = Diagnostic::new(YieldInForLoop, stmt_for.range());
let contents = checker.locator().slice(
parenthesized_range(
iter.as_ref().into(),
@ -123,7 +124,12 @@ pub(crate) fn yield_in_for_loop(checker: &mut Checker, stmt_for: &ast::StmtFor)
)
.unwrap_or(iter.range()),
);
let contents = format!("yield from {contents}");
let contents = if iter.as_tuple_expr().is_some_and(|it| !it.parenthesized) {
format!("yield from ({contents})")
} else {
format!("yield from {contents}")
};
diagnostic.set_fix(Fix::unsafe_edit(Edit::range_replacement(
contents,
stmt_for.range(),

View file

@ -1,5 +1,20 @@
---
source: crates/ruff_linter/src/rules/pyupgrade/mod.rs
snapshot_kind: text
---
UP028_1.py:128:5: UP028 [*] Replace `yield` over `for` loop with `yield from`
|
126 | # https://github.com/astral-sh/ruff/issues/15540
127 | def f():
128 | / for a in 1,:
129 | | yield a
| |_______________^ UP028
|
= help: Replace with `yield from`
Unsafe fix
125 125 |
126 126 | # https://github.com/astral-sh/ruff/issues/15540
127 127 | def f():
128 |- for a in 1,:
129 |- yield a
128 |+ yield from (1,)