From 4635fa6f8666fddecbac14cede1607e8abdd1d86 Mon Sep 17 00:00:00 2001 From: SvyatoslavScherbina Date: Tue, 31 Dec 2019 16:32:09 +0300 Subject: [PATCH] Fix false positive non-public API App Store rejection (#3739) Fix #3652 #KT-35453 Fixed --- .../llvm/objcexport/ObjCExportCodeGenerator.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt index 60c7d7a5c3f..bde7cb90740 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/objcexport/ObjCExportCodeGenerator.kt @@ -112,7 +112,7 @@ internal class ObjCExportCodeGenerator( val mapper: ObjCExportMapper ) : ObjCExportCodeGeneratorBase(codegen) { - val referencedSelectors = mutableMapOf() + val selectorsToDefine = mutableMapOf() val externalGlobalInitializers = mutableMapOf() @@ -354,7 +354,7 @@ internal class ObjCExportCodeGenerator( unreachable() } - val methods = referencedSelectors.map { (selector, bridge) -> + val methods = selectorsToDefine.map { (selector, bridge) -> ObjCDataGenerator.Method(selector, getEncoding(bridge), constPointer(imp)) } @@ -878,7 +878,8 @@ private fun ObjCExportCodeGenerator.generateKotlinToObjCBridge( MethodBridgeReceiver.Instance -> kotlinReferenceToObjC(parameters[parameter]!!) MethodBridgeSelector -> { val selector = namer.getSelector(baseMethod) - referencedSelectors.getOrPut(selector) { methodBridge } + // Selector is referenced thus should be defined to avoid false positive non-public API rejection: + selectorsToDefine[selector] = methodBridge genSelector(selector) } @@ -1010,6 +1011,9 @@ private fun ObjCExportCodeGenerator.createMethodVirtualAdapter( val methodBridge = mapper.bridgeMethod(baseMethod.descriptor) val objCToKotlin = constPointer(generateObjCImp(baseMethod, methodBridge, isVirtual = true)) + + selectorsToDefine[selector] = methodBridge + return ObjCToKotlinMethodAdapter(selector, getEncoding(methodBridge), objCToKotlin) } @@ -1034,6 +1038,8 @@ private fun ObjCExportCodeGenerator.createMethodAdapter( val objCEncoding = getEncoding(methodBridge) val objCToKotlin = constPointer(generateObjCImp(request.implementation, methodBridge)) + selectorsToDefine[selectorName] = methodBridge + ObjCToKotlinMethodAdapter(selectorName, objCEncoding, objCToKotlin) } @@ -1049,6 +1055,8 @@ private fun ObjCExportCodeGenerator.createArrayConstructorAdapter( val objCEncoding = getEncoding(methodBridge) val objCToKotlin = constPointer(generateObjCImpForArrayConstructor(irConstructor, methodBridge)) + selectorsToDefine[selectorName] = methodBridge + return ObjCToKotlinMethodAdapter(selectorName, objCEncoding, objCToKotlin) } @@ -1310,6 +1318,8 @@ private inline fun ObjCExportCodeGenerator.generateObjCToKotlinSyntheticGetter( LLVMSetLinkage(imp, LLVMLinkage.LLVMPrivateLinkage) + selectorsToDefine[selector] = methodBridge + return ObjCToKotlinMethodAdapter(selector, encoding, constPointer(imp)) }