From 672ef6fab02bb8a754afbb91b870f56d601e5591 Mon Sep 17 00:00:00 2001 From: Yang Fan Date: Tue, 15 Sep 2026 13:58:38 +0800 Subject: [PATCH] Fix extraction of nested named expressions --- CHANGELOG.md | 3 ++- rope/refactor/usefunction.py | 1 + ropetest/refactor/extracttest.py | 17 +++++------------ 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 010425d5d..3859a2db7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # **Upcoming release** +- #871 Reject extraction of expressions with nested named expressions (@yangfan-yf-yf) - #850 Update and pin black version in pre-commit and Github Actions - #851 Bump supported python version to up to Python 3.14 -- #852 Implement patchedast handlers for TypeAlias +- #852 Implement patchedast handlers for TypeAlias - #853 Implement patchedast handlers TypeVar - #847 Avoid printing autoimport syntax errors (@yangfan-yf-yf) - #623, #819, #863 Support MatchOr, MatchSequence, MatchStar (@jheld, @lieryan) diff --git a/rope/refactor/usefunction.py b/rope/refactor/usefunction.py index cf1330e80..fa912e814 100644 --- a/rope/refactor/usefunction.py +++ b/rope/refactor/usefunction.py @@ -192,6 +192,7 @@ def _Return(self, node): def _NamedExpr(self, node): self.named_expression += 1 + self.visit(node.value) def _Yield(self, node): self.yields += 1 diff --git a/ropetest/refactor/extracttest.py b/ropetest/refactor/extracttest.py index 4b34d58d3..472ca77a3 100644 --- a/ropetest/refactor/extracttest.py +++ b/ropetest/refactor/extracttest.py @@ -2373,18 +2373,11 @@ def foo(a): start, end = code.index(extract_target), code.index(extract_target) + len( extract_target ) - refactored = self.do_extract_method(code, start, end, "new_func") - expected = dedent("""\ - def foo(a): - if i, c := new_func(a): - i += 1 - c += 1 - print(i) - - def new_func(a): - return (i := a == (c := 5)) - """) - self.assertEqual(expected, refactored) + with self.assertRaisesRegex( + rope.base.exceptions.RefactoringError, + "Extracted piece cannot contain named expression \\(:= operator\\).", + ): + self.do_extract_method(code, start, end, "new_func") @testutils.only_for_versions_higher("3.8") def test_extract_function_expression_with_inline_assignment_in_inner_expression(