JVM_IR. Support annotation classes with JvmField fields
This commit is contained in:
+1
-2
@@ -289,8 +289,7 @@ private val MemberDescriptor.effectiveModality: Modality
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (DescriptorUtils.isSealedClass(this) ||
|
if (DescriptorUtils.isSealedClass(this) ||
|
||||||
DescriptorUtils.isAnnotationClass(this) ||
|
DescriptorUtils.isAnnotationClass(this)
|
||||||
DescriptorUtils.isAnnotationClass(this.containingDeclaration)
|
|
||||||
) {
|
) {
|
||||||
return Modality.ABSTRACT
|
return Modality.ABSTRACT
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -76,7 +76,7 @@ open class FunctionCodegen(private val irFunction: IrFunction, private val class
|
|||||||
val deprecation = if (irFunction.hasAnnotation(FQ_NAMES.deprecated)) Opcodes.ACC_DEPRECATED else 0
|
val deprecation = if (irFunction.hasAnnotation(FQ_NAMES.deprecated)) Opcodes.ACC_DEPRECATED else 0
|
||||||
val bridgeFlag = 0 //TODO
|
val bridgeFlag = 0 //TODO
|
||||||
val modalityFlag = when ((irFunction as? IrSimpleFunction)?.modality) {
|
val modalityFlag = when ((irFunction as? IrSimpleFunction)?.modality) {
|
||||||
Modality.FINAL -> if (!classCodegen.irClass.isAnnotationClass) Opcodes.ACC_FINAL else Opcodes.ACC_ABSTRACT
|
Modality.FINAL -> if (!classCodegen.irClass.isAnnotationClass || irFunction.isStatic) Opcodes.ACC_FINAL else Opcodes.ACC_ABSTRACT
|
||||||
Modality.ABSTRACT -> Opcodes.ACC_ABSTRACT
|
Modality.ABSTRACT -> Opcodes.ACC_ABSTRACT
|
||||||
else -> if (classCodegen.irClass.isJvmInterface && irFunction.body == null) Opcodes.ACC_ABSTRACT else 0 //TODO transform interface modality on lowering to DefaultImpls
|
else -> if (classCodegen.irClass.isJvmInterface && irFunction.body == null) Opcodes.ACC_ABSTRACT else 0 //TODO transform interface modality on lowering to DefaultImpls
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -40,7 +40,7 @@ class ConstAndJvmFieldPropertiesLowering(val context: CommonBackendContext) : Ir
|
|||||||
val irProperty = irSimpleFunction.correspondingProperty ?: return super.visitCall(expression)
|
val irProperty = irSimpleFunction.correspondingProperty ?: return super.visitCall(expression)
|
||||||
|
|
||||||
if (irProperty.isConst) {
|
if (irProperty.isConst) {
|
||||||
(irProperty.backingField?.initializer?.expression as? IrConst<*>)?.let { return it }
|
(irProperty.backingField!!.initializer!!.expression as IrConst<*>).let { return it }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (irProperty.backingField?.hasAnnotation(JVM_FIELD_ANNOTATION_FQ_NAME) == true) {
|
if (irProperty.backingField?.hasAnnotation(JVM_FIELD_ANNOTATION_FQ_NAME) == true) {
|
||||||
|
|||||||
+2
-1
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
|||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
||||||
|
import org.jetbrains.kotlin.ir.util.isAnnotationClass
|
||||||
import org.jetbrains.kotlin.ir.util.isInterface
|
import org.jetbrains.kotlin.ir.util.isInterface
|
||||||
import org.jetbrains.kotlin.ir.util.isObject
|
import org.jetbrains.kotlin.ir.util.isObject
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
@@ -60,7 +61,7 @@ class MoveCompanionObjectFieldsLowering(val context: CommonBackendContext) : Cla
|
|||||||
val companion = irClass.declarations.find {
|
val companion = irClass.declarations.find {
|
||||||
it is IrClass && it.isCompanion
|
it is IrClass && it.isCompanion
|
||||||
} as IrClass? ?: return
|
} as IrClass? ?: return
|
||||||
if (irClass.isInterface && !companion.allFieldsAreJvmField()) return
|
if ((irClass.isInterface || irClass.isAnnotationClass) && !companion.allFieldsAreJvmField()) return
|
||||||
companion.declarations.forEach {
|
companion.declarations.forEach {
|
||||||
when (it) {
|
when (it) {
|
||||||
is IrProperty -> {
|
is IrProperty -> {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: +NestedClassesInAnnotations
|
// !LANGUAGE: +NestedClassesInAnnotations
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// IGNORE_BACKEND: NATIVE
|
// IGNORE_BACKEND: NATIVE
|
||||||
|
|
||||||
annotation class Foo(val kind: Kind) {
|
annotation class Foo(val kind: Kind) {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: +JvmFieldInInterface +NestedClassesInAnnotations
|
// !LANGUAGE: +JvmFieldInInterface +NestedClassesInAnnotations
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !LANGUAGE: +JvmFieldInInterface +NestedClassesInAnnotations
|
// !LANGUAGE: +JvmFieldInInterface +NestedClassesInAnnotations
|
||||||
// IGNORE_BACKEND: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
|
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|||||||
Reference in New Issue
Block a user