From d12cb1eee0d837c7f1c1e05d60d0d2716cf451ea Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Wed, 17 Dec 2014 16:08:33 +0300 Subject: [PATCH] PY-8599 "Change signature" correctly handles rename of starred parameters PyReferenceImpl.handleElementRename checks that new name of the reference is valid identifier, which is not true for names prefixed with '*'. --- .../PyChangeSignatureUsageProcessor.java | 11 +++++------ .../changeSignature/renameStarredParameters.after.py | 3 +++ .../renameStarredParameters.before.py | 3 +++ .../changeSignature/PyChangeSignatureTest.java | 12 ++++++++++-- 4 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 python/testData/refactoring/changeSignature/renameStarredParameters.after.py create mode 100644 python/testData/refactoring/changeSignature/renameStarredParameters.before.py diff --git a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java index 1a7724773aef..99f575629d80 100644 --- a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java +++ b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java @@ -307,14 +307,13 @@ public class PyChangeSignatureUsageProcessor implements ChangeSignatureUsageProc private static void processFunctionDeclaration(@NotNull PyChangeInfo changeInfo, @NotNull PyFunction function) { if (changeInfo.isParameterNamesChanged()) { - final PyParameterInfo[] parameters = changeInfo.getNewParameters(); - for (int i = 0; i != parameters.length; ++i) { - PyParameterInfo paramInfo = parameters[i]; - final PyParameter[] oldParameters = function.getParameterList().getParameters(); + final PyParameter[] oldParameters = function.getParameterList().getParameters(); + for (PyParameterInfo paramInfo: changeInfo.getNewParameters()) { if (paramInfo.getOldIndex() >= 0 && paramInfo.isRenamed()) { - final UsageInfo[] usages = RenameUtil.findUsages(oldParameters[paramInfo.getOldIndex()], paramInfo.getName(), true, false, null); + final String newName = StringUtil.trimLeading(paramInfo.getName(), '*'); + final UsageInfo[] usages = RenameUtil.findUsages(oldParameters[paramInfo.getOldIndex()], newName, true, false, null); for (UsageInfo info : usages) { - RenameUtil.rename(info, paramInfo.getName()); + RenameUtil.rename(info, newName); } } } diff --git a/python/testData/refactoring/changeSignature/renameStarredParameters.after.py b/python/testData/refactoring/changeSignature/renameStarredParameters.after.py new file mode 100644 index 000000000000..644b52dd6052 --- /dev/null +++ b/python/testData/refactoring/changeSignature/renameStarredParameters.after.py @@ -0,0 +1,3 @@ +def func(arg1, *foo, **bar): + foo = list(foo) + [arg1] + bar = dict(bar) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/renameStarredParameters.before.py b/python/testData/refactoring/changeSignature/renameStarredParameters.before.py new file mode 100644 index 000000000000..dc2d312eaa07 --- /dev/null +++ b/python/testData/refactoring/changeSignature/renameStarredParameters.before.py @@ -0,0 +1,3 @@ +def func(arg1, *args, **kwargs): + args = list(args) + [arg1] + kwargs = dict(kwargs) \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java b/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java index fd7bb1e6e5dd..bc02d8438e5c 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java @@ -163,6 +163,15 @@ public class PyChangeSignatureTest extends PyTestCase { new PyParameterInfo(1, "param1", null, false)), LanguageLevel.PYTHON32); } + // PY-8599 + public void testRenameStarredParameters() { + final PyParameterInfo argsParam = new PyParameterInfo(1, "*args", null, false); + argsParam.setName("*foo"); + final PyParameterInfo kwargsParam = new PyParameterInfo(2, "**kwargs", null, false); + kwargsParam.setName("**bar"); + doChangeSignatureTest("func", Arrays.asList(new PyParameterInfo(0, "arg1", null, false), argsParam, kwargsParam), LanguageLevel.PYTHON32); + } + public void testRenameAndMoveParam() { final PyParameterInfo p2 = new PyParameterInfo(1, "p2", null, false); final PyParameterInfo p1 = new PyParameterInfo(0, "p1", null, false); @@ -231,8 +240,7 @@ public class PyChangeSignatureTest extends PyTestCase { private void changeSignature(@Nullable String newName, @Nullable List parameters) { final PyChangeSignatureHandler changeSignatureHandler = new PyChangeSignatureHandler(); - final PyFunction function = (PyFunction)changeSignatureHandler.findTargetMember( - myFixture.getFile(), myFixture.getEditor()); + final PyFunction function = (PyFunction)changeSignatureHandler.findTargetMember(myFixture.getFile(), myFixture.getEditor()); assertNotNull(function); final PyFunction newFunction = PyChangeSignatureHandler.getSuperMethod(function); assertNotNull(newFunction);