From cf076ffff01057a3cba94b7eaa7ef539aff3179c Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 6 Dec 2017 17:31:36 +0300 Subject: [PATCH] Don't expose special classes when producing frameworks * Kotlin annotation classes; * Enum entry classes; * Interop types. --- .../konan/objcexport/ObjCExportHeaderGenerator.kt | 12 ++++++++---- .../backend/konan/objcexport/ObjCExportMapper.kt | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) 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 50756873f30..7374816a491 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 @@ -17,18 +17,17 @@ package org.jetbrains.kotlin.backend.konan.objcexport import org.jetbrains.kotlin.backend.konan.Context +import org.jetbrains.kotlin.backend.konan.KonanCompilationException import org.jetbrains.kotlin.backend.konan.descriptors.getPackageFragments import org.jetbrains.kotlin.backend.konan.descriptors.isInterface +import org.jetbrains.kotlin.backend.konan.reportCompilationError import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny -import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces -import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf -import org.jetbrains.kotlin.resolve.descriptorUtil.module +import org.jetbrains.kotlin.resolve.descriptorUtil.* import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -120,6 +119,11 @@ internal class ObjCExportHeaderGenerator(val context: Context) { val descriptorToName = if (descriptor.isInterface) interfaceToName else classToName return descriptorToName.getOrPut(descriptor) { + if (!mapper.shouldBeExposed(descriptor)) { + context.reportCompilationError("Can't produce ${descriptor.fqNameSafe.asString()} to framework API") + throw KonanCompilationException() + } + namer.getClassOrProtocolName(descriptor) } } 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 580166e0553..783e93167af 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 @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.backend.common.descriptors.allParameters import org.jetbrains.kotlin.backend.common.descriptors.isSuspend import org.jetbrains.kotlin.backend.konan.ValueType import org.jetbrains.kotlin.backend.konan.correspondingValueType +import org.jetbrains.kotlin.backend.konan.isObjCObjectType import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPublicApi @@ -50,7 +51,10 @@ internal fun ObjCExportMapper.shouldBeExposed(descriptor: CallableMemberDescript descriptor.isEffectivelyPublicApi && !descriptor.isSuspend internal fun ObjCExportMapper.shouldBeExposed(descriptor: ClassDescriptor): Boolean = - descriptor.isEffectivelyPublicApi + 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 + } private fun ObjCExportMapper.isBase(descriptor: CallableMemberDescriptor): Boolean = descriptor.overriddenDescriptors.all { !shouldBeExposed(it) } @@ -117,7 +121,7 @@ private fun ObjCExportMapper.bridgeType(kotlinType: KotlinType): TypeBridge { ?: return ReferenceBridge val objCValueType = ObjCValueType.values().singleOrNull { it.kotlinValueType == valueType } - ?: error(valueType) + ?: error("Can't produce $kotlinType to framework API") return ValueTypeBridge(objCValueType) }