[ObjCExport] Initial implementation of function type translation

^KT-65167
This commit is contained in:
Sebastian Sellmair
2024-01-24 16:17:09 +01:00
committed by Space Team
parent 3766a5f2ad
commit c958aef679
3 changed files with 36 additions and 6 deletions
@@ -111,7 +111,7 @@ private fun bridgeFunctionType(type: KtType): TypeBridge {
if (type is KtFunctionalType) {
numberOfParameters = type.parameterTypes.size
returnType = type.parameterTypes.last()
returnType = type.returnType
} else {
numberOfParameters = 0
returnType = type
@@ -1,11 +1,18 @@
@file:Suppress("UNUSED_PARAMETER")
package org.jetbrains.kotlin.objcexport
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.backend.konan.objcexport.BlockPointerBridge
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCReferenceType
import org.jetbrains.kotlin.backend.konan.objcexport.*
context(KtAnalysisSession, KtObjCExportSession)
internal fun KtType.translateToObjCFunctionType(typeBridge: BlockPointerBridge): ObjCReferenceType {
TODO()
if (this !is KtFunctionalType) return ObjCIdType
return ObjCBlockPointerType(
returnType = if (typeBridge.returnsVoid) ObjCVoidType else returnType.translateToObjCReferenceType(),
parameterTypes = listOfNotNull(this.receiverType).plus(this.parameterTypes).map { parameterType ->
parameterType.translateToObjCReferenceType()
}
)
}
@@ -69,6 +69,29 @@ class ObjCExportTypeTranslationTest(
assertEquals("A *, B * _Nullable -> C * _Nullable", header.renderTypesOfSymbol("foo"))
}
@Test
fun `test - Unit as return type`() {
val header = header(
"""
fun foo() = Unit
""".trimIndent()
)
assertEquals(" -> void", header.renderTypesOfSymbol("foo"))
}
@Test
fun `test - Unit as parameter type`() {
val header = header(
"""
fun foo(unit: Unit) = Unit
""".trimIndent()
)
assertEquals("Unit * -> void", header.renderTypesOfSymbol("foo"))
}
@Test
fun `test - hiddenTypes - Any - are exposed as id`() {
val header = header("""fun foo(): Any""")