diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index ecbae742812..1611f303aeb 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.serialization.deserialization.ProtoEnumFlags import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.serialization.deserialization.getName +import org.jetbrains.kotlin.serialization.deserialization.loadValueClassRepresentation fun deserializeClassToSymbol( classId: ClassId, @@ -203,27 +204,31 @@ fun deserializeClassToSymbol( companionObjectSymbol = (declarations.firstOrNull { it is FirRegularClass && it.isCompanion } as FirRegularClass?)?.symbol contextReceivers.addAll(classDeserializer.createContextReceiversForClass(classProto)) - }.also { + }.apply { if (isSealed) { val inheritors = classProto.sealedSubclassFqNameList.map { 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) += + (annotations as MutableList) += 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 -> - it.moduleName = nameResolver.getString(idx) + moduleName = nameResolver.getString(idx) } } } diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt index fad97dd85a0..637821f6eb6 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirTypeDeserializer.kt @@ -113,7 +113,7 @@ class FirTypeDeserializer( } } - private fun attributesFromAnnotations(proto: ProtoBuf.Type) = + private fun attributesFromAnnotations(proto: ProtoBuf.Type): ConeAttributes = annotationDeserializer.loadTypeAnnotations(proto, nameResolver) .computeTypeAttributes(moduleData.session) @@ -121,6 +121,11 @@ class FirTypeDeserializer( 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 { if (proto.hasFlexibleTypeCapabilitiesId()) { val lowerBound = simpleType(proto, attributes)