[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.scopes.KtScope
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind.INTERFACE
|
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind.INTERFACE
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
|
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.analysis.api.symbols.KtSymbol
|
||||||
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportStub
|
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExportStub
|
||||||
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCHeader
|
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCHeader
|
||||||
@@ -33,9 +34,10 @@ fun KtScope.translateToObjCHeader(): ObjCHeader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
context(KtAnalysisSession, KtObjCExportSession)
|
context(KtAnalysisSession, KtObjCExportSession)
|
||||||
private fun KtSymbol.translateToObjCExportStubOrNull(): ObjCExportStub? {
|
internal fun KtSymbol.translateToObjCExportStubOrNull(): ObjCExportStub? {
|
||||||
return when {
|
return when {
|
||||||
this is KtClassOrObjectSymbol && classKind == INTERFACE -> translateToObjCProtocol()
|
this is KtClassOrObjectSymbol && classKind == INTERFACE -> translateToObjCProtocol()
|
||||||
|
this is KtPropertySymbol -> translateToObjCProperty()
|
||||||
else -> null
|
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
|
package org.jetbrains.kotlin.objcexport
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
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.KtClassKind
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.types.KtClassType
|
import org.jetbrains.kotlin.analysis.api.types.KtClassType
|
||||||
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
|
import org.jetbrains.kotlin.analysis.api.types.KtClassTypeQualifier
|
||||||
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCComment
|
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.ObjCProtocol
|
||||||
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCProtocolImpl
|
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)
|
context(KtAnalysisSession, KtObjCExportSession)
|
||||||
fun KtClassOrObjectSymbol.translateToObjCProtocol(): ObjCProtocol {
|
fun KtClassOrObjectSymbol.translateToObjCProtocol(): ObjCProtocol? {
|
||||||
// TODO: check if this symbol shall be exposed in the first place
|
// TODO: check if this symbol shall be exposed in the first place
|
||||||
require(classKind == KtClassKind.INTERFACE)
|
require(classKind == KtClassKind.INTERFACE)
|
||||||
|
if (isVisibleInObjC()) return null
|
||||||
|
|
||||||
// TODO: Check error type!
|
// TODO: Check error type!
|
||||||
val name = getObjCClassOrProtocolName()
|
val name = getObjCClassOrProtocolName()
|
||||||
|
|
||||||
// TODO: Build members
|
val members = getMemberScope().getAllSymbols()
|
||||||
val members = emptyList<ObjCExportStub>()
|
.filterIsInstance<KtCallableSymbol>()
|
||||||
|
.filter { memberSymbol -> memberSymbol.isVisibleInObjC() }
|
||||||
|
.mapNotNull { memberSymbol -> memberSymbol.translateToObjCExportStubOrNull() }
|
||||||
|
.toList()
|
||||||
|
|
||||||
val superProtocols = superTypes
|
val superProtocols = superTypes
|
||||||
.asSequence()
|
.asSequence()
|
||||||
@@ -44,7 +50,7 @@ fun KtClassOrObjectSymbol.translateToObjCProtocol(): ObjCProtocol {
|
|||||||
name = name.objCName,
|
name = name.objCName,
|
||||||
comment = comment,
|
comment = comment,
|
||||||
origin = getObjCStubOrigin(),
|
origin = getObjCStubOrigin(),
|
||||||
attributes = emptyList(),
|
attributes = name.toNameAttributes(),
|
||||||
superProtocols = superProtocols,
|
superProtocols = superProtocols,
|
||||||
members = members
|
members = members
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-3
@@ -628,9 +628,8 @@ class ObjCExportTranslatorImpl(
|
|||||||
val attributes = mutableListOf<String>()
|
val attributes = mutableListOf<String>()
|
||||||
|
|
||||||
attributes += method.getSwiftPrivateAttribute() ?: swiftNameAttribute(swiftName)
|
attributes += method.getSwiftPrivateAttribute() ?: swiftNameAttribute(swiftName)
|
||||||
if (baseMethodBridge.returnBridge is MethodBridge.ReturnValue.WithError.ZeroForError
|
val returnBridge = baseMethodBridge.returnBridge
|
||||||
&& baseMethodBridge.returnBridge.successMayBeZero
|
if (returnBridge is MethodBridge.ReturnValue.WithError.ZeroForError && returnBridge.successMayBeZero) {
|
||||||
) {
|
|
||||||
|
|
||||||
// Method may return zero on success, but
|
// Method may return zero on success, but
|
||||||
// standard Objective-C convention doesn't suppose this happening.
|
// standard Objective-C convention doesn't suppose this happening.
|
||||||
|
|||||||
-8
@@ -251,11 +251,3 @@ private fun objCProtocol(
|
|||||||
comment = comment
|
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 swiftName: String,
|
||||||
override val objCName: String,
|
override val objCName: String,
|
||||||
) : ObjCExportPropertyName
|
) : 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