Enum class is 'abstract' if it contains abstract members.

This commit is contained in:
Dmitry Petrov
2016-09-29 11:58:51 +03:00
parent 3a9f1e267b
commit 2ead71ff86
@@ -128,8 +128,12 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac
} }
fun ClassDescriptor.calculateClassFlags(): Int { fun ClassDescriptor.calculateClassFlags(): Int {
return (if (DescriptorUtils.isInterface(this)) Opcodes.ACC_INTERFACE else Opcodes.ACC_SUPER). var flags = 0
or(calcModalityFlag()).or(AsmUtil.getVisibilityAccessFlagForClass(this)) 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 { fun MemberDescriptor.calculateCommonFlags(): Int {
@@ -158,7 +162,7 @@ fun MemberDescriptor.calculateCommonFlags(): Int {
private fun MemberDescriptor.calcModalityFlag(): Int { private fun MemberDescriptor.calcModalityFlag(): Int {
var flags = 0 var flags = 0
when (modality) { when (effectiveModality) {
Modality.ABSTRACT -> { Modality.ABSTRACT -> {
flags = flags.or(Opcodes.ACC_ABSTRACT) flags = flags.or(Opcodes.ACC_ABSTRACT)
} }
@@ -181,10 +185,16 @@ private fun MemberDescriptor.calcModalityFlag(): Int {
return flags return flags
} }
//val MemberDescriptor.effectiveModality: Modality val MemberDescriptor.effectiveModality: Modality
// get() { get() {
// if (this is ClassDescriptor && kind == ClassKind.ENUM_CLASS) {
// } if (JvmCodegenUtil.hasAbstractMembers(this)) {
return Modality.ABSTRACT
}
}
return modality
}
val DeclarationDescriptorWithSource.psiElement: PsiElement? val DeclarationDescriptorWithSource.psiElement: PsiElement?
get() = (source as? PsiSourceElement)?.psi get() = (source as? PsiSourceElement)?.psi