Consolidate generating reverse adapters in ObjCExportCodeGenerator
It is very specific and isolated part.
This commit is contained in:
committed by
Vasily Levchenko
parent
2bd73cc44e
commit
39ef940a7b
+29
-13
@@ -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> {
|
||||||
|
|||||||
Reference in New Issue
Block a user