Fix superclass chaining when adding descriptor late

Summary: External frameworks such as litho add their descriptors with register descriptor, we need to make sure that we set up the superclass chaing for these

Reviewed By: lblasa

Differential Revision: D40021843

fbshipit-source-id: 41666e5e3a31f249f7dfd550c15d747d394d2a8f
This commit is contained in:
Luke De Feo
2022-10-10 04:13:06 -07:00
committed by Facebook GitHub Bot
parent de1eece900
commit c9983edb1a

View File

@@ -38,14 +38,26 @@ class DescriptorRegister {
mapping.register(android.app.Fragment::class.java, FragmentFrameworkDescriptor) mapping.register(android.app.Fragment::class.java, FragmentFrameworkDescriptor)
mapping.register(androidx.fragment.app.Fragment::class.java, FragmentSupportDescriptor) mapping.register(androidx.fragment.app.Fragment::class.java, FragmentSupportDescriptor)
return mapping
}
}
fun <T> register(clazz: Class<T>, descriptor: NodeDescriptor<T>) {
register[clazz] = descriptor
setSuper()
}
private fun setSuper() {
@Suppress("unchecked_cast") @Suppress("unchecked_cast")
for (clazz in mapping.register.keys) { for (clazz in this.register.keys) {
val maybeDescriptor: NodeDescriptor<*>? = mapping.register[clazz] val maybeDescriptor: NodeDescriptor<*>? = this.register[clazz]
maybeDescriptor?.let { descriptor -> maybeDescriptor?.let { descriptor ->
if (descriptor is ChainedDescriptor<*>) { if (descriptor is ChainedDescriptor<*>) {
val chainedDescriptor = descriptor as ChainedDescriptor<Any> val chainedDescriptor = descriptor as ChainedDescriptor<Any>
val superClass: Class<*> = clazz.superclass val superClass: Class<*> = clazz.superclass
val maybeSuperDescriptor: NodeDescriptor<*>? = mapping.descriptorForClass(superClass)
val maybeSuperDescriptor: NodeDescriptor<*>? = this.descriptorForClass(superClass)
maybeSuperDescriptor?.let { superDescriptor -> maybeSuperDescriptor?.let { superDescriptor ->
if (superDescriptor is ChainedDescriptor<*>) { if (superDescriptor is ChainedDescriptor<*>) {
@@ -55,13 +67,6 @@ class DescriptorRegister {
} }
} }
} }
return mapping
}
}
fun <T> register(clazz: Class<T>, descriptor: NodeDescriptor<T>) {
register[clazz] = descriptor
} }
fun <T> descriptorForClass(clazz: Class<T>): NodeDescriptor<T>? { fun <T> descriptorForClass(clazz: Class<T>): NodeDescriptor<T>? {