Change Signature: Constraint indices of parameters generated for overloaded versions of function with @JvmOverloads annotation

#KT-9762 Fixed
This commit is contained in:
Alexey Sedunov
2015-10-27 15:14:00 +03:00
parent 6a72b51677
commit 7ce6f58c27
4 changed files with 54 additions and 18 deletions
@@ -308,25 +308,33 @@ public open class JetChangeInfo(
return javaChangeInfo
}
fun getJavaParameterInfos(currentPsiMethod: PsiMethod, newParameterList: List<JetParameterInfo>): MutableList<ParameterInfoImpl> {
return newParameterList.withIndex().mapTo(ArrayList()) { pair ->
val (i, info) = pair
fun getJavaParameterInfos(
originalPsiMethod: PsiMethod,
currentPsiMethod: PsiMethod,
newParameterList: List<JetParameterInfo>
): MutableList<ParameterInfoImpl> {
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
@@ -0,0 +1,11 @@
@JvmOverloads fun <caret>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)
}
@@ -0,0 +1,11 @@
@JvmOverloads fun <caret>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)
}
@@ -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<Editor> editors = null;
private static final String[] EXTENSIONS = {".kt", ".java"};