Interop: Use package name in wrapper names
Linking two interop libraries containing the same declaration causes a 'symbol multiply defined' error. This patch fixes it by using FQ-names for wrapper functions.
This commit is contained in:
committed by
Ilya Matveev
parent
237b7ef182
commit
31e2fa28ad
+1
-1
@@ -248,6 +248,6 @@ class SimpleBridgeGeneratorImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val INVALID_CLANG_IDENTIFIER_REGEX = "[^a-zA-Z1-9_]".toRegex()
|
internal val INVALID_CLANG_IDENTIFIER_REGEX = "[^a-zA-Z1-9_]".toRegex()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-3
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.jetbrains.kotlin.native.interop.gen
|
package org.jetbrains.kotlin.native.interop.gen
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.native.interop.gen.SimpleBridgeGeneratorImpl.Companion.INVALID_CLANG_IDENTIFIER_REGEX
|
||||||
import org.jetbrains.kotlin.native.interop.gen.jvm.KotlinPlatform
|
import org.jetbrains.kotlin.native.interop.gen.jvm.KotlinPlatform
|
||||||
import org.jetbrains.kotlin.native.interop.indexer.ObjCProtocol
|
import org.jetbrains.kotlin.native.interop.indexer.ObjCProtocol
|
||||||
import org.jetbrains.kotlin.native.interop.indexer.VoidType
|
import org.jetbrains.kotlin.native.interop.indexer.VoidType
|
||||||
@@ -75,8 +76,10 @@ class StubIrBridgeBuilder(
|
|||||||
|
|
||||||
private var currentFunctionWrapperId = 0
|
private var currentFunctionWrapperId = 0
|
||||||
|
|
||||||
private fun generateFunctionWrapperName(functionName: String) =
|
private fun generateFunctionWrapperName(packageName: String, functionName: String): String {
|
||||||
"${functionName}_wrapper${currentFunctionWrapperId++}"
|
val validPackageName = packageName.replace(INVALID_CLANG_IDENTIFIER_REGEX, "_")
|
||||||
|
return "${validPackageName}_${functionName}_wrapper${currentFunctionWrapperId++}"
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitClass(element: ClassStub, owner: StubContainer?) {
|
override fun visitClass(element: ClassStub, owner: StubContainer?) {
|
||||||
element.annotations.filterIsInstance<AnnotationStub.ObjC.ExternalClass>().firstOrNull()?.let {
|
element.annotations.filterIsInstance<AnnotationStub.ObjC.ExternalClass>().firstOrNull()?.let {
|
||||||
@@ -135,7 +138,7 @@ class StubIrBridgeBuilder(
|
|||||||
CCalleeWrapper(origin.function.name, emptyList())
|
CCalleeWrapper(origin.function.name, emptyList())
|
||||||
} else {
|
} else {
|
||||||
val function = origin.function
|
val function = origin.function
|
||||||
val wrapperName = generateFunctionWrapperName(function.name)
|
val wrapperName = generateFunctionWrapperName(context.configuration.pkgName, function.name)
|
||||||
|
|
||||||
val returnType = function.returnType.getStringRepresentation()
|
val returnType = function.returnType.getStringRepresentation()
|
||||||
val parameters = function.parameters.mapIndexed { index, parameter ->
|
val parameters = function.parameters.mapIndexed { index, parameter ->
|
||||||
|
|||||||
Reference in New Issue
Block a user