[ObjCExport] Fix extensions interface name

KT-66315
This commit is contained in:
eugene.levenetc
2024-03-04 18:09:20 +01:00
committed by Space Team
parent 2a445a04b0
commit 5c64832c0f
7 changed files with 70 additions and 43 deletions
@@ -4,7 +4,6 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCInterface
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCInterfaceImpl
import org.jetbrains.kotlin.objcexport.analysisApiUtils.getFileName
private const val extensionsCategoryName = "Extensions"
@@ -49,26 +48,33 @@ internal val ObjCInterface.isExtensionsFacade: Boolean
* See related [getTopLevelFacade]
*/
context(KtAnalysisSession, KtObjCExportSession)
fun KtFileSymbol.getExtensionsFacade(): ObjCInterface? {
fun KtFileSymbol.getExtensionFacades(): List<ObjCInterface> {
val extensions = getFileScope()
.getCallableSymbols().filter { it.isExtension }
.toList().sortedWith(StableCallableOrder)
.ifEmpty { return null }
.toList()
.sortedWith(StableCallableOrder)
.ifEmpty { return emptyList() }
.groupBy {
val classSymbol = it.receiverParameter?.type?.expandedClassSymbol
classSymbol?.getObjCClassOrProtocolName()?.objCName
}
.mapNotNull { (key, value) ->
if (key == null) return@mapNotNull null else key to value
}
val fileName = getFileName()
?: throw IllegalStateException("File '$this' cannot be translated without file name")
return ObjCInterfaceImpl(
name = fileName,
comment = null,
origin = null,
attributes = emptyList(),
superProtocols = emptyList(),
members = extensions.mapNotNull { it.translateToObjCExportStub() },
categoryName = extensionsCategoryName,
generics = emptyList(),
superClass = null,
superClassGenerics = emptyList()
)
return extensions.map { (objCName, extensionSymbols) ->
ObjCInterfaceImpl(
name = objCName,
comment = null,
origin = null,
attributes = emptyList(),
superProtocols = emptyList(),
members = extensionSymbols.mapNotNull { ext -> ext.translateToObjCExportStub() },
categoryName = extensionsCategoryName,
generics = emptyList(),
superClass = null,
superClassGenerics = emptyList()
)
}
}
@@ -43,7 +43,7 @@ import org.jetbrains.kotlin.objcexport.analysisApiUtils.getDefaultSuperClassOrPr
*
* Where `FooKt` would be the "top level interface file facade" returned by this function.
*
* See related [getExtensionsFacade]
* See related [getExtensionFacades]
*/
context(KtAnalysisSession, KtObjCExportSession)
fun KtFileSymbol.getTopLevelFacade(): ObjCInterface? {
@@ -109,10 +109,12 @@ private class KtObjCExportHeaderGenerator {
context(KtAnalysisSession, KtObjCExportSession)
private fun translateFileSymbol(symbol: KtFileSymbol) {
symbol.getExtensionsFacade()?.let { extensionFacade ->
objCStubs += extensionFacade
enqueueDependencyClasses(extensionFacade)
objCClassForwardDeclarations += extensionFacade.name
symbol.getExtensionFacades().let { extensionFacades ->
extensionFacades.forEach { facade ->
objCStubs += facade
enqueueDependencyClasses(facade)
objCClassForwardDeclarations += facade.name
}
}
symbol.getTopLevelFacade()?.let { topLevelFacade ->
@@ -146,10 +148,10 @@ private class KtObjCExportHeaderGenerator {
symbol.getDeclaredSuperInterfaceSymbols()
.filter { it.isVisibleInObjC() }
.forEach { superInterfaceSymbol ->
translateClassOrObjectSymbol(superInterfaceSymbol)?.let {
objCProtocolForwardDeclarations += it.name
translateClassOrObjectSymbol(superInterfaceSymbol)?.let {
objCProtocolForwardDeclarations += it.name
}
}
}
symbol.getSuperClassSymbolNotAny()?.let { superClassSymbol ->
translateClassOrObjectSymbol(superClassSymbol)?.let {