diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 826a435e447..82bc958715c 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -4477,6 +4477,9 @@ if (PlatformInfo.isAppleTarget(project)) { it.defFile 'interop/objc/include_categories/objc_include_categories.def' it.headers "$projectDir/interop/objc/include_categories/objc_include_categories.h" } + createInterop("frameworkForwardDeclarations") { + it.defFile 'framework/forwardDeclarations/clib.def' + } } createInterop("withSpaces") { @@ -6058,6 +6061,14 @@ if (isAppleTarget(project)) { } } } + + frameworkTest("testForwardDeclarationsFramework") { + framework('ForwardDeclarations') { + sources = ['framework/forwardDeclarations'] + library = 'frameworkForwardDeclarations' + } + swiftSources = ['framework/forwardDeclarations/'] + } } /** diff --git a/kotlin-native/backend.native/tests/framework/forwardDeclarations/clib.def b/kotlin-native/backend.native/tests/framework/forwardDeclarations/clib.def new file mode 100644 index 00000000000..6ad1483429d --- /dev/null +++ b/kotlin-native/backend.native/tests/framework/forwardDeclarations/clib.def @@ -0,0 +1,17 @@ +language=Objective-C +--- +struct ForwardDeclaredStruct; +@class ForwardDeclaredClass; +@protocol ForwardDeclaredProtocol; + +struct ForwardDeclaredStruct* sameStruct(struct ForwardDeclaredStruct* ptr) { + return ptr; +} + +ForwardDeclaredClass* sameClass(ForwardDeclaredClass* obj) { + return obj; +} + +id sameProtocol(id obj) { + return obj; +} diff --git a/kotlin-native/backend.native/tests/framework/forwardDeclarations/lib.kt b/kotlin-native/backend.native/tests/framework/forwardDeclarations/lib.kt new file mode 100644 index 00000000000..280403c5b4e --- /dev/null +++ b/kotlin-native/backend.native/tests/framework/forwardDeclarations/lib.kt @@ -0,0 +1,9 @@ +import clib.* +import cnames.structs.ForwardDeclaredStruct +import objcnames.classes.ForwardDeclaredClass +import objcnames.protocols.ForwardDeclaredProtocolProtocol +import kotlinx.cinterop.CPointer + +fun sameForwardDeclaredStruct(ptr: CPointer?): CPointer? = sameStruct(ptr) +fun sameForwardDeclaredClass(obj: ForwardDeclaredClass?): ForwardDeclaredClass? = sameClass(obj) +fun sameForwardDeclaredProtocol(obj: ForwardDeclaredProtocolProtocol?): ForwardDeclaredProtocolProtocol? = sameProtocol(obj) diff --git a/kotlin-native/backend.native/tests/framework/forwardDeclarations/test.swift b/kotlin-native/backend.native/tests/framework/forwardDeclarations/test.swift new file mode 100644 index 00000000000..1f965feda57 --- /dev/null +++ b/kotlin-native/backend.native/tests/framework/forwardDeclarations/test.swift @@ -0,0 +1,25 @@ +import ForwardDeclarations + +private func test1() throws { + let ptr = UnsafeMutableRawPointer(bitPattern: 0x1234) + try assertEquals(actual: LibKt.sameForwardDeclaredStruct(ptr: ptr), expected: ptr) + + // We can't actually test this, because Swift can't import neither types nor functions due to + // "interface/protocol '...' is incomplete": + // + // let classObj: ForwardDeclaredClass? = nil + // try assertNil(LibKt.sameForwardDeclaredClass(obj: classObj)) + // + // let protocolObj: ForwardDeclaredProtocol? = nil + // try assertNil(LibKt.sameForwardDeclaredProtocol(obj: protocolObj)) +} + +// -------- Execution of the test -------- + +class TestTests : SimpleTestProvider { + override init() { + super.init() + + test("test1", test1) + } +} diff --git a/kotlin-native/backend.native/tests/objcexport/expectedLazy.h b/kotlin-native/backend.native/tests/objcexport/expectedLazy.h index a2a7aa83b07..7c4b18d9a19 100644 --- a/kotlin-native/backend.native/tests/objcexport/expectedLazy.h +++ b/kotlin-native/backend.native/tests/objcexport/expectedLazy.h @@ -3081,8 +3081,6 @@ __attribute__((swift_name("ValuesKt"))) + (BOOL)isBlockNullBlock:(void (^ _Nullable)(void))block __attribute__((swift_name("isBlockNull(block:)"))); + (BOOL)isFunctionObj:(id _Nullable)obj __attribute__((swift_name("isFunction(obj:)"))); + (BOOL)isFunction0Obj:(id _Nullable)obj __attribute__((swift_name("isFunction0(obj:)"))); -+ (void)takeForwardDeclaredClassObj:(ForwardDeclaredClass *)obj __attribute__((swift_name("takeForwardDeclaredClass(obj:)"))); -+ (void)takeForwardDeclaredProtocolObj:(id)obj __attribute__((swift_name("takeForwardDeclaredProtocol(obj:)"))); + (void)error __attribute__((swift_name("error()"))) __attribute__((unavailable("error"))); + (void)warning __attribute__((swift_name("warning()"))) __attribute__((deprecated("warning"))); + (void)gc __attribute__((swift_name("gc()"))); diff --git a/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h b/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h index 5466af3adba..40988b00871 100644 --- a/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h +++ b/kotlin-native/backend.native/tests/objcexport/expectedLazyLegacySuspendUnit.h @@ -3016,8 +3016,6 @@ __attribute__((swift_name("ValuesKt"))) + (BOOL)isBlockNullBlock:(void (^ _Nullable)(void))block __attribute__((swift_name("isBlockNull(block:)"))); + (BOOL)isFunctionObj:(id _Nullable)obj __attribute__((swift_name("isFunction(obj:)"))); + (BOOL)isFunction0Obj:(id _Nullable)obj __attribute__((swift_name("isFunction0(obj:)"))); -+ (void)takeForwardDeclaredClassObj:(ForwardDeclaredClass *)obj __attribute__((swift_name("takeForwardDeclaredClass(obj:)"))); -+ (void)takeForwardDeclaredProtocolObj:(id)obj __attribute__((swift_name("takeForwardDeclaredProtocol(obj:)"))); + (void)error __attribute__((swift_name("error()"))) __attribute__((unavailable("error"))); + (void)warning __attribute__((swift_name("warning()"))) __attribute__((deprecated("warning"))); + (void)gc __attribute__((swift_name("gc()"))); diff --git a/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h b/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h index e69286ea481..c7c3752ffc5 100644 --- a/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h +++ b/kotlin-native/backend.native/tests/objcexport/expectedLazyNoGenerics.h @@ -3016,8 +3016,6 @@ __attribute__((swift_name("ValuesKt"))) + (BOOL)isBlockNullBlock:(void (^ _Nullable)(void))block __attribute__((swift_name("isBlockNull(block:)"))); + (BOOL)isFunctionObj:(id _Nullable)obj __attribute__((swift_name("isFunction(obj:)"))); + (BOOL)isFunction0Obj:(id _Nullable)obj __attribute__((swift_name("isFunction0(obj:)"))); -+ (void)takeForwardDeclaredClassObj:(ForwardDeclaredClass *)obj __attribute__((swift_name("takeForwardDeclaredClass(obj:)"))); -+ (void)takeForwardDeclaredProtocolObj:(id)obj __attribute__((swift_name("takeForwardDeclaredProtocol(obj:)"))); + (void)error __attribute__((swift_name("error()"))) __attribute__((unavailable("error"))); + (void)warning __attribute__((swift_name("warning()"))) __attribute__((deprecated("warning"))); + (void)gc __attribute__((swift_name("gc()"))); diff --git a/kotlin-native/backend.native/tests/objcexport/values.kt b/kotlin-native/backend.native/tests/objcexport/values.kt index 6c580e72a8c..cd01527ecc6 100644 --- a/kotlin-native/backend.native/tests/objcexport/values.kt +++ b/kotlin-native/backend.native/tests/objcexport/values.kt @@ -536,9 +536,6 @@ fun isFunction0(obj: Any?): Boolean = obj is Function0<*> abstract class MyAbstractList : List -fun takeForwardDeclaredClass(obj: objcnames.classes.ForwardDeclaredClass) {} -fun takeForwardDeclaredProtocol(obj: objcnames.protocols.ForwardDeclaredProtocol) {} - class TestKClass { fun getKotlinClass(clazz: ObjCClass) = getOriginalKotlinClass(clazz) fun getKotlinClass(protocol: ObjCProtocol) = getOriginalKotlinClass(protocol)