From 28273eb00b9d23f5a5d7353bffc088becac378ae Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sun, 17 Sep 2023 11:23:27 -0400 Subject: [PATCH] Avoid flagging starred elements in C402 (#7466) ## Summary Rewriting these is not valid syntax. Part of https://github.com/astral-sh/ruff/issues/7455. --- .../fixtures/flake8_comprehensions/C402.py | 3 ++ .../rules/unnecessary_generator_dict.rs | 31 +++++++++++-------- ...8_comprehensions__tests__C402_C402.py.snap | 5 +++ 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/crates/ruff/resources/test/fixtures/flake8_comprehensions/C402.py b/crates/ruff/resources/test/fixtures/flake8_comprehensions/C402.py index 56a1f6cfc8..a9c4914e10 100644 --- a/crates/ruff/resources/test/fixtures/flake8_comprehensions/C402.py +++ b/crates/ruff/resources/test/fixtures/flake8_comprehensions/C402.py @@ -19,3 +19,6 @@ print(f'Hello {dict((x,f(x)) for x in "abc")} World') # Regression test for: https://github.com/astral-sh/ruff/issues/7086 dict((k,v)for k,v in d.iteritems() if k in only_args) + +# Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722458940 +dict((*v, k) for k, v in enumerate(calendar.month_abbr)) diff --git a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs index b03d5880e8..e507c77a1f 100644 --- a/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs +++ b/crates/ruff/src/rules/flake8_comprehensions/rules/unnecessary_generator_dict.rs @@ -54,18 +54,23 @@ pub(crate) fn unnecessary_generator_dict( else { return; }; - if let Expr::GeneratorExp(ast::ExprGeneratorExp { elt, .. }) = argument { - match elt.as_ref() { - Expr::Tuple(ast::ExprTuple { elts, .. }) if elts.len() == 2 => { - let mut diagnostic = Diagnostic::new(UnnecessaryGeneratorDict, expr.range()); - if checker.patch(diagnostic.kind.rule()) { - diagnostic.try_set_fix(|| { - fixes::fix_unnecessary_generator_dict(expr, checker).map(Fix::suggested) - }); - } - checker.diagnostics.push(diagnostic); - } - _ => {} - } + let Expr::GeneratorExp(ast::ExprGeneratorExp { elt, .. }) = argument else { + return; + }; + let Expr::Tuple(ast::ExprTuple { elts, .. }) = elt.as_ref() else { + return; + }; + if elts.len() != 2 { + return; } + if elts.iter().any(Expr::is_starred_expr) { + return; + } + let mut diagnostic = Diagnostic::new(UnnecessaryGeneratorDict, expr.range()); + if checker.patch(diagnostic.kind.rule()) { + diagnostic.try_set_fix(|| { + fixes::fix_unnecessary_generator_dict(expr, checker).map(Fix::suggested) + }); + } + checker.diagnostics.push(diagnostic); } diff --git a/crates/ruff/src/rules/flake8_comprehensions/snapshots/ruff__rules__flake8_comprehensions__tests__C402_C402.py.snap b/crates/ruff/src/rules/flake8_comprehensions/snapshots/ruff__rules__flake8_comprehensions__tests__C402_C402.py.snap index 8fe86d0663..29edd8c8a1 100644 --- a/crates/ruff/src/rules/flake8_comprehensions/snapshots/ruff__rules__flake8_comprehensions__tests__C402_C402.py.snap +++ b/crates/ruff/src/rules/flake8_comprehensions/snapshots/ruff__rules__flake8_comprehensions__tests__C402_C402.py.snap @@ -251,6 +251,8 @@ C402.py:21:1: C402 [*] Unnecessary generator (rewrite as a `dict` comprehension) 20 | # Regression test for: https://github.com/astral-sh/ruff/issues/7086 21 | dict((k,v)for k,v in d.iteritems() if k in only_args) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C402 +22 | +23 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722458940 | = help: Rewrite as a `dict` comprehension @@ -260,5 +262,8 @@ C402.py:21:1: C402 [*] Unnecessary generator (rewrite as a `dict` comprehension) 20 20 | # Regression test for: https://github.com/astral-sh/ruff/issues/7086 21 |-dict((k,v)for k,v in d.iteritems() if k in only_args) 21 |+{k: v for k,v in d.iteritems() if k in only_args} +22 22 | +23 23 | # Regression test for: https://github.com/astral-sh/ruff/issues/7455#issuecomment-1722458940 +24 24 | dict((*v, k) for k, v in enumerate(calendar.month_abbr))