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 {
|
fun ClassDescriptor.calculateClassFlags(): Int {
|
||||||
var flags = 0
|
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 calcModalityFlag()
|
||||||
flags = flags or AsmUtil.getVisibilityAccessFlagForClass(this)
|
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.ENUM_CLASS) Opcodes.ACC_ENUM else 0
|
||||||
|
flags = flags or if (kind == ClassKind.ANNOTATION_CLASS) Opcodes.ACC_ANNOTATION else 0
|
||||||
return flags
|
return flags
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,6 +225,9 @@ val MemberDescriptor.effectiveModality: Modality
|
|||||||
return Modality.ABSTRACT
|
return Modality.ABSTRACT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (DescriptorUtils.isAnnotationClass(this) || DescriptorUtils.isAnnotationClass(this.containingDeclaration)) {
|
||||||
|
return Modality.ABSTRACT
|
||||||
|
}
|
||||||
|
|
||||||
return modality
|
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 isStatic = isStaticMethod(classCodegen.descriptor.getMemberOwnerKind(), descriptor) || DescriptorUtils.isStaticDeclaration(descriptor)
|
||||||
val frameMap = createFrameMapWithReceivers(classCodegen.state, descriptor, signature, isStatic)
|
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
|
val interfaceClInit = JvmCodegenUtil.isJvmInterface(classCodegen.descriptor) && InitializersLowering.clinitName == descriptor.name
|
||||||
if (interfaceClInit) {
|
if (interfaceClInit) {
|
||||||
//reset abstract flag
|
//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.backend.jvm.FileLoweringPass
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
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.util.transformFlat
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.singletonList
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class PropertiesLowering : IrElementTransformerVoid(), FileLoweringPass {
|
class PropertiesLowering : IrElementTransformerVoid(), FileLoweringPass {
|
||||||
@@ -46,7 +49,9 @@ class PropertiesLowering : IrElementTransformerVoid(), FileLoweringPass {
|
|||||||
private fun lowerProperty(declaration: IrDeclaration): List<IrDeclaration>? =
|
private fun lowerProperty(declaration: IrDeclaration): List<IrDeclaration>? =
|
||||||
if (declaration is IrProperty)
|
if (declaration is IrProperty)
|
||||||
ArrayList<IrDeclaration>(3).apply {
|
ArrayList<IrDeclaration>(3).apply {
|
||||||
addIfNotNull(declaration.backingField)
|
if (!DescriptorUtils.isAnnotationClass(declaration.descriptor.containingDeclaration)) {
|
||||||
|
addIfNotNull(declaration.backingField)
|
||||||
|
}
|
||||||
addIfNotNull(declaration.getter)
|
addIfNotNull(declaration.getter)
|
||||||
addIfNotNull(declaration.setter)
|
addIfNotNull(declaration.setter)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user