diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt index 71d0eea8ebd..0d91e9059fe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt @@ -38,10 +38,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.java.NOT_NULL_ANNOTATIONS import org.jetbrains.kotlin.load.java.NULLABLE_ANNOTATIONS import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtNamedFunction -import org.jetbrains.kotlin.psi.KtParameterList -import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.typeRefHelpers.setReceiverTypeReference import org.jetbrains.kotlin.renderer.ClassifierNamePolicy import org.jetbrains.kotlin.renderer.DescriptorRenderer @@ -338,6 +335,14 @@ class ChangeMemberFunctionSignatureFix private constructor( if (patternFunction.receiverTypeReference == null && function.receiverTypeReference != null) { function.setReceiverTypeReference(null) } + + val patternTypeParameterList = patternFunction.typeParameterList + if (patternTypeParameterList != null) { + ShortenReferences.DEFAULT.process( + (if (function.typeParameterList != null) function.typeParameterList?.replace(patternTypeParameterList) + else function.addAfter(patternTypeParameterList, function.funKeyword)) as KtTypeParameterList + ) + } else function.typeParameterList?.delete() } } diff --git a/idea/testData/quickfix/override/nothingToOverride/addTypeParameter.kt b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter.kt new file mode 100644 index 00000000000..6c3f3931012 --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter.kt @@ -0,0 +1,8 @@ +// "Change function signature to 'fun f(a: T)'" "true" +open class A { + open fun f(a: T) {} +} + +class B : A() { + override fun f(a: Int) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/addTypeParameter.kt.after b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter.kt.after new file mode 100644 index 00000000000..250e0666ca8 --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter.kt.after @@ -0,0 +1,8 @@ +// "Change function signature to 'fun f(a: T)'" "true" +open class A { + open fun f(a: T) {} +} + +class B : A() { + override fun f(a: T) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/addTypeParameter2.kt b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter2.kt new file mode 100644 index 00000000000..991673a3abd --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter2.kt @@ -0,0 +1,9 @@ +// "Change function signature to 'fun f(a: T)'" "true" +open class A { + open fun f(a: T) {} +} + +class B : A() { + class Number + override fun f(a: Int) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/addTypeParameter2.kt.after b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter2.kt.after new file mode 100644 index 00000000000..bd41af443fa --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/addTypeParameter2.kt.after @@ -0,0 +1,9 @@ +// "Change function signature to 'fun f(a: T)'" "true" +open class A { + open fun f(a: T) {} +} + +class B : A() { + class Number + override fun f(a: T) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/changeTypeParameter.kt b/idea/testData/quickfix/override/nothingToOverride/changeTypeParameter.kt new file mode 100644 index 00000000000..080eadd2d47 --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/changeTypeParameter.kt @@ -0,0 +1,8 @@ +// "Change function signature to 'fun f(a: T)'" "true" +open class A { + open fun f(a: T) {} +} + +class B : A() { + override fun > f(a: E) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/changeTypeParameter.kt.after b/idea/testData/quickfix/override/nothingToOverride/changeTypeParameter.kt.after new file mode 100644 index 00000000000..250e0666ca8 --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/changeTypeParameter.kt.after @@ -0,0 +1,8 @@ +// "Change function signature to 'fun f(a: T)'" "true" +open class A { + open fun f(a: T) {} +} + +class B : A() { + override fun f(a: T) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/removeTypeParameter.kt b/idea/testData/quickfix/override/nothingToOverride/removeTypeParameter.kt new file mode 100644 index 00000000000..7e779a7047b --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/removeTypeParameter.kt @@ -0,0 +1,8 @@ +// "Change function signature to 'fun f(a: Int)'" "true" +open class A { + open fun f(a: Int) {} +} + +class B : A() { + override fun f(a: T) {} +} diff --git a/idea/testData/quickfix/override/nothingToOverride/removeTypeParameter.kt.after b/idea/testData/quickfix/override/nothingToOverride/removeTypeParameter.kt.after new file mode 100644 index 00000000000..709012a4ab0 --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/removeTypeParameter.kt.after @@ -0,0 +1,8 @@ +// "Change function signature to 'fun f(a: Int)'" "true" +open class A { + open fun f(a: Int) {} +} + +class B : A() { + override fun f(a: Int) {} +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index bf4eb5ce510..f56876d4746 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9288,6 +9288,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/override/nothingToOverride/addParameterTwoSupertypes.kt"); } + @TestMetadata("addTypeParameter.kt") + public void testAddTypeParameter() throws Exception { + runTest("idea/testData/quickfix/override/nothingToOverride/addTypeParameter.kt"); + } + + @TestMetadata("addTypeParameter2.kt") + public void testAddTypeParameter2() throws Exception { + runTest("idea/testData/quickfix/override/nothingToOverride/addTypeParameter2.kt"); + } + public void testAllFilesPresentInNothingToOverride() throws Exception { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/override/nothingToOverride"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); } @@ -9337,6 +9347,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/override/nothingToOverride/changeReturnType.kt"); } + @TestMetadata("changeTypeParameter.kt") + public void testChangeTypeParameter() throws Exception { + runTest("idea/testData/quickfix/override/nothingToOverride/changeTypeParameter.kt"); + } + @TestMetadata("doNotLooseAnnotations.kt") public void testDoNotLooseAnnotations() throws Exception { runTest("idea/testData/quickfix/override/nothingToOverride/doNotLooseAnnotations.kt"); @@ -9377,6 +9392,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/override/nothingToOverride/removeParameterTwoTraits.kt"); } + @TestMetadata("removeTypeParameter.kt") + public void testRemoveTypeParameter() throws Exception { + runTest("idea/testData/quickfix/override/nothingToOverride/removeTypeParameter.kt"); + } + @TestMetadata("swapParametersGenericClass.kt") public void testSwapParametersGenericClass() throws Exception { runTest("idea/testData/quickfix/override/nothingToOverride/swapParametersGenericClass.kt");