diff --git a/ChangeLog.md b/ChangeLog.md index b8b3b5be0f0..b4f18673b4d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -223,6 +223,7 @@ - [`KT-8512`](https://youtrack.jetbrains.com/issue/KT-8512) Support "Rename tests" options in Rename dialog ###### Issues fixed +- [`KT-4791`](https://youtrack.jetbrains.com/issue/KT-4791) Rename overridden property and all its accessors on attempt to rename overriding accessor in Java code - [`KT-6363`](https://youtrack.jetbrains.com/issue/KT-6363) Do not rename ambiguous references in import directives - [`KT-6663`](https://youtrack.jetbrains.com/issue/KT-6663) Fixed rename of ambiguous import reference to class/function when some referenced declarations are not changed - [`KT-8541`](https://youtrack.jetbrains.com/issue/KT-8541), [`KT-8786`](https://youtrack.jetbrains.com/issue/KT-8786) Do now show 'Rename overloads' options if target function has no overloads diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinElementDescriptionProvider.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinElementDescriptionProvider.kt index 4fbe3ffe75b..1f266ada25d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinElementDescriptionProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinElementDescriptionProvider.kt @@ -38,7 +38,8 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils class KotlinElementDescriptionProvider : ElementDescriptionProvider { override fun getElementDescription(element: PsiElement, location: ElementDescriptionLocation): String? { - val targetElement = element.unwrapped ?: element + val shouldUnwrap = location !is UsageViewShortNameLocation && location !is UsageViewLongNameLocation + val targetElement = if (shouldUnwrap) element.unwrapped ?: element else element fun elementKind() = when (targetElement) { is KtClass -> if (targetElement.isInterface()) "interface" else "class" @@ -65,7 +66,7 @@ class KotlinElementDescriptionProvider : ElementDescriptionProvider { if (targetElement !is PsiNamedElement || targetElement.language != KotlinLanguage.INSTANCE) return null return when(location) { is UsageViewTypeLocation -> elementKind() - is UsageViewShortNameLocation, is UsageViewLongNameLocation -> targetElement.getName() + is UsageViewShortNameLocation, is UsageViewLongNameLocation -> targetElement.name is RefactoringDescriptionLocation -> { val kind = elementKind() ?: return null val descriptor = targetDescriptor() ?: return null 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 e45dee0fd26..8d20822c2a4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPropertyProcessor.kt @@ -243,8 +243,10 @@ class RenameKotlinPropertyProcessor : RenameKotlinPsiProcessor() { else -> throw IllegalStateException("Can't be for element $element there because of canProcessElement()") } + val newPropertyName = if (newName != null && element is KtLightMethod) propertyNameByAccessor(newName, element) else newName + for (propertyMethod in propertyMethods) { - addRenameElements(propertyMethod, (element as PsiNamedElement).name, newName, allRenames, scope) + addRenameElements(propertyMethod, (element as PsiNamedElement).name, newPropertyName, allRenames, scope) } } diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/after/lib/lib.kt b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/after/lib/lib.kt new file mode 100644 index 00000000000..f96d6bb9631 --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/after/lib/lib.kt @@ -0,0 +1,5 @@ +package lib + +interface Foo { + var bar: Int +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/after/usage/JUsage.java b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/after/usage/JUsage.java new file mode 100644 index 00000000000..a9b3a9c3a04 --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/after/usage/JUsage.java @@ -0,0 +1,14 @@ +package usage; + +import lib.Foo; + +public class JUsage implements Foo { + @Override + public int getBar() { + return 1; + } + + @Override + public void setBar(int value) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/before/lib/lib.kt b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/before/lib/lib.kt new file mode 100644 index 00000000000..c7d93217d7f --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/before/lib/lib.kt @@ -0,0 +1,5 @@ +package lib + +interface Foo { + var foo: Int +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/before/usage/JUsage.java b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/before/usage/JUsage.java new file mode 100644 index 00000000000..33134714425 --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/before/usage/JUsage.java @@ -0,0 +1,14 @@ +package usage; + +import lib.Foo; + +public class JUsage implements Foo { + @Override + public int /*rename*/getFoo() { + return 1; + } + + @Override + public void setFoo(int value) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/renameOverriddenPropertyViaJavaGetter.test b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/renameOverriddenPropertyViaJavaGetter.test new file mode 100644 index 00000000000..8beeca4789a --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/renameOverriddenPropertyViaJavaGetter.test @@ -0,0 +1,6 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "usage/JUsage.java", + "newName": "getBar", + "withRuntime": "true" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/after/lib/lib.kt b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/after/lib/lib.kt new file mode 100644 index 00000000000..f96d6bb9631 --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/after/lib/lib.kt @@ -0,0 +1,5 @@ +package lib + +interface Foo { + var bar: Int +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/after/usage/JUsage.java b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/after/usage/JUsage.java new file mode 100644 index 00000000000..a9b3a9c3a04 --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/after/usage/JUsage.java @@ -0,0 +1,14 @@ +package usage; + +import lib.Foo; + +public class JUsage implements Foo { + @Override + public int getBar() { + return 1; + } + + @Override + public void setBar(int value) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/before/lib/lib.kt b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/before/lib/lib.kt new file mode 100644 index 00000000000..c7d93217d7f --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/before/lib/lib.kt @@ -0,0 +1,5 @@ +package lib + +interface Foo { + var foo: Int +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/before/usage/JUsage.java b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/before/usage/JUsage.java new file mode 100644 index 00000000000..449694cc919 --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/before/usage/JUsage.java @@ -0,0 +1,14 @@ +package usage; + +import lib.Foo; + +public class JUsage implements Foo { + @Override + public int getFoo() { + return 1; + } + + @Override + public void /*rename*/setFoo(int value) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/renameOverriddenPropertyViaJavaSetter.test b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/renameOverriddenPropertyViaJavaSetter.test new file mode 100644 index 00000000000..802468aa882 --- /dev/null +++ b/idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/renameOverriddenPropertyViaJavaSetter.test @@ -0,0 +1,6 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "usage/JUsage.java", + "newName": "setBar", + "withRuntime": "true" +} \ 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 1b953bf159b..28b10241a3c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -863,6 +863,18 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameOverriddenPropertyViaJavaGetter/renameOverriddenPropertyViaJavaGetter.test") + public void testRenameOverriddenPropertyViaJavaGetter_RenameOverriddenPropertyViaJavaGetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaGetter/renameOverriddenPropertyViaJavaGetter.test"); + doTest(fileName); + } + + @TestMetadata("renameOverriddenPropertyViaJavaSetter/renameOverriddenPropertyViaJavaSetter.test") + public void testRenameOverriddenPropertyViaJavaSetter_RenameOverriddenPropertyViaJavaSetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameOverriddenPropertyViaJavaSetter/renameOverriddenPropertyViaJavaSetter.test"); + doTest(fileName); + } + @TestMetadata("renamePlus/plus.test") public void testRenamePlus_Plus() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/renamePlus/plus.test");