diff --git a/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanFakeOverrideClassFilter.kt b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanFakeOverrideClassFilter.kt new file mode 100644 index 00000000000..1f8d72b6e09 --- /dev/null +++ b/compiler/ir/serialization.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanFakeOverrideClassFilter.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.konan.serialization + +import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideClassFilter +import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass +import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrPublicSymbolBase +import org.jetbrains.kotlin.ir.types.classOrNull +import org.jetbrains.kotlin.ir.util.IdSignature + +object KonanFakeOverrideClassFilter : FakeOverrideClassFilter { + private fun IdSignature.isInteropSignature(): Boolean = with(this) { + IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY.test() + } + + @OptIn(ObsoleteDescriptorBasedAPI::class) + private fun IrClassSymbol.isInterop(): Boolean { + if (this is IrPublicSymbolBase<*> && this.signature.isInteropSignature()) return true + + // K2 doesn't properly put signatures into such symbols yet, workaround: + return this.isBound && this.owner is Fir2IrLazyClass && this.owner.isFromInteropLibraryByDescriptor() + } + + // This is an alternative to .isObjCClass that doesn't need to walk up all the class heirarchy, + // rather it only looks at immediate super class symbols. + private fun IrClass.hasInteropSuperClass() = this.superTypes + .mapNotNull { it.classOrNull } + .any { it.isInterop() } + + override fun needToConstructFakeOverrides(clazz: IrClass): Boolean { + return !clazz.hasInteropSuperClass() && clazz !is IrLazyClass + } +} diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt index 29ac81da738..e43e84476cd 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrLinker.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.backend.konan.serialization import org.jetbrains.kotlin.backend.common.linkage.issues.UserVisibleIrModulesSupport import org.jetbrains.kotlin.backend.common.linkage.partial.PartialLinkageSupportForLinker -import org.jetbrains.kotlin.backend.common.overrides.FakeOverrideClassFilter import org.jetbrains.kotlin.backend.common.overrides.IrLinkerFakeOverrideProvider import org.jetbrains.kotlin.backend.common.serialization.* import org.jetbrains.kotlin.backend.konan.CacheDeserializationStrategy @@ -29,17 +28,12 @@ import org.jetbrains.kotlin.backend.konan.ir.interop.IrProviderForCEnumAndCStruc import org.jetbrains.kotlin.backend.konan.ir.konanLibrary import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.konan.isNativeStdlib -import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass import org.jetbrains.kotlin.ir.overrides.IrExternalOverridabilityCondition -import org.jetbrains.kotlin.ir.symbols.IrClassSymbol -import org.jetbrains.kotlin.ir.symbols.impl.IrPublicSymbolBase import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl -import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.encodings.WobblyTF8 @@ -264,30 +258,6 @@ internal object EagerInitializedPropertySerializer { } } -object KonanFakeOverrideClassFilter : FakeOverrideClassFilter { - private fun IdSignature.isInteropSignature(): Boolean = with(this) { - IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY.test() - } - - @OptIn(ObsoleteDescriptorBasedAPI::class) - private fun IrClassSymbol.isInterop(): Boolean { - if (this is IrPublicSymbolBase<*> && this.signature.isInteropSignature()) return true - - // K2 doesn't properly put signatures into such symbols yet, workaround: - return this.isBound && this.owner is Fir2IrLazyClass && this.owner.isFromInteropLibraryByDescriptor() - } - - // This is an alternative to .isObjCClass that doesn't need to walk up all the class heirarchy, - // rather it only looks at immediate super class symbols. - private fun IrClass.hasInteropSuperClass() = this.superTypes - .mapNotNull { it.classOrNull } - .any { it.isInterop() } - - override fun needToConstructFakeOverrides(clazz: IrClass): Boolean { - return !clazz.hasInteropSuperClass() && clazz !is IrLazyClass - } -} - internal data class DeserializedInlineFunction(val firstAccess: Boolean, val function: InlineFunctionOriginInfo) @OptIn(ObsoleteDescriptorBasedAPI::class)