diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeInfo.kt index 00978ccccb4..a743f7e6e2f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeInfo.kt @@ -308,25 +308,33 @@ public open class JetChangeInfo( return javaChangeInfo } - fun getJavaParameterInfos(currentPsiMethod: PsiMethod, newParameterList: List): MutableList { - return newParameterList.withIndex().mapTo(ArrayList()) { pair -> - val (i, info) = pair + fun getJavaParameterInfos( + originalPsiMethod: PsiMethod, + currentPsiMethod: PsiMethod, + newParameterList: List + ): MutableList { + val oldParameterCount = originalPsiMethod.parameterList.parametersCount + return newParameterList.withIndex() + .map { pair -> + val (i, info) = pair - val type = if (isPrimaryMethodUpdated) - currentPsiMethod.getParameterList().getParameters()[i].getType() - else - PsiType.VOID + val oldIndex = info.oldIndex + val javaOldIndex = when { + methodDescriptor.receiver == null -> oldIndex + info == methodDescriptor.receiver -> 0 + oldIndex >= 0 -> oldIndex + 1 + else -> -1 + } + if (javaOldIndex >= oldParameterCount) return@map null - val oldIndex = info.getOldIndex() - val javaOldIndex = when { - methodDescriptor.receiver == null -> oldIndex - info == methodDescriptor.receiver -> 0 - oldIndex >= 0 -> oldIndex + 1 - else -> -1 - } + val type = if (isPrimaryMethodUpdated) + currentPsiMethod.getParameterList().getParameters()[i].getType() + else + PsiType.VOID - ParameterInfoImpl(javaOldIndex, info.getName(), type, info.defaultValueForCall?.getText() ?: "") - } + ParameterInfoImpl(javaOldIndex, info.getName(), type, info.defaultValueForCall?.getText() ?: "") + } + .filterNotNullTo(ArrayList()) } fun createJavaChangeInfoForFunctionOrGetter( @@ -335,13 +343,13 @@ public open class JetChangeInfo( isGetter: Boolean ): JavaChangeInfo? { val newParameterList = receiverParameterInfo.singletonOrEmptyList() + getNonReceiverParameters() - val newJavaParameters = getJavaParameterInfos(currentPsiMethod, newParameterList).toTypedArray() + val newJavaParameters = getJavaParameterInfos(originalPsiMethod, currentPsiMethod, newParameterList).toTypedArray() val newName = if (isGetter) JvmAbi.getterName(getNewName()) else getNewName() return createJavaChangeInfo(originalPsiMethod, currentPsiMethod, newName, currentPsiMethod.getReturnType(), newJavaParameters) } fun createJavaChangeInfoForSetter(originalPsiMethod: PsiMethod, currentPsiMethod: PsiMethod): JavaChangeInfo? { - val newJavaParameters = getJavaParameterInfos(currentPsiMethod, receiverParameterInfo.singletonOrEmptyList()) + val newJavaParameters = getJavaParameterInfos(originalPsiMethod, currentPsiMethod, receiverParameterInfo.singletonOrEmptyList()) val oldIndex = if (methodDescriptor.receiver != null) 1 else 0 if (isPrimaryMethodUpdated) { val newIndex = if (receiverParameterInfo != null) 1 else 0 diff --git a/idea/testData/refactoring/changeSignature/JvmOverloadedRenameParameterAfter.kt b/idea/testData/refactoring/changeSignature/JvmOverloadedRenameParameterAfter.kt new file mode 100644 index 00000000000..eb52a0792f6 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/JvmOverloadedRenameParameterAfter.kt @@ -0,0 +1,11 @@ +@JvmOverloads fun foo(aa: Int, b: Int, c: Int = 1, d: Int = 2) { + +} + +fun test() { + foo(aa = 1, b = 2, c = 3, d = 4) + foo(aa = 1, b = 2, c = 3) + foo(b = 1, c = 2, aa = 3) + foo(aa = 1, b = 2) + foo(b = 1, aa = 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/JvmOverloadedRenameParameterBefore.kt b/idea/testData/refactoring/changeSignature/JvmOverloadedRenameParameterBefore.kt new file mode 100644 index 00000000000..551c4f4ac9c --- /dev/null +++ b/idea/testData/refactoring/changeSignature/JvmOverloadedRenameParameterBefore.kt @@ -0,0 +1,11 @@ +@JvmOverloads fun foo(a: Int, b: Int, c: Int = 1, d: Int = 2) { + +} + +fun test() { + foo(a = 1, b = 2, c = 3, d = 4) + foo(a = 1, b = 2, c = 3) + foo(b = 1, c = 2, a = 3) + foo(a = 1, b = 2) + foo(b = 1, a = 2) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java index 98b38f63b02..b37115f09de 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java @@ -1341,6 +1341,12 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { doTest(changeInfo); } + public void testJvmOverloadedRenameParameter() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.getNewParameters()[0].setName("aa"); + doTest(changeInfo); + } + private List editors = null; private static final String[] EXTENSIONS = {".kt", ".java"};