From 2ead71ff86bc62f2c9a2ccb0e27c3505d4b66c0b Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 29 Sep 2016 11:58:51 +0300 Subject: [PATCH] Enum class is 'abstract' if it contains abstract members. --- .../backend/jvm/codegen/ClassCodegen.kt | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 09667cf30af..e3b1294ed50 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -128,8 +128,12 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac } fun ClassDescriptor.calculateClassFlags(): Int { - return (if (DescriptorUtils.isInterface(this)) Opcodes.ACC_INTERFACE else Opcodes.ACC_SUPER). - or(calcModalityFlag()).or(AsmUtil.getVisibilityAccessFlagForClass(this)) + var flags = 0 + flags = flags or if (DescriptorUtils.isInterface(this)) Opcodes.ACC_INTERFACE else Opcodes.ACC_SUPER + flags = flags or calcModalityFlag() + flags = flags or AsmUtil.getVisibilityAccessFlagForClass(this) + flags = flags or if (kind == ClassKind.ENUM_CLASS) Opcodes.ACC_ENUM else 0 + return flags } fun MemberDescriptor.calculateCommonFlags(): Int { @@ -158,7 +162,7 @@ fun MemberDescriptor.calculateCommonFlags(): Int { private fun MemberDescriptor.calcModalityFlag(): Int { var flags = 0 - when (modality) { + when (effectiveModality) { Modality.ABSTRACT -> { flags = flags.or(Opcodes.ACC_ABSTRACT) } @@ -181,10 +185,16 @@ private fun MemberDescriptor.calcModalityFlag(): Int { return flags } -//val MemberDescriptor.effectiveModality: Modality -// get() { -// -// } +val MemberDescriptor.effectiveModality: Modality + get() { + if (this is ClassDescriptor && kind == ClassKind.ENUM_CLASS) { + if (JvmCodegenUtil.hasAbstractMembers(this)) { + return Modality.ABSTRACT + } + } + + return modality + } val DeclarationDescriptorWithSource.psiElement: PsiElement? get() = (source as? PsiSourceElement)?.psi