[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
)