From 5b8df2f6f228019859e75193c57ae99380589e2c Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 16 Jul 2018 13:34:55 +0200 Subject: [PATCH] Use proto flag to determine companion field moved to interface --- .../jetbrains/kotlin/load/java/JvmAbi.java | 25 ++++++++++++++----- .../jvm/deserialization/JvmProtoBufUtil.kt | 1 + .../reflect/jvm/internal/KPropertyImpl.kt | 13 ++++++++-- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java index a00f6f914c2..7f1c0d3c3e1 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java @@ -10,15 +10,17 @@ import org.jetbrains.kotlin.builtins.CompanionObjectMapping; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget; import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget; +import org.jetbrains.kotlin.metadata.ProtoBuf; +import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter; import org.jetbrains.kotlin.resolve.scopes.MemberScope; +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor; import org.jetbrains.kotlin.util.capitalizeDecapitalize.CapitalizeDecapitalizeKt; import java.util.Collection; -import java.util.Iterator; import java.util.List; import static org.jetbrains.kotlin.resolve.DescriptorUtils.*; @@ -116,10 +118,13 @@ public final class JvmAbi { } - public static boolean isInterfaceCompanionWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) { - DeclarationDescriptor interfaceClass = companionObject.getContainingDeclaration(); - if (!isInterface(interfaceClass) && !isAnnotationClass(interfaceClass)) return false; - Collection descriptors = ((ClassDescriptor) companionObject).getUnsubstitutedMemberScope() + public static boolean isInterfaceCompanionWithBackingFieldsInOuter(@NotNull DeclarationDescriptor declarationDescriptor) { + DeclarationDescriptor interfaceClass = declarationDescriptor.getContainingDeclaration(); + if (!isCompanionObject(declarationDescriptor) || + (!isInterface(interfaceClass) && !isAnnotationClass(interfaceClass))) { + return false; + } + Collection descriptors = ((ClassDescriptor) declarationDescriptor).getUnsubstitutedMemberScope() .getContributedDescriptors(DescriptorKindFilter.ALL, MemberScope.Companion.getALL_NAME_FILTER()); boolean hasJvmFieldAnnotation = false; for (DeclarationDescriptor next : descriptors) { @@ -132,12 +137,20 @@ public final class JvmAbi { return false; } - if (!hasJvmFieldAnnotation(propertyDescriptor)) return false; + if (!isMovedFromInterfaceCompanion(propertyDescriptor) && !hasJvmFieldAnnotation(propertyDescriptor)) return false; hasJvmFieldAnnotation = true; } return hasJvmFieldAnnotation; } + private static boolean isMovedFromInterfaceCompanion(@NotNull PropertyDescriptor propertyDescriptor) { + if (propertyDescriptor instanceof DeserializedPropertyDescriptor) { + ProtoBuf.Property proto = ((DeserializedPropertyDescriptor) propertyDescriptor).getProto(); + return JvmProtoBufUtil.isMovedFromInterfaceCompanion(proto); + } + return false; + } + public static boolean isMappedIntrinsicCompanionObject(@NotNull ClassDescriptor companionObject) { return CompanionObjectMapping.INSTANCE.isMappedIntrinsicCompanionObject(companionObject); } diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt index a0a3f166b44..73290a23f1b 100644 --- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt +++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/JvmProtoBufUtil.kt @@ -120,6 +120,7 @@ object JvmProtoBufUtil { return if (type.hasClassName()) ClassMapperLite.mapClass(nameResolver.getQualifiedClassName(type.className)) else null } + @JvmStatic fun isMovedFromInterfaceCompanion(proto: ProtoBuf.Property) = proto.getExtension(JvmProtoBuf.isMovedFromInterfaceCompanion).toInt().and(1) != 0 } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt index 41698eee4fa..6184ebe8401 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KPropertyImpl.kt @@ -33,6 +33,7 @@ import kotlin.reflect.KMutableProperty import kotlin.reflect.KProperty import kotlin.reflect.full.IllegalPropertyDelegateAccessException import kotlin.reflect.jvm.internal.JvmPropertySignature.* +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor internal abstract class KPropertyImpl private constructor( override val container: KDeclarationContainerImpl, @@ -192,9 +193,17 @@ private fun KPropertyImpl.Accessor<*, *>.computeCallerForAccessor(isGetter: Bool !DescriptorUtils.isInterface(possibleCompanionObject.containingDeclaration) } - fun isInsideInterfaceCompanionObjectWithJvmField(): Boolean { + fun isInsideJvmInterfaceCompanionObject(): Boolean { val possibleCompanionObject = property.descriptor.containingDeclaration - return JvmAbi.isInterfaceCompanionWithBackingFieldsInOuter(possibleCompanionObject) + return DescriptorUtils.isCompanionObject(possibleCompanionObject) && + (DescriptorUtils.isInterface(possibleCompanionObject.containingDeclaration) || + DescriptorUtils.isAnnotationClass(possibleCompanionObject.containingDeclaration)) + } + + fun isInsideInterfaceCompanionObjectWithJvmField(): Boolean { + val propertyDescriptor = property.descriptor + if (propertyDescriptor !is DeserializedPropertyDescriptor || !isInsideJvmInterfaceCompanionObject()) return false + return JvmProtoBufUtil.isMovedFromInterfaceCompanion(propertyDescriptor.proto) } fun isJvmStaticProperty() =