diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionDefinitionUsage.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionDefinitionUsage.java index f65bd07b7c0..4216d12aa6e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionDefinitionUsage.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/usages/JetFunctionDefinitionUsage.java @@ -204,7 +204,7 @@ public class JetFunctionDefinitionUsage extends JetUsageIn processParameterListWithStructuralChanges(changeInfo, element, parameterList, psiFactory); } else if (parameterList != null) { - int paramIndex = 0; + int paramIndex = originalFunctionDescriptor.getExtensionReceiverParameter() != null ? 1 : 0; for (JetParameter parameter : parameterList.getParameters()) { JetParameterInfo parameterInfo = changeInfo.getNewParameters()[paramIndex]; diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt index 64786d503b3..f3455072e32 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt @@ -51,7 +51,8 @@ public class RenameKotlinParameterProcessor : RenameKotlinPsiProcessor() { val changeSignatureConfiguration = object : JetChangeSignatureConfiguration { override fun configure(originalDescriptor: JetMethodDescriptor, bindingContext: BindingContext): JetMethodDescriptor { - return originalDescriptor.modify { it.renameParameter(paramIndex, newName) } + val paramInfoIndex = if (functionDescriptor.getExtensionReceiverParameter() != null) paramIndex + 1 else paramIndex + return originalDescriptor.modify { it.renameParameter(paramInfoIndex, newName) } } override fun performSilently(affectedFunctions: Collection) = true diff --git a/idea/testData/refactoring/changeSignature/RenameExtensionParameterAfter.kt b/idea/testData/refactoring/changeSignature/RenameExtensionParameterAfter.kt new file mode 100644 index 00000000000..1e2775039e9 --- /dev/null +++ b/idea/testData/refactoring/changeSignature/RenameExtensionParameterAfter.kt @@ -0,0 +1,3 @@ +fun Int.foo(b: Int): Int { + return this + b +} \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/RenameExtensionParameterBefore.kt b/idea/testData/refactoring/changeSignature/RenameExtensionParameterBefore.kt new file mode 100644 index 00000000000..5dc70e2a04d --- /dev/null +++ b/idea/testData/refactoring/changeSignature/RenameExtensionParameterBefore.kt @@ -0,0 +1,3 @@ +fun Int.foo(a: Int): Int { + return this + a +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/JavaSub.java b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/JavaSub.java new file mode 100644 index 00000000000..8638fa91b7f --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/JavaSub.java @@ -0,0 +1,4 @@ +class JavaSub extends testing.Middle { + void foo(int receiver, int aa, String b) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt new file mode 100644 index 00000000000..d62271b19a0 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt @@ -0,0 +1,21 @@ +package testing + +trait Trait { + open fun Int.foo(aa: Int, b: String) { + } +} + +open class Super { + open fun Int.foo(aa: Int, b: String) { + } +} + +open class Middle : Super(), Trait { + override fun Int.foo(/*rename*/aa: Int, b: String) { + } +} + +class Sub : Middle() { + override fun Int.foo(aa: Int, b: String) { + } +} diff --git a/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/JavaSub.java b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/JavaSub.java new file mode 100644 index 00000000000..5c7e487d1e7 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/JavaSub.java @@ -0,0 +1,4 @@ +class JavaSub extends testing.Middle { + void foo(int receiver, int a, String b) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/main.kt b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/main.kt new file mode 100644 index 00000000000..a32d6e9590b --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/main.kt @@ -0,0 +1,21 @@ +package testing + +trait Trait { + open fun Int.foo(a: Int, b: String) { + } +} + +open class Super { + open fun Int.foo(a: Int, b: String) { + } +} + +open class Middle : Super(), Trait { + override fun Int.foo(/*rename*/a: Int, b: String) { + } +} + +class Sub : Middle() { + override fun Int.foo(a: Int, b: String) { + } +} diff --git a/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/parameter.test b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/parameter.test new file mode 100644 index 00000000000..13a6d7a6494 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/parameter.test @@ -0,0 +1,5 @@ +{ + "type": "MARKED_ELEMENT", + "newName": "aa", + "mainFile": "main.kt" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java index d5df2ec09de..cc9b42a83ea 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureTest.java @@ -918,6 +918,12 @@ public class JetChangeSignatureTest extends KotlinCodeInsightTestCase { doTest(changeInfo); } + public void testRenameExtensionParameter() throws Exception { + JetChangeInfo changeInfo = getChangeInfo(); + changeInfo.getNewParameters()[1].setName("b"); + doTest(changeInfo); + } + @NotNull @Override protected String getTestDataPath() { diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index 22aee121ab8..8bc80e2f69b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -83,6 +83,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("automaticRenamerParameterInExtension/parameter.test") + public void testAutomaticRenamerParameterInExtension_Parameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/automaticRenamerParameterInExtension/parameter.test"); + doTest(fileName); + } + @TestMetadata("defaultObject/defaultObject.test") public void testDefaultObject_DefaultObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/defaultObject/defaultObject.test");