From 49f1873efd2c40e24cb5001006361f7cbaebb3e8 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Tue, 21 Mar 2017 18:22:27 +0700 Subject: [PATCH] Generate C interop adapters for functions defined in headers --- .../org/jetbrains/kotlin/native/interop/indexer/Indexer.kt | 5 ++++- .../jetbrains/kotlin/native/interop/indexer/NativeIndex.kt | 3 ++- .../jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) 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 ec2c77c463a..54e78b04f74 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 @@ -266,7 +266,10 @@ internal class NativeIndexImpl(val language: Language) : NativeIndex() { Language.C -> clang_Cursor_getMangling(cursor).convertAndDispose() } - functionByName[name] = FunctionDecl(name, args, returnType, binaryName) + val definitionCursor = clang_getCursorDefinition(cursor) + val isDefined = (clang_Cursor_isNull(definitionCursor) == 0) + + functionByName[name] = FunctionDecl(name, args, returnType, binaryName, isDefined) } CXIdxEntity_Enum -> { diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt index 091e47370f4..dbe36ae4f9d 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt @@ -69,7 +69,8 @@ class Parameter(val name: String?, val type: Type) /** * C function declaration. */ -class FunctionDecl(val name: String, val parameters: List, val returnType: Type, val binaryName: String) +class FunctionDecl(val name: String, val parameters: List, val returnType: Type, val binaryName: String, + val isDefined: Boolean) /** * C typedef definition. diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt index 36fcba432d7..8ef5ee1479f 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt @@ -909,7 +909,8 @@ class StubGenerator( return true } - return this.returnsRecord() || + return this.isDefined || + this.returnsRecord() || this.parameters.map { it.type }.any { it.unwrapTypedefs() is RecordType } }