mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
+5
-6
@@ -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)
|
||||
+10
-2
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user