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");