[ObjCExport] Fix extensions interface name
KT-66315
This commit is contained in:
committed by
Space Team
parent
2a445a04b0
commit
5c64832c0f
+25
-19
@@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -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? {
|
||||
|
||||
+9
-7
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user