FIR: deserialize value class representation from metadata

This is necessary when jvm-abi-gen strips out private constructors.
#KT-54897 Fixed
This commit is contained in:
pyos
2022-11-09 17:42:04 +01:00
committed by Space Team
parent af2b77dd4e
commit f745d0db0e
2 changed files with 19 additions and 9 deletions
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.name.*
import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.serialization.deserialization.getName
import org.jetbrains.kotlin.serialization.deserialization.loadValueClassRepresentation
fun deserializeClassToSymbol( fun deserializeClassToSymbol(
classId: ClassId, classId: ClassId,
@@ -203,27 +204,31 @@ fun deserializeClassToSymbol(
companionObjectSymbol = (declarations.firstOrNull { it is FirRegularClass && it.isCompanion } as FirRegularClass?)?.symbol companionObjectSymbol = (declarations.firstOrNull { it is FirRegularClass && it.isCompanion } as FirRegularClass?)?.symbol
contextReceivers.addAll(classDeserializer.createContextReceiversForClass(classProto)) contextReceivers.addAll(classDeserializer.createContextReceiversForClass(classProto))
}.also { }.apply {
if (isSealed) { if (isSealed) {
val inheritors = classProto.sealedSubclassFqNameList.map { nameIndex -> val inheritors = classProto.sealedSubclassFqNameList.map { nameIndex ->
ClassId.fromString(nameResolver.getQualifiedClassName(nameIndex)) ClassId.fromString(nameResolver.getQualifiedClassName(nameIndex))
} }
it.setSealedClassInheritors(inheritors) setSealedClassInheritors(inheritors)
} }
it.valueClassRepresentation = computeValueClassRepresentation(it, session) valueClassRepresentation =
classProto.loadValueClassRepresentation(context.nameResolver, context.typeTable, context.typeDeserializer::simpleType) { name ->
val member = declarations.singleOrNull { it is FirProperty && it.receiverTypeRef == null && it.name == name }
(member as FirProperty?)?.returnTypeRef?.coneTypeSafe()
} ?: computeValueClassRepresentation(this, session)
(it.annotations as MutableList<FirAnnotation>) += (annotations as MutableList<FirAnnotation>) +=
context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver) context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
it.versionRequirementsTable = context.versionRequirementTable versionRequirementsTable = context.versionRequirementTable
it.sourceElement = containerSource sourceElement = containerSource
it.replaceDeprecationsProvider(it.getDeprecationsProvider(session.firCachesFactory)) replaceDeprecationsProvider(getDeprecationsProvider(session.firCachesFactory))
classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let { idx -> classProto.getExtensionOrNull(JvmProtoBuf.classModuleName)?.let { idx ->
it.moduleName = nameResolver.getString(idx) moduleName = nameResolver.getString(idx)
} }
} }
} }
@@ -113,7 +113,7 @@ class FirTypeDeserializer(
} }
} }
private fun attributesFromAnnotations(proto: ProtoBuf.Type) = private fun attributesFromAnnotations(proto: ProtoBuf.Type): ConeAttributes =
annotationDeserializer.loadTypeAnnotations(proto, nameResolver) annotationDeserializer.loadTypeAnnotations(proto, nameResolver)
.computeTypeAttributes(moduleData.session) .computeTypeAttributes(moduleData.session)
@@ -121,6 +121,11 @@ class FirTypeDeserializer(
return type(proto, attributesFromAnnotations(proto)) return type(proto, attributesFromAnnotations(proto))
} }
fun simpleType(proto: ProtoBuf.Type): ConeSimpleKotlinType {
return simpleType(proto, attributesFromAnnotations(proto))
?: ConeErrorType(ConeSimpleDiagnostic("?!id:0", DiagnosticKind.DeserializationError))
}
private fun type(proto: ProtoBuf.Type, attributes: ConeAttributes): ConeKotlinType { private fun type(proto: ProtoBuf.Type, attributes: ConeAttributes): ConeKotlinType {
if (proto.hasFlexibleTypeCapabilitiesId()) { if (proto.hasFlexibleTypeCapabilitiesId()) {
val lowerBound = simpleType(proto, attributes) val lowerBound = simpleType(proto, attributes)