[FIR/IR generator] Deduplicate interface/abstract class configuration

This commit is contained in:
Sergej Jaskiewicz
2023-09-18 19:52:53 +02:00
committed by Space Team
parent b231e69cd3
commit 8c6da9fddb
5 changed files with 113 additions and 110 deletions
@@ -42,8 +42,13 @@ class Element(
var visitorParent: ElementRef? = null
var transformerReturnType: Element? = null
val targetKind = config.typeKind
override var kind: ImplementationKind? = null
override var kind: ImplementationKind? = when (config.typeKind) {
TypeKind.Class -> ImplementationKind.AbstractClass
TypeKind.Interface -> ImplementationKind.Interface
null -> null
}
val typeName
get() = elementName2typeName(name)
@@ -5,44 +5,12 @@
package org.jetbrains.kotlin.ir.generator.model
import org.jetbrains.kotlin.generators.tree.ImplementationKind
import org.jetbrains.kotlin.generators.tree.TypeKind
import org.jetbrains.kotlin.generators.util.Node
import org.jetbrains.kotlin.generators.util.solveGraphForClassVsInterface
private class NodeImpl(val element: Element) : Node {
override val parents: List<Node>
get() = element.elementParents.map { NodeImpl(it.element) }
override val origin: Node
get() = this
override fun equals(other: Any?): Boolean =
other is NodeImpl && element == other.element
override fun hashCode(): Int =
element.hashCode()
}
import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner
import org.jetbrains.kotlin.generators.tree.InterfaceAndAbstractClassConfigurator
fun configureInterfacesAndAbstractClasses(elements: List<Element>) {
val nodes = elements.map(::NodeImpl)
val solution = solveGraphForClassVsInterface(
nodes,
nodes.filter { it.element.targetKind == TypeKind.Interface },
nodes.filter { it.element.targetKind == TypeKind.Class },
)
updateKinds(nodes, solution)
}
private fun updateKinds(nodes: List<NodeImpl>, solution: List<Boolean>) {
for (index in solution.indices) {
val isClass = solution[index]
val element = nodes[index].element
if (isClass) {
check(element.targetKind != TypeKind.Interface) { element }
element.kind = ImplementationKind.AbstractClass
} else {
element.kind = ImplementationKind.Interface
}
}
object : InterfaceAndAbstractClassConfigurator() {
override val elements: List<ImplementationKindOwner>
get() = elements
}.configureInterfacesAndAbstractClasses()
}