From d27f3c01898fd73a20a67cf0d0103038d426e770 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 27 May 2016 16:24:55 +0300 Subject: [PATCH] Rename: Do not replace Java references to synthetic component functions when renaming constructor parameter #KT-9241 Fixed --- ChangeLog.md | 1 + .../rename/RenameKotlinPropertyProcessor.kt | 8 +++++++- .../after/JavaClient.java | 10 ++++++++++ .../renameKotlinDataClassParameter/after/test.kt | 10 ++++++++++ .../before/JavaClient.java | 10 ++++++++++ .../renameKotlinDataClassParameter/before/test.kt | 10 ++++++++++ .../renameKotlinDataClassParameter.test | 5 +++++ .../idea/refactoring/rename/RenameTestGenerated.java | 6 ++++++ 8 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/JavaClient.java create mode 100644 idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/test.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/JavaClient.java create mode 100644 idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/test.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinDataClassParameter/renameKotlinDataClassParameter.test diff --git a/ChangeLog.md b/ChangeLog.md index 6bf2b916b73..f27f451a56e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -179,6 +179,7 @@ - [`KT-8860`](https://youtrack.jetbrains.com/issue/KT-8860) Allow renaming class by constructor delegation call referencing primary constructor - [`KT-9156`](https://youtrack.jetbrains.com/issue/KT-9156) Quote non-identifier names in Kotlin references - [`KT-9157`](https://youtrack.jetbrains.com/issue/KT-9157) Fixed in-place rename of Kotlin expression referring Java declaration +- [`KT-9241`](https://youtrack.jetbrains.com/issue/KT-9241) Do not replace Java references to synthetic component functions when renaming constructor parameter - [`KT-9444`](https://youtrack.jetbrains.com/issue/KT-9444) Rename dialog: Allow typing any identifier without backquotes - [`KT-10713`](https://youtrack.jetbrains.com/issue/KT-10713) Skip read-only declarations when renaming parameters diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt index 661a77616d1..31d80996653 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.OverrideResolver +import org.jetbrains.kotlin.resolve.dataClassUtils.isComponentLike class RenameKotlinPropertyProcessor : RenameKotlinPsiProcessor() { override fun canProcessElement(element: PsiElement): Boolean { @@ -168,7 +169,12 @@ class RenameKotlinPropertyProcessor : RenameKotlinPsiProcessor() { val oldGetterName = JvmAbi.getterName(name) val oldSetterName = JvmAbi.setterName(name) - val refKindUsages = usages.toList().groupBy { usage: UsageInfo -> + val adjustedUsages = if (element is KtParameter) usages.filterNot { + val refTarget = it.reference?.resolve() + refTarget is KtLightMethod && isComponentLike(Name.guessByFirstCharacter(refTarget.name)) + } else usages.toList() + + val refKindUsages = adjustedUsages.groupBy { usage: UsageInfo -> val refElement = usage.reference?.resolve() if (refElement is PsiMethod) { when (refElement.name) { diff --git a/idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/JavaClient.java new file mode 100644 index 00000000000..87422ccf9b7 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/JavaClient.java @@ -0,0 +1,10 @@ +package test; + +public class JavaClient { + void test(A a) { + a.getFooNew(); + a.component1(); + a.getBar(); + a.component2(); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/test.kt b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/test.kt new file mode 100644 index 00000000000..7f15efbc514 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/after/test.kt @@ -0,0 +1,10 @@ +package test + +data class A(val fooNew: Int, val bar: String) + +fun test(a: A) { + a.fooNew + a.component1() + a.bar + a.component2() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/JavaClient.java b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/JavaClient.java new file mode 100644 index 00000000000..375e2e8259e --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/JavaClient.java @@ -0,0 +1,10 @@ +package test; + +public class JavaClient { + void test(A a) { + a.getFoo(); + a.component1(); + a.getBar(); + a.component2(); + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/test.kt b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/test.kt new file mode 100644 index 00000000000..f10cb97c81f --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/before/test.kt @@ -0,0 +1,10 @@ +package test + +data class A(val /*rename*/foo: Int, val bar: String) + +fun test(a: A) { + a.foo + a.component1() + a.bar + a.component2() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameKotlinDataClassParameter/renameKotlinDataClassParameter.test b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/renameKotlinDataClassParameter.test new file mode 100644 index 00000000000..14115630550 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinDataClassParameter/renameKotlinDataClassParameter.test @@ -0,0 +1,5 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "test.kt", + "newName": "fooNew" +} \ No newline at end of file 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 8eb41ec55e6..051c85dee4e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -317,6 +317,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameKotlinDataClassParameter/renameKotlinDataClassParameter.test") + public void testRenameKotlinDataClassParameter_RenameKotlinDataClassParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinDataClassParameter/renameKotlinDataClassParameter.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinEnum/renameKotlinEnum.test") public void testRenameKotlinEnum_RenameKotlinEnum() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinEnum/renameKotlinEnum.test");