diff --git a/CHANGELOG.md b/CHANGELOG.md index f72561c1e..0b1a5b33f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,13 @@ # Release +# Syntax support + - #392 Add extract method refactoring of code containing `global` (@climbus) +## Bug fixes +- #391, #396 Extract method similar no longer replace the left-hand side of assignment + + # Release 0.20.1 @@ -13,6 +19,7 @@ Date: 2021-09-18 instead of boolean + # Release 0.20.0 Date: 2021-09-18 diff --git a/rope/refactor/extract.py b/rope/refactor/extract.py index aab0c3551..7a6f853b6 100644 --- a/rope/refactor/extract.py +++ b/rope/refactor/extract.py @@ -312,7 +312,7 @@ def _find_matches(self, collector): @staticmethod def _is_assignment(region_match): - return isinstance(region_match.ast, ast.Attribute) and isinstance(region_match.ast.ctx, ast.Store) + return isinstance(region_match.ast, (ast.Attribute, ast.Subscript)) and isinstance(region_match.ast.ctx, ast.Store) def _where_to_search(self): if self.info.similar: diff --git a/ropetest/refactor/extracttest.py b/ropetest/refactor/extracttest.py index 5cb6106de..eb7e970fe 100644 --- a/ropetest/refactor/extracttest.py +++ b/ropetest/refactor/extracttest.py @@ -1811,7 +1811,7 @@ def second_method(someargs): self.assertEqual(expected, refactored) - def test_extract_function_expression_with_assignment(self): + def test_extract_function_expression_with_assignment_to_attribute(self): code = dedent('''\ class A(object): def func(self): @@ -1833,6 +1833,28 @@ def new_func(self): self.assertEqual(expected, refactored) + def test_extract_function_expression_with_assignment_index(self): + code = dedent('''\ + class A(object): + def func(self, val): + self[val] = 1 + var_bb = self[val] + ''') + extract_target = '= self[val]' + start, end = code.index(extract_target)+2, code.index(extract_target)+2 + len(extract_target) - 2 + refactored = self.do_extract_method(code, start, end, 'new_func', similar=True) + expected = dedent('''\ + class A(object): + def func(self, val): + self[val] = 1 + var_bb = self.new_func(val) + + def new_func(self, val): + return self[val] + ''') + + self.assertEqual(expected, refactored) + def test_extraction_method_with_global_variable(self): code = dedent('''\ g = None