Support C enums with forward declarations
This commit is contained in:
committed by
SvyatoslavScherbina
parent
56b4e9c806
commit
fe2b680be8
+7
-1
@@ -240,7 +240,13 @@ internal class NativeIndexImpl(val library: NativeLibrary, val verbose: Boolean
|
|||||||
|
|
||||||
private fun getEnumDefAt(cursor: CValue<CXCursor>): EnumDefImpl {
|
private fun getEnumDefAt(cursor: CValue<CXCursor>): EnumDefImpl {
|
||||||
if (clang_isCursorDefinition(cursor) == 0) {
|
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) {
|
return enumRegistry.getOrPut(cursor) {
|
||||||
|
|||||||
@@ -2838,8 +2838,8 @@ kotlinNativeInterop {
|
|||||||
defFile 'interop/basics/cunsupported.def'
|
defFile 'interop/basics/cunsupported.def'
|
||||||
}
|
}
|
||||||
|
|
||||||
cstructs {
|
ctypes {
|
||||||
defFile 'interop/basics/cstructs.def'
|
defFile 'interop/basics/ctypes.def'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isMac()) {
|
if (isMac()) {
|
||||||
@@ -2935,10 +2935,10 @@ task interop_unsupported(type: RunInteropKonanTest) {
|
|||||||
interop = 'cunsupported'
|
interop = 'cunsupported'
|
||||||
}
|
}
|
||||||
|
|
||||||
task interop_structs(type: RunInteropKonanTest) {
|
task interop_types(type: RunInteropKonanTest) {
|
||||||
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
|
disabled = (project.testTarget == 'wasm32') // No interop for wasm yet.
|
||||||
source = "interop/basics/structs.kt"
|
source = "interop/basics/types.kt"
|
||||||
interop = 'cstructs'
|
interop = 'ctypes'
|
||||||
}
|
}
|
||||||
|
|
||||||
task interop_echo_server(type: RunInteropKonanTest) {
|
task interop_echo_server(type: RunInteropKonanTest) {
|
||||||
|
|||||||
+6
-1
@@ -8,4 +8,9 @@ struct StructWithConstFields {
|
|||||||
struct StructWithConstFields getStructWithConstFields() {
|
struct StructWithConstFields getStructWithConstFields() {
|
||||||
struct StructWithConstFields result = { 111, 222 };
|
struct StructWithConstFields result = { 111, 222 };
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ForwardDeclaredEnum;
|
||||||
|
enum ForwardDeclaredEnum {
|
||||||
|
ZERO, ONE, TWO
|
||||||
|
};
|
||||||
+3
-1
@@ -1,10 +1,12 @@
|
|||||||
import kotlinx.cinterop.*
|
import kotlinx.cinterop.*
|
||||||
import kotlin.test.*
|
import kotlin.test.*
|
||||||
import cstructs.*
|
import ctypes.*
|
||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
getStructWithConstFields().useContents {
|
getStructWithConstFields().useContents {
|
||||||
assertEquals(111, x)
|
assertEquals(111, x)
|
||||||
assertEquals(222, y)
|
assertEquals(222, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assertEquals(1u, ForwardDeclaredEnum.ONE.value)
|
||||||
}
|
}
|
||||||
@@ -61,3 +61,8 @@ int formatStringLength(NSString* format, ...);
|
|||||||
|
|
||||||
#define STRING_MACRO @"String macro"
|
#define STRING_MACRO @"String macro"
|
||||||
#define CFSTRING_MACRO CFSTR("CFString macro")
|
#define CFSTRING_MACRO CFSTR("CFString macro")
|
||||||
|
|
||||||
|
typedef NS_ENUM(int32_t, ForwardDeclaredEnum);
|
||||||
|
typedef NS_ENUM(int32_t, ForwardDeclaredEnum) {
|
||||||
|
ZERO, ONE, TWO,
|
||||||
|
};
|
||||||
@@ -19,6 +19,8 @@ fun run() {
|
|||||||
testConversions()
|
testConversions()
|
||||||
testWeakRefs()
|
testWeakRefs()
|
||||||
|
|
||||||
|
assertEquals(2, ForwardDeclaredEnum.TWO.value)
|
||||||
|
|
||||||
println(
|
println(
|
||||||
getSupplier(
|
getSupplier(
|
||||||
invoke1(42) { it * 2 }
|
invoke1(42) { it * 2 }
|
||||||
|
|||||||
Reference in New Issue
Block a user