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 a50a6052570..527ef5b17e3 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 @@ -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 diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCFunctionType.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCFunctionType.kt index 5d9a88685cb..6e919473948 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCFunctionType.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCFunctionType.kt @@ -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() + } + ) } diff --git a/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportTypeTranslationTest.kt b/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportTypeTranslationTest.kt index 9ea5fe8424a..06c8205f71e 100644 --- a/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportTypeTranslationTest.kt +++ b/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportTypeTranslationTest.kt @@ -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""")