From 676d65e71c94f2866e4083cb31211b6f77a59bfe Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Thu, 12 Jan 2023 18:44:18 +0100 Subject: [PATCH] K2: fix fake override IR serialization for subclasses of Obj-C classes --- .../backend/konan/serialization/KonanIrlinker.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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 104311043e1..78463bebaf4 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 @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.library.metadata.DeserializedKlibModuleOrigin import org.jetbrains.kotlin.library.metadata.klibModuleOrigin 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.builders.TranslationPluginContext import org.jetbrains.kotlin.ir.declarations.* @@ -314,12 +315,18 @@ object KonanFakeOverrideClassFilter : FakeOverrideClassFilter { IdSignature.Flags.IS_NATIVE_INTEROP_LIBRARY.test() } + 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.descriptor.isFromInteropLibrary() + } + // 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 } - .filter { it is IrPublicSymbolBase<*> } - .any { it.signature?.isInteropSignature() ?: false } + .any { it.isInterop() } override fun needToConstructFakeOverrides(clazz: IrClass): Boolean { return !clazz.hasInteropSuperClass() && clazz !is IrLazyClass