[ObjCExport] Fix top level property

KT-64923


Merge-request: KT-MR-13873
Merged-by: Eugene Levenetc <Eugene.Levenetc@jetbrains.com>
This commit is contained in:
eugene.levenetc
2024-01-15 01:49:37 +00:00
committed by Space Team
parent a713d66b7b
commit fc56f2af1c
3 changed files with 28 additions and 17 deletions
@@ -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.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol 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.KtFunctionalType
import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.backend.konan.KonanPrimitiveType import org.jetbrains.kotlin.backend.konan.KonanPrimitiveType
@@ -14,18 +15,10 @@ import org.jetbrains.kotlin.objcexport.*
* [org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportMapperKt.bridgeMethodImpl] * [org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportMapperKt.bridgeMethodImpl]
*/ */
context(KtAnalysisSession, KtObjCExportSession) context(KtAnalysisSession, KtObjCExportSession)
internal fun KtFunctionLikeSymbol.getMethodBridge(): MethodBridge { internal fun KtFunctionLikeSymbol.getFunctionMethodBridge(): MethodBridge {
val valueParameters = mutableListOf<MethodBridgeValueParameter>() val valueParameters = mutableListOf<MethodBridgeValueParameter>()
val receiver = if (isConstructor && isArray) {
MethodBridgeReceiver.Factory
} else if (isTopLevel) {
MethodBridgeReceiver.Static
} else {
MethodBridgeReceiver.Instance
}
this.valueParameters.forEach { this.valueParameters.forEach {
valueParameters += bridgeParameter(it.returnType) valueParameters += bridgeParameter(it.returnType)
} }
@@ -36,11 +29,29 @@ internal fun KtFunctionLikeSymbol.getMethodBridge(): MethodBridge {
return MethodBridge( return MethodBridge(
bridgeReturnType(), bridgeReturnType(),
receiver, receiverType,
valueParameters 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] * [ObjCExportMapper.bridgeParameter]
*/ */
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.backend.konan.objcexport.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.NameUtils import org.jetbrains.kotlin.name.NameUtils
import org.jetbrains.kotlin.objcexport.Predefined.anyMethodSelectors 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.objcexport.analysisApiUtils.isVisibleInObjC
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -47,7 +47,7 @@ context(KtAnalysisSession, KtObjCExportSession)
internal fun KtFunctionLikeSymbol.buildObjCMethod( internal fun KtFunctionLikeSymbol.buildObjCMethod(
unavailable: Boolean = false, unavailable: Boolean = false,
): ObjCMethod { ): ObjCMethod {
val bridge = getMethodBridge() val bridge = getFunctionMethodBridge()
val returnType: ObjCType = mapReturnType(bridge.returnBridge) val returnType: ObjCType = mapReturnType(bridge.returnBridge)
val parameters = translateToObjCParameters(bridge) val parameters = translateToObjCParameters(bridge)
val selector = getSelector(bridge) val selector = getSelector(bridge)
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProperty import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProperty
import org.jetbrains.kotlin.backend.konan.objcexport.swiftNameAttribute 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 import org.jetbrains.kotlin.objcexport.analysisApiUtils.isVisibleInObjC
context(KtAnalysisSession, KtObjCExportSession) context(KtAnalysisSession, KtObjCExportSession)
@@ -25,12 +25,12 @@ context(KtAnalysisSession, KtObjCExportSession)
fun KtPropertySymbol.buildProperty(): ObjCProperty { fun KtPropertySymbol.buildProperty(): ObjCProperty {
val propertyName = getObjCPropertyName() val propertyName = getObjCPropertyName()
val name = propertyName.objCName val name = propertyName.objCName
val getterBridge = getter?.getMethodBridge() val bridge = getPropertyMethodBridge()
val type = getter?.mapReturnType(getterBridge!!.returnBridge) val type = getter?.mapReturnType(bridge.returnBridge)
val attributes = mutableListOf<String>() val attributes = mutableListOf<String>()
val setterName: String? val setterName: String?
if (getterBridge!!.isInstance) { if (!bridge.isInstance) {
attributes += "class" attributes += "class"
} }
@@ -39,7 +39,7 @@ fun KtPropertySymbol.buildProperty(): ObjCProperty {
val shouldBeSetterExposed = true //TODO: mapper.shouldBeExposed val shouldBeSetterExposed = true //TODO: mapper.shouldBeExposed
if (propertySetter != null && shouldBeSetterExposed) { 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 setterName = if (setterSelector != "set" + name.replaceFirstChar(Char::uppercaseChar) + ":") setterSelector else null
} else { } else {
attributes += "readonly" attributes += "readonly"