diff --git a/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/ObjectiveCImpl.kt b/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/ObjectiveCImpl.kt index d343c6427b7..1c9d94ec939 100644 --- a/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/ObjectiveCImpl.kt +++ b/Interop/Runtime/src/native/kotlin/kotlinx/cinterop/ObjectiveCImpl.kt @@ -100,7 +100,7 @@ external fun getReceiverOrSuper(receiver: NativePtr, superClass: NativePtr): COp @Retention(AnnotationRetention.BINARY) annotation class ExternalObjCClass(val protocolGetter: String = "", val binaryName: String = "") -@Target(AnnotationTarget.FUNCTION) +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) @Retention(AnnotationRetention.BINARY) annotation class ObjCMethod(val selector: String, val bridge: String) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt index 353e7ff87ee..6ac01272d2f 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt @@ -74,7 +74,7 @@ class ObjCMethodStub(private val stubGenerator: StubGenerator, override fun generate(context: StubGenerationContext): Sequence = if (context.nativeBridges.isSupported(this)) { val result = mutableListOf() - result.add("@ObjCMethod".applyToStrings(method.selector, bridgeName)) + result.add(objCMethodAnnotation) if (method.nsConsumesSelf) result.add("@CCall.ConsumesReceiver") if (method.nsReturnsRetained) result.add("@CCall.ReturnsRetained") result.add(header) @@ -167,6 +167,7 @@ class ObjCMethodStub(private val stubGenerator: StubGenerator, private val implementationTemplate: String? internal val bridgeName: String private val bridgeHeader: String + internal val objCMethodAnnotation: String init { val bodyGenerator = KotlinCodeBuilder(scope = stubGenerator.kotlinFile) @@ -253,6 +254,7 @@ class ObjCMethodStub(private val stubGenerator: StubGenerator, this.bodyLines = bodyGenerator.build() bridgeName = "objcKniBridge${stubGenerator.nextUniqueId()}" + objCMethodAnnotation = "@ObjCMethod".applyToStrings(method.selector, bridgeName) this.bridgeHeader = buildString { append("internal fun ") @@ -711,11 +713,11 @@ class ObjCPropertyStub( } val result = mutableListOf( "$modifiers$kind $receiver${property.name.asSimpleName()}: $kotlinType", - " get() = ${getterStub.bridgeName}(nativeNullPtr, this.objcPtr())" + " ${getterStub.objCMethodAnnotation} external get" ) property.setter?.let { - result.add(" set(value) = ${setterStub!!.bridgeName}(nativeNullPtr, this.objcPtr(), value)") + result.add(" ${setterStub!!.objCMethodAnnotation} external set") } return result.asSequence() diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt index 2d69c32bdfa..8a3a613e435 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/BinaryInterface.kt @@ -102,6 +102,10 @@ object KonanMangler : KotlinManglerImpl() { append(it.selector) if (this@platformSpecificFunctionName is IrConstructor && this@platformSpecificFunctionName.isObjCConstructor) append("#Constructor") + if ((this@platformSpecificFunctionName as? IrSimpleFunction)?.correspondingProperty != null) { + append("#Accessor") + } + // We happen to have the clashing combinations such as //@ObjCMethod("issueChallengeToPlayers:message:", "objcKniBridge1165") //external fun GKScore.issueChallengeToPlayers(playerIDs: List<*>?, message: String?): Unit