diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt
index c105c8c27c3..d7ea58185db 100644
--- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt
+++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/AbstractBinaryClassAnnotationAndConstantLoader.kt
@@ -221,9 +221,6 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader(
}
override fun loadPropertyConstant(container: ProtoContainer, proto: ProtoBuf.Property, expectedType: KotlinType): C? {
- val signature = getCallableSignature(proto, container.nameResolver, container.typeTable, AnnotatedCallableKind.PROPERTY)
- ?: return null
-
val specialCase = getSpecialCaseContainerClass(
container,
property = true,
@@ -233,6 +230,14 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader(
)
val kotlinClass = findClassWithAnnotationsAndInitializers(container, specialCase) ?: return null
+ val requireHasFieldFlag = kotlinClass.classHeader.metadataVersion.isAtLeast(
+ DeserializedDescriptorResolver.KOTLIN_1_3_RC_METADATA_VERSION
+ )
+ val signature =
+ getCallableSignature(
+ proto, container.nameResolver, container.typeTable, AnnotatedCallableKind.PROPERTY, requireHasFieldFlag
+ ) ?: return null
+
val constant = storage(kotlinClass).propertyConstants[signature] ?: return null
return if (UnsignedTypes.isUnsignedType(expectedType)) transformToUnsignedConstant(constant) else constant
}
@@ -352,12 +357,14 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader(
nameResolver: NameResolver,
typeTable: TypeTable,
field: Boolean = false,
- synthetic: Boolean = false
+ synthetic: Boolean = false,
+ requireHasFieldFlagForField: Boolean = true
): MemberSignature? {
val signature = proto.getExtensionOrNull(propertySignature) ?: return null
if (field) {
- val fieldSignature = JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable) ?: return null
+ val fieldSignature =
+ JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable, requireHasFieldFlagForField) ?: return null
return MemberSignature.fromJvmMemberSignature(fieldSignature)
}
else if (synthetic && signature.hasSyntheticMethod()) {
@@ -371,7 +378,8 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader(
proto: MessageLite,
nameResolver: NameResolver,
typeTable: TypeTable,
- kind: AnnotatedCallableKind
+ kind: AnnotatedCallableKind,
+ requireHasFieldFlagForField: Boolean = false
): MemberSignature? {
return when {
proto is ProtoBuf.Constructor -> {
@@ -388,7 +396,7 @@ abstract class AbstractBinaryClassAnnotationAndConstantLoader(
AnnotatedCallableKind.PROPERTY_SETTER ->
if (signature.hasSetter()) MemberSignature.fromMethod(nameResolver, signature.setter) else null
AnnotatedCallableKind.PROPERTY ->
- getPropertySignature(proto, nameResolver, typeTable, true, true)
+ getPropertySignature(proto, nameResolver, typeTable, true, true, requireHasFieldFlagForField)
else -> null
}
}
diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt
index c4631194392..8cdf3cad562 100644
--- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt
+++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.kt
@@ -127,5 +127,7 @@ class DeserializedDescriptorResolver {
private val KOTLIN_1_1_EAP_METADATA_VERSION = JvmMetadataVersion(1, 1, 2)
private val KOTLIN_1_3_M1_METADATA_VERSION = JvmMetadataVersion(1, 1, 11)
+
+ internal val KOTLIN_1_3_RC_METADATA_VERSION = JvmMetadataVersion(1, 1, 13)
}
}
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 03753054cbc..148acfc05db 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
@@ -104,14 +104,16 @@ object JvmProtoBufUtil {
fun getJvmFieldSignature(
proto: ProtoBuf.Property,
nameResolver: NameResolver,
- typeTable: TypeTable
+ typeTable: TypeTable,
+ requireHasFieldFlag: Boolean = true
): JvmMemberSignature.Field? {
val signature = proto.getExtensionOrNull(JvmProtoBuf.propertySignature) ?: return null
- val field = if (signature.hasField()) signature.field else return null
+ val field = if (signature.hasField()) signature.field else null
+ if (field == null && requireHasFieldFlag) return null
- val name = if (field.hasName()) field.name else proto.name
+ val name = if (field != null && field.hasName()) field.name else proto.name
val desc =
- if (field.hasDesc()) nameResolver.getString(field.desc)
+ if (field != null && field.hasDesc()) nameResolver.getString(field.desc)
else mapTypeDefault(proto.returnType(typeTable), nameResolver) ?: return null
return JvmMemberSignature.Field(nameResolver.getString(name), desc)
diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt
index d6ab3041893..84b512a1980 100644
--- a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt
+++ b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt
@@ -35,6 +35,9 @@ abstract class BinaryVersion(private vararg val numbers: Int) {
else major == ourVersion.major && minor <= ourVersion.minor
}
+ fun isAtLeast(version: BinaryVersion): Boolean =
+ isAtLeast(version.major, version.minor, version.patch)
+
fun isAtLeast(major: Int, minor: Int, patch: Int): Boolean {
if (this.major > major) return true
if (this.major < major) return false