diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 647f996059e..9744fdf2d65 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -246,16 +246,16 @@ class DeserializedClassDescriptor( return super.getContributedVariables(name, location) } + override fun isDeclaredFunctionAvailable(function: SimpleFunctionDescriptor): Boolean { + return c.components.platformDependentDeclarationFilter.isFunctionAvailable(this@DeserializedClassDescriptor, function) + } + override fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection) { val fromSupertypes = ArrayList() for (supertype in refinedSupertypes()) { fromSupertypes.addAll(supertype.memberScope.getContributedFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED)) } - functions.retainAll { - c.components.platformDependentDeclarationFilter.isFunctionAvailable(this@DeserializedClassDescriptor, it) - } - functions.addAll(c.components.additionalClassPartsProvider.getFunctions(name, this@DeserializedClassDescriptor)) generateFakeOverrides(name, fromSupertypes, functions) } 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 349f88c13a9..a536b3e8f1a 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 @@ -35,7 +35,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.compact import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream -import java.util.* +import kotlin.collections.ArrayList abstract class DeserializedMemberScope protected constructor( protected val c: DeserializationContext, @@ -104,7 +104,7 @@ abstract class DeserializedMemberScope protected constructor( name, functionProtosBytes, ProtoBuf.Function.PARSER, - { c.memberDeserializer.loadFunction(it) }, + { c.memberDeserializer.loadFunction(it).takeIf(::isDeclaredFunctionAvailable) }, { computeNonDeclaredFunctions(name, it) } ) @@ -112,7 +112,7 @@ abstract class DeserializedMemberScope protected constructor( name: Name, bytesByName: Map, parser: Parser, - factory: (M) -> D, + factory: (M) -> D?, computeNonDeclared: (MutableCollection) -> Unit ): Collection = computeDescriptors( @@ -128,15 +128,20 @@ abstract class DeserializedMemberScope protected constructor( private inline fun computeDescriptors( protos: Collection, - factory: (M) -> D, + factory: (M) -> D?, computeNonDeclared: (MutableCollection) -> Unit ): Collection { - val descriptors = protos.mapTo(arrayListOf(), factory) + val descriptors = protos.mapNotNullTo(ArrayList(protos.size), factory) computeNonDeclared(descriptors) return descriptors.compact() } + /** + * Can be overridden to filter specific declared functions. Not called on non-declared functions. + */ + protected open fun isDeclaredFunctionAvailable(function: SimpleFunctionDescriptor): Boolean = true + protected open fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection) { }