Don't expose special classes when producing frameworks
* Kotlin annotation classes; * Enum entry classes; * Interop types.
This commit is contained in:
committed by
SvyatoslavScherbina
parent
8b6d3c0a69
commit
cf076ffff0
+8
-4
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+6
-2
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user