diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt index 1aaaadc784d..6cd5cd68311 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt @@ -220,15 +220,19 @@ abstract class ObjCExportHeaderGenerator( getContributedDescriptors() .asSequence() .filterIsInstance() - .filter { mapper.shouldBeExposed(it) } .forEach { - if (it.isInterface) { - translateInterface(it) - } else { - translateClass(it) - } + if (mapper.shouldBeExposed(it)) { + if (it.isInterface) { + translateInterface(it) + } else { + translateClass(it) + } - it.unsubstitutedMemberScope.translateClasses() + it.unsubstitutedMemberScope.translateClasses() + } else if (it.isKotlinObjCClass() && mapper.shouldBeVisible(it)) { + assert(!it.isInterface) + translateKotlinObjCClassAsUnavailableStub(it) + } } } @@ -257,6 +261,16 @@ abstract class ObjCExportHeaderGenerator( return stubs } + private fun translateKotlinObjCClassAsUnavailableStub(descriptor: ClassDescriptor) { + stubs.add(objCInterface( + namer.getClassOrProtocolName(descriptor), + descriptor = descriptor, + superClass = "NSObject", + attributes = listOf("unavailable(\"Kotlin subclass of Objective-C class can't be imported\")") + + )) + } + private fun genKotlinNumbers() { val members = buildMembers { NSNumberKind.values().forEach { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportMapper.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportMapper.kt index a070703c84b..66bfecd368c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportMapper.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportMapper.kt @@ -54,10 +54,13 @@ internal fun ObjCExportMapper.shouldBeExposed(descriptor: CallableMemberDescript descriptor.isEffectivelyPublicApi && !descriptor.isSuspend && !descriptor.isExpect internal fun ObjCExportMapper.shouldBeExposed(descriptor: ClassDescriptor): Boolean = - descriptor.isEffectivelyPublicApi && !descriptor.defaultType.isObjCObjectType() && when (descriptor.kind) { - ClassKind.CLASS, ClassKind.INTERFACE, ClassKind.ENUM_CLASS, ClassKind.OBJECT -> true - ClassKind.ENUM_ENTRY, ClassKind.ANNOTATION_CLASS -> false - } && !descriptor.isExpect && !isSpecialMapped(descriptor) && !descriptor.isInlined() + shouldBeVisible(descriptor) && !descriptor.defaultType.isObjCObjectType() + +internal fun ObjCExportMapper.shouldBeVisible(descriptor: ClassDescriptor): Boolean = + descriptor.isEffectivelyPublicApi && when (descriptor.kind) { + ClassKind.CLASS, ClassKind.INTERFACE, ClassKind.ENUM_CLASS, ClassKind.OBJECT -> true + ClassKind.ENUM_ENTRY, ClassKind.ANNOTATION_CLASS -> false + } && !descriptor.isExpect && !isSpecialMapped(descriptor) && !descriptor.isInlined() private fun ObjCExportMapper.isBase(descriptor: CallableMemberDescriptor): Boolean = descriptor.overriddenDescriptors.all { !shouldBeExposed(it) }