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 '*'.
This commit is contained in:
Mikhail Golubev
2014-12-17 20:31:04 +03:00
parent a88fdff2a8
commit d12cb1eee0
4 changed files with 21 additions and 8 deletions
@@ -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);
}
}
}
@@ -0,0 +1,3 @@
def func(arg1, *foo, **bar):
foo = list(foo) + [arg1]
bar = dict(bar)
@@ -0,0 +1,3 @@
def func(arg1, *args, **kwargs):
args = list(args) + [arg1]
kwargs = dict(kwargs)
@@ -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<PyParameterInfo> 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);