diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt index 17e80a0dfe8..3383a0ac762 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt @@ -68,14 +68,25 @@ abstract class DeserializedMemberScope protected constructor( getNameIndex: (M) -> Int ) = groupBy { c.nameResolver.getName(getNameIndex(it)) } - private fun computeFunctions(name: Name): Collection { - val protos = functionProtos[name].orEmpty() + private fun computeFunctions(name: Name) = + computeDescriptors( + name, + functionProtos, + { c.memberDeserializer.loadFunction(it) }, + { computeNonDeclaredFunctions(name, it)} + ) - val descriptors = protos.mapTo(linkedSetOf()) { - c.memberDeserializer.loadFunction(it) - } + inline private fun computeDescriptors( + name: Name, + protosByName: Map>, + factory: (M) -> D, + computeNonDeclared: (MutableCollection) -> Unit + ): Collection { + val protos = protosByName[name].orEmpty() - computeNonDeclaredFunctions(name, descriptors) + val descriptors = protos.mapTo(linkedSetOf(), factory) + + computeNonDeclared(descriptors) return descriptors.toReadOnlyList() } @@ -84,28 +95,23 @@ abstract class DeserializedMemberScope protected constructor( override fun getContributedFunctions(name: Name, location: LookupLocation): Collection = functions(name) - private fun computeProperties(name: Name): Collection { - val protos = propertyProtos[name].orEmpty() - - val descriptors = protos.mapTo(linkedSetOf()) { - c.memberDeserializer.loadProperty(it) - } - - computeNonDeclaredProperties(name, descriptors) - return descriptors.toReadOnlyList() - } + private fun computeProperties(name: Name) = + computeDescriptors( + name, + propertyProtos, + { c.memberDeserializer.loadProperty(it) }, + { computeNonDeclaredProperties(name, it) } + ) protected open fun computeNonDeclaredProperties(name: Name, descriptors: MutableCollection) { } - private fun computeTypeAliases(name: Name): Collection { - val protos = typeAliasProtos[name] ?: return emptyList() - val descriptors = protos.mapTo(linkedSetOf()) { - c.memberDeserializer.loadTypeAlias(it) - } - - return descriptors.toReadOnlyList() - } + private fun computeTypeAliases(name: Name) = + computeDescriptors( + name, + typeAliasProtos, + { c.memberDeserializer.loadTypeAlias(it) }, + { }) override fun getContributedVariables(name: Name, location: LookupLocation): Collection = properties(name)