From 7bb7445c57a8f16115f0ccba8729cd21ce9fc021 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 19 Nov 2012 17:35:12 +0400 Subject: [PATCH] Fix for invoking abstract method in enum --- .../org/jetbrains/jet/codegen/CodegenUtil.java | 16 ++++++++++++++++ .../jet/codegen/ImplementationBodyCodegen.java | 1 + .../codegen/enum/abstractMethodInEnum.kt | 9 +++++++++ .../org/jetbrains/jet/codegen/EnumGenTest.java | 4 ++++ 4 files changed, 30 insertions(+) create mode 100644 compiler/testData/codegen/enum/abstractMethodInEnum.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 7833393ae35..d6c2eb2ffd7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -17,7 +17,9 @@ package org.jetbrains.jet.codegen; import com.google.common.collect.ImmutableList; +import com.intellij.openapi.util.Condition; import com.intellij.psi.PsiElement; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,6 +45,7 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.*; +import static org.jetbrains.jet.lang.descriptors.Modality.ABSTRACT; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; /** @@ -267,4 +270,17 @@ public class CodegenUtil { (context.getParentContext() instanceof NamespaceContext && context.getParentContext().getContextDescriptor() == containingDeclaration)) && context.getContextKind() != OwnerKind.TRAIT_IMPL); } + + public static boolean hasAbstractMembers(@NotNull ClassDescriptor classDescriptor) { + return ContainerUtil.exists(classDescriptor.getDefaultType().getMemberScope().getAllDescriptors(), + new Condition() { + @Override + public boolean value(DeclarationDescriptor declaration) { + if (!(declaration instanceof MemberDescriptor)) { + return false; + } + return ((MemberDescriptor) declaration).getModality() == ABSTRACT; + } + }); +} } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 3fc759e5263..580a519a9cb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -113,6 +113,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { signature.getInterfaces().add("java/lang/annotation/Annotation"); } else if (jetClass.hasModifier(JetTokens.ENUM_KEYWORD)) { + isAbstract = hasAbstractMembers(descriptor); isEnum = true; } diff --git a/compiler/testData/codegen/enum/abstractMethodInEnum.kt b/compiler/testData/codegen/enum/abstractMethodInEnum.kt new file mode 100644 index 00000000000..62647cb10c1 --- /dev/null +++ b/compiler/testData/codegen/enum/abstractMethodInEnum.kt @@ -0,0 +1,9 @@ +enum class A() { + ENTRY: A(){ override fun t() = "OK"} + + abstract fun t(): String +} + +fun f(a: A) = a.t() + +fun box()= f(A.ENTRY) diff --git a/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java index 3c44528a5ee..c2239fac644 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/EnumGenTest.java @@ -171,4 +171,8 @@ public class EnumGenTest extends CodegenTestCase { public void testInnerWithExistingClassObject() { blackBoxFile("enum/innerWithExistingClassObject.kt"); } + + public void testAbstractMethodInEnum() { + blackBoxFile("enum/abstractMethodInEnum.kt"); + } }