diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DeserializeDescriptorReference.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DeserializeDescriptorReference.kt index 5d1c8b04345..c473ecc6757 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DeserializeDescriptorReference.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/DeserializeDescriptorReference.kt @@ -14,45 +14,42 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ // Then the rest of the fields allow to find the needed descriptor relative to the one with index. class DescriptorReferenceDeserializer(val currentModule: ModuleDescriptor, val resolvedForwardDeclarations: MutableMap) { - private val cache = mutableMapOf>() + private fun getContributedDescriptors(packageFqNameString: String, name: String): Collection { + val packageFqName = packageFqNameString.let { + if (it == "") FqName.ROOT else FqName(it) + }// TODO: whould we store an empty string in the protobuf? - private fun getContributedDescriptors(packageFqNameString: String): Collection = - cache.getOrPut(packageFqNameString) { - val packageFqName = packageFqNameString.let { - if (it == "") FqName.ROOT else FqName(it) - }// TODO: whould we store an empty string in the protobuf? - - currentModule.getPackage(packageFqName).memberScope.getContributedDescriptors() - } - - private data class ClassName(val packageFqName: String, val classFqName: String) + val contributedName = if (name.startsWith(", val realMembers: Map) - private val membersCache = mutableMapOf() + private fun getMembers(members: Collection): ClassMembers { + val allMembersMap = mutableMapOf() + val realMembersMap = mutableMapOf() + var classConstructorDescriptor: ClassConstructorDescriptor? = null + members.forEach { member -> + if (member is ClassConstructorDescriptor) + classConstructorDescriptor = member + val realMembers = + if (member is CallableMemberDescriptor && member.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) + member.resolveFakeOverrideMaybeAbstract() + else + setOf(member) - private fun getMembers(packageFqNameString: String, classFqNameString: String, - members: Collection): ClassMembers = - membersCache.getOrPut(ClassName(packageFqNameString, classFqNameString)) { - val allMembersMap = mutableMapOf() - val realMembersMap = mutableMapOf() - var classConstructorDescriptor: ClassConstructorDescriptor? = null - members.forEach { member -> - if (member is ClassConstructorDescriptor) - classConstructorDescriptor = member - val realMembers = - if (member is CallableMemberDescriptor && member.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) - member.resolveFakeOverrideMaybeAbstract() - else - setOf(member) - - member.getUniqId()?.index?.let { allMembersMap[it] = member } - realMembers.mapNotNull { it.getUniqId()?.index }.forEach { realMembersMap[it] = member } - } - ClassMembers(classConstructorDescriptor, allMembersMap, realMembersMap) - } + member.getUniqId()?.index?.let { allMembersMap[it] = member } + realMembers.mapNotNull { it.getUniqId()?.index }.forEach { realMembersMap[it] = member } + } + return ClassMembers(classConstructorDescriptor, allMembersMap, realMembersMap) + } fun deserializeDescriptorReference( packageFqNameString: String, @@ -74,7 +71,7 @@ class DescriptorReferenceDeserializer(val currentModule: ModuleDescriptor, val r val protoIndex = index val (clazz, members) = if (classFqNameString == "") { - Pair(null, getContributedDescriptors(packageFqNameString)) + Pair(null, getContributedDescriptors(packageFqNameString, name)) } else { val clazz = currentModule.findClassAcrossModuleDependencies(ClassId(packageFqName, classFqName, false))!! Pair(clazz, clazz.unsubstitutedMemberScope.getContributedDescriptors() + clazz.getConstructors()) @@ -110,7 +107,7 @@ class DescriptorReferenceDeserializer(val currentModule: ModuleDescriptor, val r .getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).single() } - val membersWithIndices = getMembers(packageFqNameString, classFqNameString, members) + val membersWithIndices = getMembers(members) return when { isDefaultConstructor -> membersWithIndices.defaultConstructor