From fe2b680be8bd6afbeb5ba7dddc67889c3a136dbc Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Tue, 11 Dec 2018 09:49:56 +0300 Subject: [PATCH] Support C enums with forward declarations --- .../jetbrains/kotlin/native/interop/indexer/Indexer.kt | 8 +++++++- backend.native/tests/build.gradle | 10 +++++----- .../tests/interop/basics/{cstructs.def => ctypes.def} | 7 ++++++- .../tests/interop/basics/{structs.kt => types.kt} | 4 +++- backend.native/tests/interop/objc/smoke.h | 5 +++++ backend.native/tests/interop/objc/smoke.kt | 2 ++ 6 files changed, 28 insertions(+), 8 deletions(-) rename backend.native/tests/interop/basics/{cstructs.def => ctypes.def} (73%) rename backend.native/tests/interop/basics/{structs.kt => types.kt} (71%) diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt index f38f95be9a9..98e5ebdece4 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt @@ -240,7 +240,13 @@ internal class NativeIndexImpl(val library: NativeLibrary, val verbose: Boolean private fun getEnumDefAt(cursor: CValue): EnumDefImpl { if (clang_isCursorDefinition(cursor) == 0) { - TODO("support enum forward declarations") + val definitionCursor = clang_getCursorDefinition(cursor) + if (clang_isCursorDefinition(definitionCursor) != 0) { + return getEnumDefAt(definitionCursor) + } else { + TODO("support enum forward declarations: " + + clang_getTypeSpelling(clang_getCursorType(cursor)).convertAndDispose()) + } } return enumRegistry.getOrPut(cursor) { diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 373325fb3ad..863b91dfc03 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2838,8 +2838,8 @@ kotlinNativeInterop { defFile 'interop/basics/cunsupported.def' } - cstructs { - defFile 'interop/basics/cstructs.def' + ctypes { + defFile 'interop/basics/ctypes.def' } if (isMac()) { @@ -2935,10 +2935,10 @@ task interop_unsupported(type: RunInteropKonanTest) { interop = 'cunsupported' } -task interop_structs(type: RunInteropKonanTest) { +task interop_types(type: RunInteropKonanTest) { disabled = (project.testTarget == 'wasm32') // No interop for wasm yet. - source = "interop/basics/structs.kt" - interop = 'cstructs' + source = "interop/basics/types.kt" + interop = 'ctypes' } task interop_echo_server(type: RunInteropKonanTest) { diff --git a/backend.native/tests/interop/basics/cstructs.def b/backend.native/tests/interop/basics/ctypes.def similarity index 73% rename from backend.native/tests/interop/basics/cstructs.def rename to backend.native/tests/interop/basics/ctypes.def index d085f15d611..181ab2d3be8 100644 --- a/backend.native/tests/interop/basics/cstructs.def +++ b/backend.native/tests/interop/basics/ctypes.def @@ -8,4 +8,9 @@ struct StructWithConstFields { struct StructWithConstFields getStructWithConstFields() { struct StructWithConstFields result = { 111, 222 }; return result; -} \ No newline at end of file +} + +enum ForwardDeclaredEnum; +enum ForwardDeclaredEnum { + ZERO, ONE, TWO +}; \ No newline at end of file diff --git a/backend.native/tests/interop/basics/structs.kt b/backend.native/tests/interop/basics/types.kt similarity index 71% rename from backend.native/tests/interop/basics/structs.kt rename to backend.native/tests/interop/basics/types.kt index b340c34f723..03b8bec2aa5 100644 --- a/backend.native/tests/interop/basics/structs.kt +++ b/backend.native/tests/interop/basics/types.kt @@ -1,10 +1,12 @@ import kotlinx.cinterop.* import kotlin.test.* -import cstructs.* +import ctypes.* fun main() { getStructWithConstFields().useContents { assertEquals(111, x) assertEquals(222, y) } + + assertEquals(1u, ForwardDeclaredEnum.ONE.value) } \ No newline at end of file diff --git a/backend.native/tests/interop/objc/smoke.h b/backend.native/tests/interop/objc/smoke.h index 5458a64cf9b..6a826097866 100644 --- a/backend.native/tests/interop/objc/smoke.h +++ b/backend.native/tests/interop/objc/smoke.h @@ -61,3 +61,8 @@ int formatStringLength(NSString* format, ...); #define STRING_MACRO @"String macro" #define CFSTRING_MACRO CFSTR("CFString macro") + +typedef NS_ENUM(int32_t, ForwardDeclaredEnum); +typedef NS_ENUM(int32_t, ForwardDeclaredEnum) { + ZERO, ONE, TWO, +}; \ No newline at end of file diff --git a/backend.native/tests/interop/objc/smoke.kt b/backend.native/tests/interop/objc/smoke.kt index 5bddbfa14a7..40a4a65bce9 100644 --- a/backend.native/tests/interop/objc/smoke.kt +++ b/backend.native/tests/interop/objc/smoke.kt @@ -19,6 +19,8 @@ fun run() { testConversions() testWeakRefs() + assertEquals(2, ForwardDeclaredEnum.TWO.value) + println( getSupplier( invoke1(42) { it * 2 }