Don't expose special classes when producing frameworks

* Kotlin annotation classes;
* Enum entry classes;
* Interop types.
This commit is contained in:
Svyatoslav Scherbina
2017-12-06 17:31:36 +03:00
committed by SvyatoslavScherbina
parent 8b6d3c0a69
commit cf076ffff0
2 changed files with 14 additions and 6 deletions
@@ -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)
}
}
@@ -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)
}