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
|
package org.jetbrains.kotlin.backend.konan.objcexport
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
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.getPackageFragments
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
|
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.getReceiverTypeFromFunctionType
|
||||||
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
|
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
|
||||||
import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType
|
import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType
|
||||||
import org.jetbrains.kotlin.builtins.isFunctionType
|
import org.jetbrains.kotlin.builtins.isFunctionType
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
|
import org.jetbrains.kotlin.resolve.descriptorUtil.*
|
||||||
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.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
@@ -120,6 +119,11 @@ internal class ObjCExportHeaderGenerator(val context: Context) {
|
|||||||
val descriptorToName = if (descriptor.isInterface) interfaceToName else classToName
|
val descriptorToName = if (descriptor.isInterface) interfaceToName else classToName
|
||||||
|
|
||||||
return descriptorToName.getOrPut(descriptor) {
|
return descriptorToName.getOrPut(descriptor) {
|
||||||
|
if (!mapper.shouldBeExposed(descriptor)) {
|
||||||
|
context.reportCompilationError("Can't produce ${descriptor.fqNameSafe.asString()} to framework API")
|
||||||
|
throw KonanCompilationException()
|
||||||
|
}
|
||||||
|
|
||||||
namer.getClassOrProtocolName(descriptor)
|
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.common.descriptors.isSuspend
|
||||||
import org.jetbrains.kotlin.backend.konan.ValueType
|
import org.jetbrains.kotlin.backend.konan.ValueType
|
||||||
import org.jetbrains.kotlin.backend.konan.correspondingValueType
|
import org.jetbrains.kotlin.backend.konan.correspondingValueType
|
||||||
|
import org.jetbrains.kotlin.backend.konan.isObjCObjectType
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPublicApi
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPublicApi
|
||||||
@@ -50,7 +51,10 @@ internal fun ObjCExportMapper.shouldBeExposed(descriptor: CallableMemberDescript
|
|||||||
descriptor.isEffectivelyPublicApi && !descriptor.isSuspend
|
descriptor.isEffectivelyPublicApi && !descriptor.isSuspend
|
||||||
|
|
||||||
internal fun ObjCExportMapper.shouldBeExposed(descriptor: ClassDescriptor): Boolean =
|
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 =
|
private fun ObjCExportMapper.isBase(descriptor: CallableMemberDescriptor): Boolean =
|
||||||
descriptor.overriddenDescriptors.all { !shouldBeExposed(it) }
|
descriptor.overriddenDescriptors.all { !shouldBeExposed(it) }
|
||||||
@@ -117,7 +121,7 @@ private fun ObjCExportMapper.bridgeType(kotlinType: KotlinType): TypeBridge {
|
|||||||
?: return ReferenceBridge
|
?: return ReferenceBridge
|
||||||
|
|
||||||
val objCValueType = ObjCValueType.values().singleOrNull { it.kotlinValueType == valueType }
|
val objCValueType = ObjCValueType.values().singleOrNull { it.kotlinValueType == valueType }
|
||||||
?: error(valueType)
|
?: error("Can't produce $kotlinType to framework API")
|
||||||
|
|
||||||
return ValueTypeBridge(objCValueType)
|
return ValueTypeBridge(objCValueType)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user