From 82d288de30c24cf3b507e87763a9c408b047579c Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Thu, 16 May 2013 11:36:05 +0200 Subject: [PATCH] fixed PY-9794 Change signature: loses parameter in function call when rearranging arguments so simple parameter gets after keyword parameter in call --- .../PyChangeSignatureUsageProcessor.java | 18 +++++++++++------- .../changeSignature/keywordParam.after.py | 2 +- .../changeSignature/moveParam.after.py | 5 +++++ .../changeSignature/moveParam.before.py | 4 ++++ .../changeSignature/PyChangeSignatureTest.java | 4 ++++ 5 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 python/testData/refactoring/changeSignature/moveParam.after.py create mode 100644 python/testData/refactoring/changeSignature/moveParam.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 c869ce6f30c7..b84a1614033d 100644 --- a/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java +++ b/python/src/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureUsageProcessor.java @@ -214,6 +214,7 @@ public class PyChangeSignatureUsageProcessor implements ChangeSignatureUsageProc final PyKeywordArgument keywordArgument = argumentList.getKeywordArgument(paramName); if (keywordArgument != null) { params.add(keywordArgument.getText()); + useKeywords = true; return currentIndex + 1; } else if (currentIndex < arguments.length) { @@ -222,14 +223,14 @@ public class PyChangeSignatureUsageProcessor implements ChangeSignatureUsageProc params.add(currentParameter.getText()); } else if (oldIndex < arguments.length && ( - !info.getDefaultInSignature() || !(currentParameter instanceof PyKeywordArgument))) { - addOldPositionParameter(params, arguments[oldIndex], info); + !(info.getDefaultInSignature() && arguments[oldIndex].getText().equals(info.getDefaultValue())) || !(currentParameter instanceof PyKeywordArgument))) { + return addOldPositionParameter(params, arguments[oldIndex], info, currentIndex); } else return currentIndex; } else if (oldIndex < arguments.length) { - addOldPositionParameter(params, arguments[oldIndex], info); + return addOldPositionParameter(params, arguments[oldIndex], info, currentIndex); } else if (!info.getDefaultInSignature()) { params.add( useKeywords ? paramName + " = " + info.getDefaultValue() @@ -242,9 +243,9 @@ public class PyChangeSignatureUsageProcessor implements ChangeSignatureUsageProc return currentIndex + 1; } - private void addOldPositionParameter(List params, - PyExpression argument, - PyParameterInfo info) { + private int addOldPositionParameter(List params, + PyExpression argument, + PyParameterInfo info, int currentIndex) { final String paramName = info.getName(); if (argument instanceof PyKeywordArgument) { final PyExpression valueExpression = ((PyKeywordArgument)argument).getValueExpression(); @@ -252,6 +253,8 @@ public class PyChangeSignatureUsageProcessor implements ChangeSignatureUsageProc if (!paramName.equals(argument.getName()) && !StringUtil.isEmptyOrSpaces(info.getDefaultValue())) { if (!info.getDefaultInSignature()) params.add(useKeywords ? info.getName() + " = " + info.getDefaultValue() : info.getDefaultValue()); + else + return currentIndex; } else { params.add(valueExpression == null ? paramName : paramName + " = " + valueExpression.getText()); @@ -259,8 +262,9 @@ public class PyChangeSignatureUsageProcessor implements ChangeSignatureUsageProc } } else { - params.add(useKeywords ? paramName + " = " + argument.getText() : argument.getText()); + params.add(useKeywords && !argument.getText().equals(info.getDefaultValue())? paramName + " = " + argument.getText() : argument.getText()); } + return currentIndex + 1; } private static boolean isPythonUsage(UsageInfo info) { diff --git a/python/testData/refactoring/changeSignature/keywordParam.after.py b/python/testData/refactoring/changeSignature/keywordParam.after.py index c7abc85a17ee..5bae9d9af57a 100644 --- a/python/testData/refactoring/changeSignature/keywordParam.after.py +++ b/python/testData/refactoring/changeSignature/keywordParam.after.py @@ -2,4 +2,4 @@ def func(a, b): pass -func(a=1, 2) +func(a=1, b=2) diff --git a/python/testData/refactoring/changeSignature/moveParam.after.py b/python/testData/refactoring/changeSignature/moveParam.after.py new file mode 100644 index 000000000000..e78d40c197fc --- /dev/null +++ b/python/testData/refactoring/changeSignature/moveParam.after.py @@ -0,0 +1,5 @@ +def f1(b=2, a=1): + pass + + +f1(b=3, a=2) \ No newline at end of file diff --git a/python/testData/refactoring/changeSignature/moveParam.before.py b/python/testData/refactoring/changeSignature/moveParam.before.py new file mode 100644 index 000000000000..2b59fe32ffc6 --- /dev/null +++ b/python/testData/refactoring/changeSignature/moveParam.before.py @@ -0,0 +1,4 @@ +def f1(a=1, b=2): + pass + +f1(2, b=3) \ 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 1d7430d483ef..c155732772a6 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/changeSignature/PyChangeSignatureTest.java @@ -129,6 +129,10 @@ public class PyChangeSignatureTest extends PyTestCase { new PyParameterInfo(2, "opt2", "None", true), new PyParameterInfo(3, "**extra_info", null, false))); } + public void testMoveParam() { + doChangeSignatureTest("f1", Arrays.asList(new PyParameterInfo(1, "b", "2", true), + new PyParameterInfo(0, "a", "1", true))); + } public void testMoveRenameParam() { final PyParameterInfo b = new PyParameterInfo(-1, "b", "1", false);