diff --git a/CHANGELOG.md b/CHANGELOG.md index 51e5b0364..4e1dcfc9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # **Upcoming release** +## Bug fixes + +- #459 Fix bug while extracting method with augmented assignment to subscript in try block (@dryobates) + # Release 0.23.0 ## Syntax support diff --git a/rope/refactor/extract.py b/rope/refactor/extract.py index 650a2992a..f48210461 100644 --- a/rope/refactor/extract.py +++ b/rope/refactor/extract.py @@ -843,8 +843,12 @@ def _Assign(self, node): def _AugAssign(self, node): ast.walk(node.value, self) - self._read_variable(node.target.id, node.target.lineno) - self._written_variable(node.target.id, node.target.lineno) + if isinstance(node.target, ast.Subscript): + target_id = node.target.value.id + else: + target_id = node.target.id + self._read_variable(target_id, node.target.lineno) + self._written_variable(target_id, node.target.lineno) def _ClassDef(self, node): self._written_variable(node.name, node.lineno) diff --git a/ropetest/refactor/extracttest.py b/ropetest/refactor/extracttest.py index 93db1cb63..44404a1f4 100644 --- a/ropetest/refactor/extracttest.py +++ b/ropetest/refactor/extracttest.py @@ -1762,6 +1762,30 @@ def g(): """) self.assertEqual(expected, refactored) + def test_extract_method_and_augmentedj_assignment_in_try_block(self): + code = dedent("""\ + def f(): + any_subscriptable = [0] + try: + any_subscriptable[0] += 1 + except Exception: + pass + """) + start, end = self._convert_line_range_to_offset(code, 2, 6) + refactored = self.do_extract_method(code, start, end, "g") + expected = dedent("""\ + def f(): + g() + + def g(): + any_subscriptable = [0] + try: + any_subscriptable[0] += 1 + except Exception: + pass + """) + self.assertEqual(expected, refactored) + def test_extract_and_not_passing_global_functions(self): code = dedent("""\ def next(p):