From fc56f2af1ce4f15b7afd4924e4befab8fddf7b2b Mon Sep 17 00:00:00 2001 From: "eugene.levenetc" Date: Mon, 15 Jan 2024 01:49:37 +0000 Subject: [PATCH] [ObjCExport] Fix top level property KT-64923 Merge-request: KT-MR-13873 Merged-by: Eugene Levenetc --- .../analysisApiUtils/getMethodBridge.kt | 31 +++++++++++++------ .../objcexport/translateToObjCMethod.kt | 4 +-- .../objcexport/translateToObjCProperty.kt | 10 +++--- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt index e6f0a64477e..4e364e54393 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/analysisApiUtils/getMethodBridge.kt @@ -4,6 +4,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.backend.konan.KonanPrimitiveType @@ -14,18 +15,10 @@ import org.jetbrains.kotlin.objcexport.* * [org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportMapperKt.bridgeMethodImpl] */ context(KtAnalysisSession, KtObjCExportSession) -internal fun KtFunctionLikeSymbol.getMethodBridge(): MethodBridge { +internal fun KtFunctionLikeSymbol.getFunctionMethodBridge(): MethodBridge { val valueParameters = mutableListOf() - val receiver = if (isConstructor && isArray) { - MethodBridgeReceiver.Factory - } else if (isTopLevel) { - MethodBridgeReceiver.Static - } else { - MethodBridgeReceiver.Instance - } - this.valueParameters.forEach { valueParameters += bridgeParameter(it.returnType) } @@ -36,11 +29,29 @@ internal fun KtFunctionLikeSymbol.getMethodBridge(): MethodBridge { return MethodBridge( bridgeReturnType(), - receiver, + receiverType, valueParameters ) } +context(KtAnalysisSession, KtObjCExportSession) +internal fun KtPropertySymbol.getPropertyMethodBridge(): MethodBridge { + return MethodBridge( + bridgeReturnType(), + receiverType, + emptyList() + ) +} + +private val KtCallableSymbol.receiverType: MethodBridgeReceiver + get() = if (isConstructor && isArray) { + MethodBridgeReceiver.Factory + } else if (isTopLevel) { + MethodBridgeReceiver.Static + } else { + MethodBridgeReceiver.Instance + } + /** * [ObjCExportMapper.bridgeParameter] */ diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt index f88e623e9c8..608b61e129d 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCMethod.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.backend.konan.objcexport.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.NameUtils import org.jetbrains.kotlin.objcexport.Predefined.anyMethodSelectors -import org.jetbrains.kotlin.objcexport.analysisApiUtils.getMethodBridge +import org.jetbrains.kotlin.objcexport.analysisApiUtils.getFunctionMethodBridge import org.jetbrains.kotlin.objcexport.analysisApiUtils.isVisibleInObjC import org.jetbrains.kotlin.psi.KtFile @@ -47,7 +47,7 @@ context(KtAnalysisSession, KtObjCExportSession) internal fun KtFunctionLikeSymbol.buildObjCMethod( unavailable: Boolean = false, ): ObjCMethod { - val bridge = getMethodBridge() + val bridge = getFunctionMethodBridge() val returnType: ObjCType = mapReturnType(bridge.returnBridge) val parameters = translateToObjCParameters(bridge) val selector = getSelector(bridge) diff --git a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProperty.kt b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProperty.kt index 38f3591e5a4..afaca55c7f6 100644 --- a/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProperty.kt +++ b/native/objcexport-header-generator/impl/analysis-api/src/org/jetbrains/kotlin/objcexport/translateToObjCProperty.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProperty import org.jetbrains.kotlin.backend.konan.objcexport.swiftNameAttribute -import org.jetbrains.kotlin.objcexport.analysisApiUtils.getMethodBridge +import org.jetbrains.kotlin.objcexport.analysisApiUtils.getPropertyMethodBridge import org.jetbrains.kotlin.objcexport.analysisApiUtils.isVisibleInObjC context(KtAnalysisSession, KtObjCExportSession) @@ -25,12 +25,12 @@ context(KtAnalysisSession, KtObjCExportSession) fun KtPropertySymbol.buildProperty(): ObjCProperty { val propertyName = getObjCPropertyName() val name = propertyName.objCName - val getterBridge = getter?.getMethodBridge() - val type = getter?.mapReturnType(getterBridge!!.returnBridge) + val bridge = getPropertyMethodBridge() + val type = getter?.mapReturnType(bridge.returnBridge) val attributes = mutableListOf() val setterName: String? - if (getterBridge!!.isInstance) { + if (!bridge.isInstance) { attributes += "class" } @@ -39,7 +39,7 @@ fun KtPropertySymbol.buildProperty(): ObjCProperty { val shouldBeSetterExposed = true //TODO: mapper.shouldBeExposed if (propertySetter != null && shouldBeSetterExposed) { - val setterSelector = propertySetter.getSelector(getterBridge) + val setterSelector = propertySetter.getSelector(bridge) setterName = if (setterSelector != "set" + name.replaceFirstChar(Char::uppercaseChar) + ":") setterSelector else null } else { attributes += "readonly"