From 87e162e052e195a65bb74a067e8aadbb597f8f8b Mon Sep 17 00:00:00 2001 From: "eugene.levenetc" Date: Fri, 23 Feb 2024 18:17:50 +0100 Subject: [PATCH] [ObjCExport] Add nullable dependency parameter failing test KT-66068 --- .../objcexport/extras/requiresForwardDeclaration.kt | 9 ++++++++- .../jetbrains/kotlin/objcexport/translateToObjCHeader.kt | 7 ++++--- .../konan/tests/ObjCExportForwardDeclarationsTest.kt | 5 +++++ .../forwardDeclarations/nullableType/!nullableType.h | 3 +++ .../testData/forwardDeclarations/nullableType/Foo.kt | 6 ++++++ 5 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 native/objcexport-header-generator/testData/forwardDeclarations/nullableType/!nullableType.h create mode 100644 native/objcexport-header-generator/testData/forwardDeclarations/nullableType/Foo.kt diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/extras/requiresForwardDeclaration.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/extras/requiresForwardDeclaration.kt index 4981571ed04..000ac88e788 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/extras/requiresForwardDeclaration.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/extras/requiresForwardDeclaration.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.objcexport.extras +import org.jetbrains.kotlin.backend.konan.objcexport.ObjCNonNullReferenceType +import org.jetbrains.kotlin.backend.konan.objcexport.ObjCNullableReferenceType import org.jetbrains.kotlin.backend.konan.objcexport.ObjCReferenceType import org.jetbrains.kotlin.tooling.core.MutableExtras import org.jetbrains.kotlin.tooling.core.extrasKeyOf @@ -16,7 +18,12 @@ private val requiresForwardDeclarationKey = extrasKeyOf("isForwardDecla * - Default value: `false`. * - Example: All types used in function and method signature are expected to render forward declarations */ -internal val ObjCReferenceType.requiresForwardDeclaration: Boolean get() = extras[requiresForwardDeclarationKey] ?: false +internal val ObjCReferenceType.requiresForwardDeclaration: Boolean + get() = + when (this) { + is ObjCNonNullReferenceType -> extras[requiresForwardDeclarationKey] ?: false + is ObjCNullableReferenceType -> extras[requiresForwardDeclarationKey] ?: nonNullType.requiresForwardDeclaration + } /** * ⚠️ Marks [this] [ObjCReferenceType] as 'requires forward declaration' and returns the same instance. diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCHeader.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCHeader.kt index bb3beaa7fc6..b8bd278b375 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCHeader.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCHeader.kt @@ -193,8 +193,9 @@ private class KtObjCExportHeaderGenerator { .filterIsInstance() .onEach { type -> if (!type.requiresForwardDeclaration) return@onEach - if (type is ObjCClassType) objCClassForwardDeclarations += type.className - if (type is ObjCProtocolType) objCProtocolForwardDeclarations += type.protocolName + val nonNullType = if (type is ObjCNullableReferenceType) type.nonNullType else type + if (nonNullType is ObjCClassType) objCClassForwardDeclarations += nonNullType.className + if (nonNullType is ObjCProtocolType) objCProtocolForwardDeclarations += nonNullType.protocolName } .mapNotNull { it.originClassId } .map(QueueElement::Class).toList() @@ -237,4 +238,4 @@ private class KtObjCExportHeaderGenerator { additionalImports = emptyList() ) } -} +} \ No newline at end of file diff --git a/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportForwardDeclarationsTest.kt b/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportForwardDeclarationsTest.kt index e8d4943d677..a205e324ef0 100644 --- a/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportForwardDeclarationsTest.kt +++ b/native/objcexport-header-generator/test/org/jetbrains/kotlin/backend/konan/tests/ObjCExportForwardDeclarationsTest.kt @@ -36,6 +36,11 @@ class ObjCExportForwardDeclarationsTest( doTest(forwardDeclarationsDir.resolve("propertyReturningClass")) } + @Test + fun `test - nullable type`() { + doTest(forwardDeclarationsDir.resolve("nullableType")) + } + private fun doTest(root: File) { if (!root.isDirectory) fail("Expected ${root.absolutePath} to be directory") val generatedHeaders = generator.generateHeaders(root) diff --git a/native/objcexport-header-generator/testData/forwardDeclarations/nullableType/!nullableType.h b/native/objcexport-header-generator/testData/forwardDeclarations/nullableType/!nullableType.h new file mode 100644 index 00000000000..3e5a89836c7 --- /dev/null +++ b/native/objcexport-header-generator/testData/forwardDeclarations/nullableType/!nullableType.h @@ -0,0 +1,3 @@ +@class LongIterator, DoubleIterator, IntIterator; + +@protocol Iterator; diff --git a/native/objcexport-header-generator/testData/forwardDeclarations/nullableType/Foo.kt b/native/objcexport-header-generator/testData/forwardDeclarations/nullableType/Foo.kt new file mode 100644 index 00000000000..49d2fd9148d --- /dev/null +++ b/native/objcexport-header-generator/testData/forwardDeclarations/nullableType/Foo.kt @@ -0,0 +1,6 @@ +class Foo { + fun foo(iterator: DoubleIterator? = null) = Unit + fun foo(): LongIterator? = null +} + +var prop: IntIterator? = null \ No newline at end of file