From a6a27466fcef8ac06706fa02c9e2481bef1f7cdb Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Tue, 23 Jan 2024 16:50:33 +0100 Subject: [PATCH] [ObjCExport] Fix emission of 'ValueTypeBridge' for 'non primitive' types ^KT-65167 --- .../analysisApiUtils/getMethodBridge.kt | 50 +++++++++---------- .../objcexport/translateToObjCMethod.kt | 32 ++++++------ 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt index 4e364e54393..d9574284778 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt @@ -68,32 +68,32 @@ private fun bridgeType( type: KtType, ): TypeBridge { - return if (type.isPrimitive) { - val objCType = when { - type.isBoolean -> ObjCValueType.BOOL - type.isChar -> ObjCValueType.UNICHAR - type.isByte -> ObjCValueType.CHAR - type.isShort -> ObjCValueType.SHORT - type.isInt -> ObjCValueType.INT - type.isLong -> ObjCValueType.LONG_LONG - type.isFloat -> ObjCValueType.FLOAT - type.isDouble -> ObjCValueType.DOUBLE - type.isUByte -> ObjCValueType.UNSIGNED_CHAR - type.isUShort -> ObjCValueType.UNSIGNED_SHORT - type.isUInt -> ObjCValueType.UNSIGNED_INT - type.isULong -> ObjCValueType.UNSIGNED_LONG_LONG - else -> - /** - * Handle [KonanPrimitiveType.NON_NULL_NATIVE_PTR] and [KonanPrimitiveType.VECTOR128] - */ - TODO() - } - ValueTypeBridge(objCType) - } else if (type.isFunctionType) { - bridgeFunctionType(type) - } else { - ReferenceBridge + val primitiveObjCValueType = when { + type.isBoolean -> ObjCValueType.BOOL + type.isChar -> ObjCValueType.UNICHAR + type.isByte -> ObjCValueType.CHAR + type.isShort -> ObjCValueType.SHORT + type.isInt -> ObjCValueType.INT + type.isLong -> ObjCValueType.LONG_LONG + type.isFloat -> ObjCValueType.FLOAT + type.isDouble -> ObjCValueType.DOUBLE + type.isUByte -> ObjCValueType.UNSIGNED_CHAR + type.isUShort -> ObjCValueType.UNSIGNED_SHORT + type.isUInt -> ObjCValueType.UNSIGNED_INT + type.isULong -> ObjCValueType.UNSIGNED_LONG_LONG + type.isClassTypeWithClassId(KonanPrimitiveType.NON_NULL_NATIVE_PTR.classId) -> ObjCValueType.POINTER + else -> null } + + if (primitiveObjCValueType != null) { + return ValueTypeBridge(primitiveObjCValueType) + } + + if (type.isFunctionType) { + return bridgeFunctionType(type) + } + + return ReferenceBridge } /** diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt index f66e8264006..69881868595 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt @@ -361,24 +361,20 @@ private fun KtType.mapType(typeBridge: TypeBridge): ObjCType { return when (typeBridge) { is ReferenceBridge -> this.translateToObjCReferenceType() is BlockPointerBridge -> this.translateToObjCFunctionType(typeBridge) - is ValueTypeBridge -> { - when { - isBoolean -> ObjCPrimitiveType.BOOL - isChar -> ObjCPrimitiveType.int8_t - isByte -> ObjCPrimitiveType.char - isShort -> ObjCPrimitiveType.int16_t - isInt -> ObjCPrimitiveType.int32_t - isLong -> ObjCPrimitiveType.long_long - isFloat -> ObjCPrimitiveType.float - isDouble -> ObjCPrimitiveType.double - isUByte -> ObjCPrimitiveType.unsigned_char - isUShort -> ObjCPrimitiveType.unsigned_short - isUInt -> ObjCPrimitiveType.unsigned_int - isULong -> ObjCPrimitiveType.unsigned_long_long - - - else -> TODO("Handle primitive KtType mapping to ObjCType: $this") - } + is ValueTypeBridge -> when (typeBridge.objCValueType) { + ObjCValueType.BOOL -> ObjCPrimitiveType.BOOL + ObjCValueType.UNICHAR -> ObjCPrimitiveType.unichar + ObjCValueType.CHAR -> ObjCPrimitiveType.int8_t + ObjCValueType.SHORT -> ObjCPrimitiveType.int16_t + ObjCValueType.INT -> ObjCPrimitiveType.int32_t + ObjCValueType.LONG_LONG -> ObjCPrimitiveType.int64_t + ObjCValueType.UNSIGNED_CHAR -> ObjCPrimitiveType.uint8_t + ObjCValueType.UNSIGNED_SHORT -> ObjCPrimitiveType.uint16_t + ObjCValueType.UNSIGNED_INT -> ObjCPrimitiveType.uint32_t + ObjCValueType.UNSIGNED_LONG_LONG -> ObjCPrimitiveType.uint64_t + ObjCValueType.FLOAT -> ObjCPrimitiveType.float + ObjCValueType.DOUBLE -> ObjCPrimitiveType.double + ObjCValueType.POINTER -> ObjCPointerType(ObjCVoidType, this.isMarkedNullable) } } }