diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinTypeInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinTypeInfo.kt index 029676fba0c..f4bfc827e5a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinTypeInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinTypeInfo.kt @@ -18,18 +18,22 @@ package org.jetbrains.kotlin.idea.refactoring.changeSignature import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.TypeUtils data class KotlinTypeInfo(val isCovariant: Boolean, val type: KotlinType? = null, val text: String? = null) fun KotlinTypeInfo.render(): String { return when { text != null -> text - type != null -> (if (isCovariant) IdeDescriptorRenderers.SOURCE_CODE else IdeDescriptorRenderers.SOURCE_CODE_NOT_NULL_TYPE_APPROXIMATION).renderType(type) + type != null -> renderType() else -> "" } } +private fun KotlinTypeInfo.renderType(): String { + val renderer = if (isCovariant) IdeDescriptorRenderers.SOURCE_CODE else IdeDescriptorRenderers.SOURCE_CODE_NOT_NULL_TYPE_APPROXIMATION + return renderer.renderType(type!!) +} + fun KotlinTypeInfo.isEquivalentTo(other: KotlinTypeInfo): Boolean { - return if (type != null && other.type != null) TypeUtils.equalTypes(type, other.type) else render() == other.render() + return if (type != null && other.type != null) renderType() == other.renderType() else text == other.text } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt index 1b1390d0fbc..1d5e31ccfdc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/ui/KotlinChangeSignatureDialog.kt @@ -407,7 +407,7 @@ class KotlinChangeSignatureDialog( } } - private fun getTypeCodeFragmentContext(startFrom: PsiElement): KtElement { + fun getTypeCodeFragmentContext(startFrom: PsiElement): KtElement { return startFrom.parentsWithSelf.mapNotNull { when { it is KtNamedFunction -> it.bodyExpression ?: it.valueParameterList @@ -440,7 +440,7 @@ class KotlinChangeSignatureDialog( return KotlinChangeSignatureProcessor(project, changeInfo, commandName) } - private fun PsiCodeFragment?.getTypeInfo(isCovariant: Boolean, forPreview: Boolean): KotlinTypeInfo { + fun PsiCodeFragment?.getTypeInfo(isCovariant: Boolean, forPreview: Boolean): KotlinTypeInfo { if (this !is KtTypeCodeFragment) return KotlinTypeInfo(isCovariant) val typeRef = getContentElement() diff --git a/idea/testData/refactoring/changeSignature/ReturnTypeViaCodeFragmentAfter.kt b/idea/testData/refactoring/changeSignature/ReturnTypeViaCodeFragmentAfter.kt new file mode 100644 index 00000000000..768173b5720 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ReturnTypeViaCodeFragmentAfter.kt @@ -0,0 +1,9 @@ +class A + +interface I { + fun bar(): A +} + +class C : I { + override fun bar() = A() +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/ReturnTypeViaCodeFragmentBefore.kt b/idea/testData/refactoring/changeSignature/ReturnTypeViaCodeFragmentBefore.kt new file mode 100644 index 00000000000..0e04fe53ca1 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/ReturnTypeViaCodeFragmentBefore.kt @@ -0,0 +1,9 @@ +class A + +interface I { + fun foo(): A +} + +class C : I { + override fun foo() = A() +} \ 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 4374be41ca4..97f6cf0d57e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureTest.kt @@ -38,6 +38,8 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinMethodNode +import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinChangeSignatureDialog.Companion.getTypeInfo +import org.jetbrains.kotlin.idea.refactoring.changeSignature.ui.KotlinChangeSignatureDialog.Companion.getTypeCodeFragmentContext import org.jetbrains.kotlin.idea.search.allScope import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex @@ -246,6 +248,11 @@ class KotlinChangeSignatureTest : KotlinLightCodeInsightFixtureTestCase() { setNewParameter(j, temp) } + private fun KotlinChangeInfo.resolveType(text: String, isCovariant: Boolean, forPreview: Boolean): KotlinTypeInfo { + val codeFragment = KtPsiFactory(project).createTypeCodeFragment(text, getTypeCodeFragmentContext(context)) + return codeFragment.getTypeInfo(isCovariant, forPreview) + } + // --------------------------------- Tests --------------------------------- fun testBadSelection() { @@ -944,4 +951,9 @@ class KotlinChangeSignatureTest : KotlinLightCodeInsightFixtureTestCase() { fun testReceiverInSafeCall() = doTestConflict { receiverParameterInfo = null } fun testRemoveParameterKeepOtherComments() = doTest { removeParameter(1) } + + fun testReturnTypeViaCodeFragment() = doTest { + newName = "bar" + newReturnTypeInfo = resolveType("A", true, true) + } } \ No newline at end of file