diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index 73393b68c473..608ded63f7c3 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -3601,6 +3601,11 @@ public abstract class ExtractionTestGenerated extends AbstractExtractionTest { runTest("testData/refactoring/introduceParameter/lastParameterHasEolCommentAndTrailingComma.kt"); } + @TestMetadata("overrideFunction.kt") + public void testOverrideFunction() throws Exception { + runTest("testData/refactoring/introduceParameter/overrideFunction.kt"); + } + @TestMetadata("partialSubstitution.kt") public void testPartialSubstitution() throws Exception { runTest("testData/refactoring/introduceParameter/partialSubstitution.kt"); diff --git a/plugins/kotlin/idea/tests/testData/refactoring/introduceParameter/overrideFunction.kt b/plugins/kotlin/idea/tests/testData/refactoring/introduceParameter/overrideFunction.kt new file mode 100644 index 000000000000..d4d3e35afcf7 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/introduceParameter/overrideFunction.kt @@ -0,0 +1,11 @@ +// WITH_STDLIB + +interface I { + fun f() +} + +class A: I { + override fun f() { + val p = 42 + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/refactoring/introduceParameter/overrideFunction.kt.after b/plugins/kotlin/idea/tests/testData/refactoring/introduceParameter/overrideFunction.kt.after new file mode 100644 index 000000000000..57105c7f6f46 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/refactoring/introduceParameter/overrideFunction.kt.after @@ -0,0 +1,11 @@ +// WITH_STDLIB + +interface I { + fun f(i: Int = 42) +} + +class A: I { + override fun f(i: Int) { + val p = i + } +} diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduceParameter/KotlinFirIntroduceParameterHandler.kt b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduceParameter/KotlinFirIntroduceParameterHandler.kt index 6534f6f59cac..69f2597df99f 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduceParameter/KotlinFirIntroduceParameterHandler.kt +++ b/plugins/kotlin/refactorings/kotlin.refactorings.k2/src/org/jetbrains/kotlin/idea/k2/refactoring/introduceParameter/KotlinFirIntroduceParameterHandler.kt @@ -8,6 +8,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.RefactoringActionHandler +import com.intellij.refactoring.RefactoringBundle import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer import com.intellij.usageView.UsageInfo import com.intellij.util.SmartList @@ -32,6 +33,7 @@ import org.jetbrains.kotlin.idea.base.resources.KotlinBundle import org.jetbrains.kotlin.idea.codeinsight.utils.NamedArgumentUtils import org.jetbrains.kotlin.idea.core.CollectingNameValidator import org.jetbrains.kotlin.idea.k2.refactoring.changeSignature.* +import org.jetbrains.kotlin.idea.k2.refactoring.checkSuperMethods import org.jetbrains.kotlin.idea.k2.refactoring.introduce.K2ExtractableSubstringInfo import org.jetbrains.kotlin.idea.k2.refactoring.introduce.K2SemanticMatcher import org.jetbrains.kotlin.idea.k2.refactoring.introduce.extractionEngine.KotlinNameSuggester @@ -361,13 +363,16 @@ class KotlinFirIntroduceParameterHandler(private val helper: KotlinIntroducePara } fun IntroduceParameterDescriptor.performRefactoring(onExit: (() -> Unit)? = null) { - val methodDescriptor = KotlinMethodDescriptor((callable as? KtClass)?.primaryConstructor ?: callable) + val superMethods = checkSuperMethods(callable, emptyList(), RefactoringBundle.message("to.refactor")) + val targetCallable = superMethods.filterIsInstance().firstOrNull() ?: return + + val methodDescriptor = KotlinMethodDescriptor((targetCallable as? KtClass)?.primaryConstructor ?: targetCallable) val changeInfo = KotlinChangeInfo(methodDescriptor) val defaultValue = if (newArgumentValue is KtProperty) (newArgumentValue as KtProperty).initializer else newArgumentValue if (!withDefaultValue) { - val parameters = callable.getValueParameters() + val parameters = targetCallable.getValueParameters() val withReceiver = methodDescriptor.receiver != null parametersToRemove .map { @@ -382,18 +387,18 @@ fun IntroduceParameterDescriptor.performRefactoring(onExit: } val parameterInfo = KotlinParameterInfo( - originalType = KotlinTypeInfo(newParameterTypeText, callable), + originalType = KotlinTypeInfo(newParameterTypeText, targetCallable), name = newParameterName, originalIndex = -1, valOrVar = valVar, defaultValueForCall = defaultValue, defaultValueAsDefaultParameter = withDefaultValue, defaultValue = if (withDefaultValue) defaultValue else null, - context = callable + context = targetCallable ) changeInfo.addParameter(parameterInfo) - object : KotlinChangeSignatureProcessor(callable.project, changeInfo) { + object : KotlinChangeSignatureProcessor(targetCallable.project, changeInfo) { override fun performRefactoring(usages: Array) { super.performRefactoring(usages) occurrencesToReplace.forEach { diff --git a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduce/K2IntroduceParameterTestGenerated.java b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduce/K2IntroduceParameterTestGenerated.java index 34c9581bfbec..58e5af3176ac 100644 --- a/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduce/K2IntroduceParameterTestGenerated.java +++ b/plugins/kotlin/refactorings/kotlin.refactorings.tests.k2/test/org/jetbrains/kotlin/idea/k2/refactoring/introduce/K2IntroduceParameterTestGenerated.java @@ -355,6 +355,11 @@ public abstract class K2IntroduceParameterTestGenerated extends AbstractK2Introd runTest("../../idea/tests/testData/refactoring/introduceParameter/lastParameterHasEolCommentAndTrailingComma.kt"); } + @TestMetadata("overrideFunction.kt") + public void testOverrideFunction() throws Exception { + runTest("../../idea/tests/testData/refactoring/introduceParameter/overrideFunction.kt"); + } + @TestMetadata("partialSubstitution.kt") public void testPartialSubstitution() throws Exception { runTest("../../idea/tests/testData/refactoring/introduceParameter/partialSubstitution.kt");