Consolidate generating reverse adapters in ObjCExportCodeGenerator

It is very specific and isolated part.
This commit is contained in:
Svyatoslav Scherbina
2021-01-29 17:59:05 +03:00
committed by Vasily Levchenko
parent 2bd73cc44e
commit 39ef940a7b
@@ -229,13 +229,18 @@ internal class ObjCExportCodeGenerator(
return callFromBridge(conversion.owner.llvmFunction, listOf(value), resultLifetime) return callFromBridge(conversion.owner.llvmFunction, listOf(value), resultLifetime)
} }
private fun generateTypeAdapters(spec: ObjCExportCodeSpec?) { private fun generateTypeAdaptersForKotlinTypes(spec: ObjCExportCodeSpec?): List<ObjCTypeAdapter> {
val objCTypeAdapters = mutableListOf<ObjCTypeAdapter>() val types = spec?.types.orEmpty() + objCClassForAny
objCTypeAdapters += createTypeAdapter(objCClassForAny, superClass = null) val allReverseAdapters = createReverseAdapters(types)
return types.map {
val reverseAdapters = allReverseAdapters.getValue(it)
when (it) {
objCClassForAny -> {
createTypeAdapter(it, superClass = null, reverseAdapters)
}
spec?.types?.forEach {
objCTypeAdapters += when (it) {
is ObjCClassForKotlinClass -> { is ObjCClassForKotlinClass -> {
val superClass = it.superClassNotAny ?: objCClassForAny val superClass = it.superClassNotAny ?: objCClassForAny
@@ -243,12 +248,18 @@ internal class ObjCExportCodeGenerator(
// Note: it is generated only to be visible for linker. // Note: it is generated only to be visible for linker.
// Methods will be added at runtime. // Methods will be added at runtime.
createTypeAdapter(it, superClass) createTypeAdapter(it, superClass, reverseAdapters)
} }
is ObjCProtocolForKotlinInterface -> createTypeAdapter(it, superClass = null) is ObjCProtocolForKotlinInterface -> createTypeAdapter(it, superClass = null, reverseAdapters)
} }
} }
}
private fun generateTypeAdapters(spec: ObjCExportCodeSpec?) {
val objCTypeAdapters = mutableListOf<ObjCTypeAdapter>()
objCTypeAdapters += generateTypeAdaptersForKotlinTypes(spec)
spec?.files?.forEach { spec?.files?.forEach {
objCTypeAdapters += createTypeAdapterForFileClass(it) objCTypeAdapters += createTypeAdapterForFileClass(it)
@@ -1247,7 +1258,8 @@ private fun ObjCExportCodeGenerator.createTypeAdapterForFileClass(
private fun ObjCExportCodeGenerator.createTypeAdapter( private fun ObjCExportCodeGenerator.createTypeAdapter(
type: ObjCTypeForKotlinType, type: ObjCTypeForKotlinType,
superClass: ObjCClassForKotlinClass? superClass: ObjCClassForKotlinClass?,
reverseAdapters: List<ObjCExportCodeGenerator.KotlinToObjCMethodAdapter>
): ObjCExportCodeGenerator.ObjCTypeAdapter { ): ObjCExportCodeGenerator.ObjCTypeAdapter {
val irClass = type.irClassSymbol.owner val irClass = type.irClassSymbol.owner
val adapters = mutableListOf<ObjCExportCodeGenerator.ObjCToKotlinMethodAdapter>() val adapters = mutableListOf<ObjCExportCodeGenerator.ObjCToKotlinMethodAdapter>()
@@ -1278,20 +1290,18 @@ private fun ObjCExportCodeGenerator.createTypeAdapter(
}.let {} // Force exhaustive. }.let {} // Force exhaustive.
} }
val reverseAdapters = mutableListOf<ObjCExportCodeGenerator.KotlinToObjCMethodAdapter>() val additionalReverseAdapters = mutableListOf<ObjCExportCodeGenerator.KotlinToObjCMethodAdapter>()
if (type is ObjCClassForKotlinClass) { if (type is ObjCClassForKotlinClass) {
type.categoryMethods.forEach { type.categoryMethods.forEach {
adapters += createFinalMethodAdapter(it.baseMethod) adapters += createFinalMethodAdapter(it.baseMethod)
reverseAdapters += nonOverridableAdapter(it.baseMethod.selector, hasSelectorAmbiguity = false) additionalReverseAdapters += nonOverridableAdapter(it.baseMethod.selector, hasSelectorAmbiguity = false)
} }
adapters += createDirectAdapters(type, superClass) adapters += createDirectAdapters(type, superClass)
} }
reverseAdapters += createReverseAdapters(type)
val virtualAdapters = type.kotlinMethods val virtualAdapters = type.kotlinMethods
.filter { .filter {
val irFunction = it.baseMethod.symbol.owner val irFunction = it.baseMethod.symbol.owner
@@ -1339,10 +1349,16 @@ private fun ObjCExportCodeGenerator.createTypeAdapter(
adapters, adapters,
classAdapters, classAdapters,
virtualAdapters, virtualAdapters,
reverseAdapters reverseAdapters + additionalReverseAdapters
) )
} }
private fun ObjCExportCodeGenerator.createReverseAdapters(
types: List<ObjCTypeForKotlinType>
): Map<ObjCTypeForKotlinType, List<ObjCExportCodeGenerator.KotlinToObjCMethodAdapter>> {
return types.associateWith { createReverseAdapters(it) }
}
private fun ObjCExportCodeGenerator.createReverseAdapters( private fun ObjCExportCodeGenerator.createReverseAdapters(
type: ObjCTypeForKotlinType type: ObjCTypeForKotlinType
): List<ObjCExportCodeGenerator.KotlinToObjCMethodAdapter> { ): List<ObjCExportCodeGenerator.KotlinToObjCMethodAdapter> {