From d2c33c13a61d0ee2d40b41ec1ad073cf0208bcea Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 10 Jun 2015 15:46:59 +0300 Subject: [PATCH] Change Signature/Rename: Fix renaming of extension function parameter --- .../usages/JetFunctionDefinitionUsage.java | 2 +- .../rename/RenameKotlinParameterProcessor.kt | 3 ++- .../RenameExtensionParameterAfter.kt | 3 +++ .../RenameExtensionParameterBefore.kt | 3 +++ .../after/JavaSub.java | 4 ++++ .../after/main.kt | 21 +++++++++++++++++++ .../before/JavaSub.java | 4 ++++ .../before/main.kt | 21 +++++++++++++++++++ .../parameter.test | 5 +++++ .../JetChangeSignatureTest.java | 6 ++++++ .../rename/RenameTestGenerated.java | 6 ++++++ 11 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/changeSignature/RenameExtensionParameterAfter.kt create mode 100644 idea/testData/refactoring/changeSignature/RenameExtensionParameterBefore.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/JavaSub.java create mode 100644 idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/JavaSub.java create mode 100644 idea/testData/refactoring/rename/automaticRenamerParameterInExtension/before/main.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerParameterInExtension/parameter.test 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");