diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt index f3e7d616e90..1cf39f7d2ff 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt @@ -307,14 +307,18 @@ public open class KotlinChangeInfo( val receiverTypeText = receiverParameterInfo?.currentTypeInfo?.render() ?: return null val typeSubstitutor = inheritedCallable.typeSubstitutor ?: return receiverTypeText val currentBaseFunction = inheritedCallable.baseFunction.currentCallableDescriptor ?: return receiverTypeText - return currentBaseFunction.extensionReceiverParameter!!.type.renderTypeWithSubstitution(typeSubstitutor, receiverTypeText, false) + val receiverType = currentBaseFunction.extensionReceiverParameter!!.type + if (receiverType.isError) return receiverTypeText + return receiverType.renderTypeWithSubstitution(typeSubstitutor, receiverTypeText, false) } public fun renderReturnType(inheritedCallable: KotlinCallableDefinitionUsage<*>): String { val defaultRendering = newReturnTypeInfo.render() val typeSubstitutor = inheritedCallable.typeSubstitutor ?: return defaultRendering val currentBaseFunction = inheritedCallable.baseFunction.currentCallableDescriptor ?: return defaultRendering - return currentBaseFunction.returnType!!.renderTypeWithSubstitution(typeSubstitutor, defaultRendering, false) + val returnType = currentBaseFunction.returnType!! + if (returnType.isError) return defaultRendering + return returnType.renderTypeWithSubstitution(typeSubstitutor, defaultRendering, false) } public fun primaryMethodUpdated() { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt index afd9208f7ba..d2160f34357 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinParameterInfo.kt @@ -150,6 +150,7 @@ public class KotlinParameterInfo @JvmOverloads constructor ( val typeSubstitutor = inheritedCallable.typeSubstitutor ?: return defaultRendering val currentBaseFunction = inheritedCallable.baseFunction.currentCallableDescriptor ?: return defaultRendering val parameterType = currentBaseFunction.getValueParameters().get(parameterIndex).getType() + if (parameterType.isError) return defaultRendering return parameterType.renderTypeWithSubstitution(typeSubstitutor, defaultRendering, true) } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt index faf384c9788..9722af761e5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/KotlinCallableDefinitionUsage.kt @@ -120,12 +120,10 @@ class KotlinCallableDefinitionUsage( processParameterListWithStructuralChanges(changeInfo, element, parameterList, psiFactory) } else if (parameterList != null) { - var paramIndex = if (originalCallableDescriptor.extensionReceiverParameter != null) 1 else 0 - - for (parameter in parameterList.parameters) { - val parameterInfo = changeInfo.newParameters[paramIndex] + val offset = if (originalCallableDescriptor.extensionReceiverParameter != null) 1 else 0 + for ((paramIndex, parameter) in parameterList.parameters.withIndex()) { + val parameterInfo = changeInfo.newParameters[paramIndex + offset] changeParameter(paramIndex, parameter, parameterInfo) - paramIndex++ } parameterList.addToShorteningWaitSet(Options.DEFAULT) diff --git a/idea/testData/refactoring/changeSignature/SetErrorParameterTypeAfter.kt b/idea/testData/refactoring/changeSignature/SetErrorParameterTypeAfter.kt new file mode 100644 index 00000000000..b990b6c59a3 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/SetErrorParameterTypeAfter.kt @@ -0,0 +1,11 @@ +open class A { + open fun Int.foo(n: XYZ): Int { + return 1 + } +} + +class B : A() { + override fun Int.foo(n: XYZ): Int { + return 2 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/SetErrorParameterTypeBefore.kt b/idea/testData/refactoring/changeSignature/SetErrorParameterTypeBefore.kt new file mode 100644 index 00000000000..3b34acfcd4e --- /dev/null +++ b/idea/testData/refactoring/changeSignature/SetErrorParameterTypeBefore.kt @@ -0,0 +1,11 @@ +open class A { + open fun Int.foo(n: Int): Int { + return 1 + } +} + +class B : A() { + override fun Int.foo(n: Int): Int { + return 2 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/SetErrorReceiverTypeAfter.kt b/idea/testData/refactoring/changeSignature/SetErrorReceiverTypeAfter.kt new file mode 100644 index 00000000000..a9779abc3df --- /dev/null +++ b/idea/testData/refactoring/changeSignature/SetErrorReceiverTypeAfter.kt @@ -0,0 +1,11 @@ +open class A { + open fun XYZ.foo(n: Int): Int { + return 1 + } +} + +class B : A() { + override fun XYZ.foo(n: Int): Int { + return 2 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/SetErrorReceiverTypeBefore.kt b/idea/testData/refactoring/changeSignature/SetErrorReceiverTypeBefore.kt new file mode 100644 index 00000000000..3b34acfcd4e --- /dev/null +++ b/idea/testData/refactoring/changeSignature/SetErrorReceiverTypeBefore.kt @@ -0,0 +1,11 @@ +open class A { + open fun Int.foo(n: Int): Int { + return 1 + } +} + +class B : A() { + override fun Int.foo(n: Int): Int { + return 2 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/SetErrorReturnTypeAfter.kt b/idea/testData/refactoring/changeSignature/SetErrorReturnTypeAfter.kt new file mode 100644 index 00000000000..b4af701be62 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/SetErrorReturnTypeAfter.kt @@ -0,0 +1,11 @@ +open class A { + open fun Int.foo(n: Int): XYZ { + return 1 + } +} + +class B : A() { + override fun Int.foo(n: Int): XYZ { + return 2 + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/SetErrorReturnTypeBefore.kt b/idea/testData/refactoring/changeSignature/SetErrorReturnTypeBefore.kt new file mode 100644 index 00000000000..3b34acfcd4e --- /dev/null +++ b/idea/testData/refactoring/changeSignature/SetErrorReturnTypeBefore.kt @@ -0,0 +1,11 @@ +open class A { + open fun Int.foo(n: Int): Int { + return 1 + } +} + +class B : A() { + override fun Int.foo(n: Int): Int { + return 2 + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt index c74c0adee04..6a9ab788f94 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt @@ -897,4 +897,10 @@ class KotlinChangeSignatureTest : KotlinCodeInsightTestCase() { fun testRemoveParameterKeepFormat3() = doTest { removeParameter(2) } fun testSwapParametersKeepFormat() = doTest { swapParameters(0, 2) } + + fun testSetErrorReturnType() = doTest { newReturnTypeInfo = KotlinTypeInfo(true, null, "XYZ") } + + fun testSetErrorReceiverType() = doTest { receiverParameterInfo!!.currentTypeInfo = KotlinTypeInfo(true, null, "XYZ") } + + fun testSetErrorParameterType() = doTest { newParameters[1].currentTypeInfo = KotlinTypeInfo(true, null, "XYZ") } } \ No newline at end of file