Support @JvmField on interface properties
#KT-15807 Fixed
This commit is contained in:
@@ -19,6 +19,8 @@ package kotlin.reflect.jvm.internal
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.metadata.deserialization.getExtensionOrNull
|
||||
import org.jetbrains.kotlin.metadata.jvm.JvmProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
|
||||
import org.jetbrains.kotlin.resolve.DescriptorFactory
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
@@ -59,7 +61,9 @@ internal abstract class KPropertyImpl<out R> private constructor(
|
||||
is KotlinProperty -> {
|
||||
val descriptor = jvmSignature.descriptor
|
||||
JvmProtoBufUtil.getJvmFieldSignature(jvmSignature.proto, jvmSignature.nameResolver, jvmSignature.typeTable)?.let {
|
||||
val owner = if (JvmAbi.isCompanionObjectWithBackingFieldsInOuter(descriptor.containingDeclaration)) {
|
||||
val owner = if (JvmAbi.isPropertyWithBackingFieldInOuterClass(descriptor) ||
|
||||
JvmProtoBufUtil.isMovedFromInterfaceCompanion(jvmSignature.proto)
|
||||
) {
|
||||
container.jClass.enclosingClass
|
||||
} else descriptor.containingDeclaration.let { containingDeclaration ->
|
||||
if (containingDeclaration is ClassDescriptor) containingDeclaration.toJavaClass()
|
||||
@@ -188,6 +192,11 @@ private fun KPropertyImpl.Accessor<*, *>.computeCallerForAccessor(isGetter: Bool
|
||||
!DescriptorUtils.isInterface(possibleCompanionObject.containingDeclaration)
|
||||
}
|
||||
|
||||
fun isInsideInterfaceCompanionObjectWithJvmField(): Boolean {
|
||||
val possibleCompanionObject = property.descriptor.containingDeclaration
|
||||
return JvmAbi.isInterfaceCompanionWithBackingFieldsInOuter(possibleCompanionObject)
|
||||
}
|
||||
|
||||
fun isJvmStaticProperty() =
|
||||
property.descriptor.annotations.findAnnotation(JVM_STATIC) != null
|
||||
|
||||
@@ -195,7 +204,7 @@ private fun KPropertyImpl.Accessor<*, *>.computeCallerForAccessor(isGetter: Bool
|
||||
!TypeUtils.isNullableType(property.descriptor.type)
|
||||
|
||||
fun computeFieldCaller(field: Field): FunctionCaller<Field> = when {
|
||||
isInsideClassCompanionObject() -> {
|
||||
isInsideClassCompanionObject() || isInsideInterfaceCompanionObjectWithJvmField() -> {
|
||||
val klass = (descriptor.containingDeclaration as ClassDescriptor).toJavaClass()!!
|
||||
if (isGetter)
|
||||
if (isBound) FunctionCaller.BoundClassCompanionFieldGetter(field, klass)
|
||||
|
||||
Reference in New Issue
Block a user