From c7b26ed7ca923a86a06e18348cd267d8b2569352 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 26 Aug 2015 17:02:41 +0200 Subject: [PATCH] improve support for renaming overriding methods in enum entries #KT-8891 Fixed --- .../kotlin/codegen/binding/PsiCodegenPredictor.java | 13 ++++++++++--- .../org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt | 8 +++----- .../lineMarker/overrideImplement/EnumEntry.kt | 7 +++++++ .../renameKotlinFunctionInEnumFromSubclass.test | 6 ++++++ .../idea/codeInsight/LineMarkersTestGenerated.java | 6 ++++++ .../refactoring/rename/RenameTestGenerated.java | 6 ++++++ 6 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 idea/testData/codeInsight/lineMarker/overrideImplement/EnumEntry.kt create mode 100644 idea/testData/refactoring/rename/renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/PsiCodegenPredictor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/PsiCodegenPredictor.java index a5ab72e5dbd..117b4276840 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/PsiCodegenPredictor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/PsiCodegenPredictor.java @@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.codegen.AsmUtil; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; @@ -75,9 +74,9 @@ public final class PsiCodegenPredictor { } if (!PsiTreeUtil.instanceOf(declaration, JetClass.class, JetObjectDeclaration.class, JetNamedFunction.class, JetProperty.class) || - declaration instanceof JetEnumEntry) { + isEnumEntryWithoutBody(declaration)) { // Other subclasses are not valid for class name prediction. - // For example EnumEntry, JetFunctionLiteral + // For example JetFunctionLiteral return null; } @@ -105,4 +104,12 @@ public final class PsiCodegenPredictor { return parentInternalName + (parentDeclaration == null ? "/" : "$") + name.asString(); } + + private static boolean isEnumEntryWithoutBody(JetDeclaration declaration) { + if (!(declaration instanceof JetEnumEntry)) { + return false; + } + JetClassBody body = ((JetEnumEntry) declaration).getBody(); + return body == null || body.getDeclarations().size() == 0; + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt index 094f0160d58..4b562da5946 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt @@ -33,9 +33,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch import org.jetbrains.kotlin.types.expressions.OperatorConventions -import org.jetbrains.kotlin.utils.addToStdlib.constant -import java.util.ArrayList -import java.util.Collections +import java.util.* import kotlin.test.assertTrue // NOTE: in this file we collect only Kotlin-specific methods working with PSI and not modifying it @@ -189,8 +187,8 @@ public fun JetDeclaration.isOverridable(): Boolean { val parent = getParent() if (!(parent is JetClassBody || parent is JetParameterList)) return false - val klass = parent.getParent() - if (!(klass is JetClass && klass.isInheritable())) return false + val klass = parent.getParent() as? JetClass ?: return false + if (!klass.isInheritable() && !klass.isEnum()) return false if (hasModifier(JetTokens.FINAL_KEYWORD) || hasModifier(JetTokens.PRIVATE_KEYWORD)) return false diff --git a/idea/testData/codeInsight/lineMarker/overrideImplement/EnumEntry.kt b/idea/testData/codeInsight/lineMarker/overrideImplement/EnumEntry.kt new file mode 100644 index 00000000000..91485d5f6d9 --- /dev/null +++ b/idea/testData/codeInsight/lineMarker/overrideImplement/EnumEntry.kt @@ -0,0 +1,7 @@ +enum class SampleEnum { + V1 { + override fun any() { super.any() } + }; + + open fun any() {} +} diff --git a/idea/testData/refactoring/rename/renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test b/idea/testData/refactoring/rename/renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test new file mode 100644 index 00000000000..205398aca20 --- /dev/null +++ b/idea/testData/refactoring/rename/renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test @@ -0,0 +1,6 @@ +{ + "type": "KOTLIN_FUNCTION", + "classId": "test/E.A", + "oldName": "foo", + "newName": "bar" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/LineMarkersTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/LineMarkersTestGenerated.java index d4f211c0785..6ef2a5e4092 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/LineMarkersTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/LineMarkersTestGenerated.java @@ -73,6 +73,12 @@ public class LineMarkersTestGenerated extends AbstractLineMarkersTest { doTest(fileName); } + @TestMetadata("EnumEntry.kt") + public void testEnumEntry() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/lineMarker/overrideImplement/EnumEntry.kt"); + doTest(fileName); + } + @TestMetadata("FakeOverrideForClasses.kt") public void testFakeOverrideForClasses() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/codeInsight/lineMarker/overrideImplement/FakeOverrideForClasses.kt"); 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 411f305588e..3f498943892 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -269,6 +269,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test") + public void testRenameKotlinFunctionInEnum_RenameKotlinFunctionInEnumFromSubclass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinFunctionInEnum/renameKotlinFunctionInEnumFromSubclass.test"); + doTest(fileName); + } + @TestMetadata("renameKotlinMethod/javaWrapperForKotlinMethod.test") public void testRenameKotlinMethod_JavaWrapperForKotlinMethod() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/renameKotlinMethod/javaWrapperForKotlinMethod.test");