Skip to content

Commit

Permalink
Fix read/write analysis of the left-hand side of an augmented assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
lieryan committed Nov 21, 2022
1 parent 5f8bd4a commit d10fbe3
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 7 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
@@ -1,6 +1,7 @@
# **Upcoming release**

- #492, Feat: Global configuration support
- #492 Feat: Global configuration support
- #509 Fix read/write analysis of the left-hand side of an augmented assignment

# Release 1.4.0

Expand Down
10 changes: 5 additions & 5 deletions rope/refactor/extract.py
Expand Up @@ -856,12 +856,12 @@ def _Assign(self, node):

def _AugAssign(self, node):
ast.walk(node.value, self)
if isinstance(node.target, ast.Subscript):
target_id = node.target.value.id
else:
if isinstance(node.target, ast.Name):
target_id = node.target.id
self._read_variable(target_id, node.target.lineno)
self._written_variable(target_id, node.target.lineno)
self._read_variable(target_id, node.target.lineno)
self._written_variable(target_id, node.target.lineno)
else:
ast.walk(node.target, self)

def _ClassDef(self, node):
self._written_variable(node.name, node.lineno)
Expand Down
64 changes: 63 additions & 1 deletion ropetest/refactor/extracttest.py
Expand Up @@ -1762,7 +1762,69 @@ def g():
""")
self.assertEqual(expected, refactored)

def test_extract_method_and_augmentedj_assignment_in_try_block(self):
def test_extract_method_and_augmented_assignment_nested_1(self):
code = dedent("""\
def f():
my_var = [[0], [1], [2]]
my_var[0][0] += 1
print(1)
""")
start, end = self._convert_line_range_to_offset(code, 4, 4)
refactored = self.do_extract_method(code, start, end, "g")
expected = dedent("""\
def f():
my_var = [[0], [1], [2]]
my_var[0][0] += 1
g()
def g():
print(1)
""")
self.assertEqual(expected, refactored)

def test_extract_method_and_augmented_assignment_nested_2(self):
code = dedent("""\
def f():
my_var = [[0], [1], [2]]
my_var[0][0] += 1
print(my_var)
""")
start, end = self._convert_line_range_to_offset(code, 3, 3)
refactored = self.do_extract_method(code, start, end, "g")
expected = dedent("""\
def f():
my_var = [[0], [1], [2]]
g(my_var)
print(my_var)
def g(my_var):
my_var[0][0] += 1
""")
self.assertEqual(expected, refactored)

def test_extract_method_and_augmented_assignment_var_to_read_in_lhs(self):
code = dedent("""\
def f():
var_to_read = 0
my_var = [0, 1, 2]
my_var[var_to_read] += 1
print(my_var)
""")
start, end = self._convert_line_range_to_offset(code, 4, 4)
refactored = self.do_extract_method(code, start, end, "g")
expected = dedent("""\
def f():
var_to_read = 0
my_var = [0, 1, 2]
g(my_var, var_to_read)
print(my_var)
def g(my_var, var_to_read):
my_var[var_to_read] += 1
""")
self.assertEqual(expected, refactored)

def test_extract_method_and_augmented_assignment_in_try_block(self):
code = dedent("""\
def f():
any_subscriptable = [0]
Expand Down

0 comments on commit d10fbe3

Please sign in to comment.