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,30 +38,35 @@ 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)
@Suppress("unchecked_cast")
for (clazz in mapping.register.keys) {
val maybeDescriptor: NodeDescriptor<*>? = mapping.register[clazz]
maybeDescriptor?.let { descriptor ->
if (descriptor is ChainedDescriptor<*>) {
val chainedDescriptor = descriptor as ChainedDescriptor<Any>
val superClass: Class<*> = clazz.superclass
val maybeSuperDescriptor: NodeDescriptor<*>? = mapping.descriptorForClass(superClass)
maybeSuperDescriptor?.let { superDescriptor ->
if (superDescriptor is ChainedDescriptor<*>) {
chainedDescriptor.setSuper(superDescriptor as ChainedDescriptor<Any>)
}
}
}
}
}
return mapping return mapping
} }
} }
fun <T> register(clazz: Class<T>, descriptor: NodeDescriptor<T>) { fun <T> register(clazz: Class<T>, descriptor: NodeDescriptor<T>) {
register[clazz] = descriptor register[clazz] = descriptor
setSuper()
}
private fun setSuper() {
@Suppress("unchecked_cast")
for (clazz in this.register.keys) {
val maybeDescriptor: NodeDescriptor<*>? = this.register[clazz]
maybeDescriptor?.let { descriptor ->
if (descriptor is ChainedDescriptor<*>) {
val chainedDescriptor = descriptor as ChainedDescriptor<Any>
val superClass: Class<*> = clazz.superclass
val maybeSuperDescriptor: NodeDescriptor<*>? = this.descriptorForClass(superClass)
maybeSuperDescriptor?.let { superDescriptor ->
if (superDescriptor is ChainedDescriptor<*>) {
chainedDescriptor.setSuper(superDescriptor as ChainedDescriptor<Any>)
}
}
}
}
}
} }
fun <T> descriptorForClass(clazz: Class<T>): NodeDescriptor<T>? { fun <T> descriptorForClass(clazz: Class<T>): NodeDescriptor<T>? {