[ObjCExport] translateToObjCProtocol: Support building members
KT-64226
This commit is contained in:
committed by
Space Team
parent
47273a3d58
commit
b5bcfaa2e3
+3
-1
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+18
@@ -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
|
||||
}
|
||||
+11
-5
@@ -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
|
||||
)
|
||||
|
||||
+2
-3
@@ -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.
|
||||
|
||||
-8
@@ -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\")"
|
||||
+9
@@ -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\")"
|
||||
Reference in New Issue
Block a user