Annotation class support
This commit is contained in:
committed by
Dmitry Petrov
parent
3fe84bba6c
commit
c22bfaeefb
+5
-1
@@ -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
|
||||
}
|
||||
|
||||
+5
-1
@@ -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
|
||||
|
||||
+8
-3
@@ -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<IrDeclaration>? =
|
||||
if (declaration is IrProperty)
|
||||
ArrayList<IrDeclaration>(3).apply {
|
||||
addIfNotNull(declaration.backingField)
|
||||
if (!DescriptorUtils.isAnnotationClass(declaration.descriptor.containingDeclaration)) {
|
||||
addIfNotNull(declaration.backingField)
|
||||
}
|
||||
addIfNotNull(declaration.getter)
|
||||
addIfNotNull(declaration.setter)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user