[ObjCExport] translateToObjCProtocol: Support building members

KT-64226
This commit is contained in:
Sebastian Sellmair
2023-12-14 13:39:32 +01:00
committed by Space Team
parent 47273a3d58
commit b5bcfaa2e3
6 changed files with 43 additions and 17 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind.INTERFACE
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportStub
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCHeader
@@ -33,9 +34,10 @@ fun KtScope.translateToObjCHeader(): ObjCHeader {
}
context(KtAnalysisSession, KtObjCExportSession)
private fun KtSymbol.translateToObjCExportStubOrNull(): ObjCExportStub? {
internal fun KtSymbol.translateToObjCExportStubOrNull(): ObjCExportStub? {
return when {
this is KtClassOrObjectSymbol && classKind == INTERFACE -> translateToObjCProtocol()
this is KtPropertySymbol -> translateToObjCProperty()
else -> null
}
}
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.objcexport
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.objcexport.analysisApiUtils.isVisibleInObjC
context(KtAnalysisSession, KtObjCExportSession)
fun KtPropertySymbol.translateToObjCProperty(): ObjCProperty? {
if (!isVisibleInObjC()) return null
// TODO
return null
}
@@ -6,25 +6,31 @@
package org.jetbrains.kotlin.objcexport
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.types.KtClassType
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCComment
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportStub
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProtocol
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProtocolImpl
import org.jetbrains.kotlin.backend.konan.objcexport.toNameAttributes
import org.jetbrains.kotlin.objcexport.analysisApiUtils.isVisibleInObjC
context(KtAnalysisSession, KtObjCExportSession)
fun KtClassOrObjectSymbol.translateToObjCProtocol(): ObjCProtocol {
fun KtClassOrObjectSymbol.translateToObjCProtocol(): ObjCProtocol? {
// TODO: check if this symbol shall be exposed in the first place
require(classKind == KtClassKind.INTERFACE)
if (isVisibleInObjC()) return null
// TODO: Check error type!
val name = getObjCClassOrProtocolName()
// TODO: Build members
val members = emptyList<ObjCExportStub>()
val members = getMemberScope().getAllSymbols()
.filterIsInstance<KtCallableSymbol>()
.filter { memberSymbol -> memberSymbol.isVisibleInObjC() }
.mapNotNull { memberSymbol -> memberSymbol.translateToObjCExportStubOrNull() }
.toList()
val superProtocols = superTypes
.asSequence()
@@ -44,7 +50,7 @@ fun KtClassOrObjectSymbol.translateToObjCProtocol(): ObjCProtocol {
name = name.objCName,
comment = comment,
origin = getObjCStubOrigin(),
attributes = emptyList(),
attributes = name.toNameAttributes(),
superProtocols = superProtocols,
members = members
)
@@ -628,9 +628,8 @@ class ObjCExportTranslatorImpl(
val attributes = mutableListOf<String>()
attributes += method.getSwiftPrivateAttribute() ?: swiftNameAttribute(swiftName)
if (baseMethodBridge.returnBridge is MethodBridge.ReturnValue.WithError.ZeroForError
&& baseMethodBridge.returnBridge.successMayBeZero
) {
val returnBridge = baseMethodBridge.returnBridge
if (returnBridge is MethodBridge.ReturnValue.WithError.ZeroForError && returnBridge.successMayBeZero) {
// Method may return zero on success, but
// standard Objective-C convention doesn't suppose this happening.
@@ -251,11 +251,3 @@ private fun objCProtocol(
comment = comment
)
private fun ObjCExportClassOrProtocolName.toNameAttributes(): List<String> = listOfNotNull(
binaryName.takeIf { it != objCName }?.let { objcRuntimeNameAttribute(it) },
swiftName.takeIf { it != objCName }?.let { swiftNameAttribute(it) }
)
private fun swiftNameAttribute(swiftName: String) = "swift_name(\"$swiftName\")"
private fun objcRuntimeNameAttribute(name: String) = "objc_runtime_name(\"$name\")"
@@ -44,3 +44,12 @@ private data class ObjCExportPropertyNameImpl(
override val swiftName: String,
override val objCName: String,
) : ObjCExportPropertyName
fun ObjCExportClassOrProtocolName.toNameAttributes(): List<String> = listOfNotNull(
binaryName.takeIf { it != objCName }?.let { objcRuntimeNameAttribute(it) },
swiftName.takeIf { it != objCName }?.let { swiftNameAttribute(it) }
)
private fun swiftNameAttribute(swiftName: String) = "swift_name(\"$swiftName\")"
private fun objcRuntimeNameAttribute(name: String) = "objc_runtime_name(\"$name\")"