Skip to content

Commit

Permalink
🐛 Fixes renaming of args and kwargs with python <3.4
Browse files Browse the repository at this point in the history
If the new name for `*args` happened to be the same as the old name for `**kwargs`,
renaming `**kwargs` would incorrectly also rename `*args`.
  • Loading branch information
dflook committed May 4, 2020
1 parent 7db7811 commit a9a1237
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/python_minifier/rename/binding.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,10 +235,15 @@ def rename(self, new_name):
node.names = [new_name if n == self._name else n for n in node.names]
elif isinstance(node, ast.arguments):

if node.vararg == self._name:
rename_vararg = (node.vararg == self._name) and not getattr(node, 'vararg_renamed', False)
rename_kwarg = (node.kwarg == self._name) and not getattr(node, 'kwarg_renamed', False)

if rename_vararg:
node.vararg = new_name
if node.kwarg == self._name:
node.vararg_renamed = True
if rename_kwarg:
node.kwarg = new_name
node.kwarg_renamed = True

self._name = new_name

Expand Down
12 changes: 12 additions & 0 deletions test/test_rename_locals.py
Original file line number Diff line number Diff line change
Expand Up @@ -298,3 +298,15 @@ def t():
expected_ast = ast.parse(expected)
actual_ast = rename_locals(source)
assert_code(expected_ast, actual_ast)

def test_arg_rename():

source = '''
def f(*B,**A):pass
'''
expected = '''
def f(*A,**B):pass
'''
expected_ast = ast.parse(expected)
actual_ast = rename_locals(source)
assert_code(expected_ast, actual_ast)

0 comments on commit a9a1237

Please sign in to comment.