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 1b7b7c952f1..5f9a459453c 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 @@ -161,10 +161,11 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac fun ClassDescriptor.calculateClassFlags(): Int { var flags = 0 - flags = flags or if (DescriptorUtils.isInterface(this)) Opcodes.ACC_INTERFACE else Opcodes.ACC_SUPER + flags = flags or if (DescriptorUtils.isInterface(this) || DescriptorUtils.isAnnotationClass(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 + flags = flags or if (kind == ClassKind.ANNOTATION_CLASS) Opcodes.ACC_ANNOTATION else 0 return flags } @@ -224,6 +225,9 @@ val MemberDescriptor.effectiveModality: Modality return Modality.ABSTRACT } } + if (DescriptorUtils.isAnnotationClass(this) || DescriptorUtils.isAnnotationClass(this.containingDeclaration)) { + return Modality.ABSTRACT + } return modality } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index 2e364554e30..ada65b67cf8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -44,7 +44,11 @@ class FunctionCodegen(val irFunction: IrFunction, val classCodegen: ClassCodegen val isStatic = isStaticMethod(classCodegen.descriptor.getMemberOwnerKind(), descriptor) || DescriptorUtils.isStaticDeclaration(descriptor) val frameMap = createFrameMapWithReceivers(classCodegen.state, descriptor, signature, isStatic) - var flags = AsmUtil.getMethodAsmFlags(descriptor, OwnerKind.IMPLEMENTATION, state).or(if (isStatic) Opcodes.ACC_STATIC else 0) + + var flags = AsmUtil.getMethodAsmFlags(descriptor, OwnerKind.IMPLEMENTATION, state).or(if (isStatic) Opcodes.ACC_STATIC else 0).xor( + if (DescriptorUtils.isAnnotationClass(descriptor.containingDeclaration)) Opcodes.ACC_FINAL else 0/*TODO*/ + ) + val interfaceClInit = JvmCodegenUtil.isJvmInterface(classCodegen.descriptor) && InitializersLowering.clinitName == descriptor.name if (interfaceClInit) { //reset abstract flag diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesLowering.kt index 6fc3f09a06e..26ca7baac7d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertiesLowering.kt @@ -18,12 +18,15 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.jvm.FileLoweringPass import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.utils.addIfNotNull -import org.jetbrains.kotlin.utils.addToStdlib.singletonList import java.util.* class PropertiesLowering : IrElementTransformerVoid(), FileLoweringPass { @@ -46,7 +49,9 @@ class PropertiesLowering : IrElementTransformerVoid(), FileLoweringPass { private fun lowerProperty(declaration: IrDeclaration): List? = if (declaration is IrProperty) ArrayList(3).apply { - addIfNotNull(declaration.backingField) + if (!DescriptorUtils.isAnnotationClass(declaration.descriptor.containingDeclaration)) { + addIfNotNull(declaration.backingField) + } addIfNotNull(declaration.getter) addIfNotNull(declaration.setter) }