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");