[FIR/IR generator] Make InterfaceAndAbstractClassConfigurator open

This commit is contained in:
Sergej Jaskiewicz
2023-11-14 17:52:27 +01:00
committed by Space Team
parent d5fa755e63
commit 0465c6d0ee
5 changed files with 13 additions and 33 deletions
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.tree.generator
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.printer.generateElements import org.jetbrains.kotlin.fir.tree.generator.printer.generateElements
import org.jetbrains.kotlin.fir.tree.generator.util.configureInterfacesAndAbstractClasses import org.jetbrains.kotlin.fir.tree.generator.util.FirInterfaceAndAbstractClassConfigurator
import org.jetbrains.kotlin.generators.tree.Model import org.jetbrains.kotlin.generators.tree.Model
import org.jetbrains.kotlin.generators.tree.detectBaseTransformerTypes import org.jetbrains.kotlin.generators.tree.detectBaseTransformerTypes
import org.jetbrains.kotlin.generators.tree.addPureAbstractElement import org.jetbrains.kotlin.generators.tree.addPureAbstractElement
@@ -25,7 +25,7 @@ fun main(args: Array<String>) {
val model = Model(FirTreeBuilder.elements, AbstractFirTreeBuilder.baseFirElement) val model = Model(FirTreeBuilder.elements, AbstractFirTreeBuilder.baseFirElement)
detectBaseTransformerTypes(model) detectBaseTransformerTypes(model)
ImplementationConfigurator.configureImplementations() ImplementationConfigurator.configureImplementations()
configureInterfacesAndAbstractClasses(FirTreeBuilder) FirInterfaceAndAbstractClassConfigurator(FirTreeBuilder).configureInterfacesAndAbstractClasses()
addPureAbstractElement(FirTreeBuilder.elements, pureAbstractElementType) addPureAbstractElement(FirTreeBuilder.elements, pureAbstractElementType)
BuilderConfigurator.configureBuilders() BuilderConfigurator.configureBuilders()
val previouslyGeneratedFiles = collectPreviouslyGeneratedFiles(generationPath) val previouslyGeneratedFiles = collectPreviouslyGeneratedFiles(generationPath)
@@ -10,14 +10,10 @@ import org.jetbrains.kotlin.fir.tree.generator.model.Implementation
import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner
import org.jetbrains.kotlin.generators.tree.InterfaceAndAbstractClassConfigurator import org.jetbrains.kotlin.generators.tree.InterfaceAndAbstractClassConfigurator
private class FirInterfaceAndAbstractClassConfigurator(builder: AbstractFirTreeBuilder) : InterfaceAndAbstractClassConfigurator() { internal class FirInterfaceAndAbstractClassConfigurator(builder: AbstractFirTreeBuilder) : InterfaceAndAbstractClassConfigurator(
elements = (builder.elements + builder.elements.flatMap { it.allImplementations })
override val elements: List<ImplementationKindOwner> = (builder.elements + builder.elements.flatMap { it.allImplementations }) ) {
override fun shouldBeFinalClass(element: ImplementationKindOwner, allParents: Set<ImplementationKindOwner>): Boolean = override fun shouldBeFinalClass(element: ImplementationKindOwner, allParents: Set<ImplementationKindOwner>): Boolean =
element is Implementation && element !in allParents element is Implementation && element !in allParents
} }
fun configureInterfacesAndAbstractClasses(builder: AbstractFirTreeBuilder) {
FirInterfaceAndAbstractClassConfigurator(builder).configureInterfacesAndAbstractClasses()
}
@@ -5,11 +5,14 @@
package org.jetbrains.kotlin.ir.generator package org.jetbrains.kotlin.ir.generator
import org.jetbrains.kotlin.generators.tree.InterfaceAndAbstractClassConfigurator
import org.jetbrains.kotlin.generators.tree.addPureAbstractElement import org.jetbrains.kotlin.generators.tree.addPureAbstractElement
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.collectPreviouslyGeneratedFiles import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.collectPreviouslyGeneratedFiles
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.removeExtraFilesFromPreviousGeneration import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.removeExtraFilesFromPreviousGeneration
import org.jetbrains.kotlin.ir.generator.model.* import org.jetbrains.kotlin.ir.generator.model.addWalkableChildren
import org.jetbrains.kotlin.ir.generator.model.markLeaves
import org.jetbrains.kotlin.ir.generator.model.processFieldOverrides
import org.jetbrains.kotlin.ir.generator.print.* import org.jetbrains.kotlin.ir.generator.print.*
import java.io.File import java.io.File
@@ -23,7 +26,7 @@ fun main(args: Array<String>) {
val model = IrTree.build() val model = IrTree.build()
configureInterfacesAndAbstractClasses(model.elements) InterfaceAndAbstractClassConfigurator(model.elements).configureInterfacesAndAbstractClasses()
addPureAbstractElement(model.elements, elementBaseType) addPureAbstractElement(model.elements, elementBaseType)
markLeaves(model.elements) markLeaves(model.elements)
processFieldOverrides(model.elements) processFieldOverrides(model.elements)
@@ -1,16 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.ir.generator.model
import org.jetbrains.kotlin.generators.tree.ImplementationKindOwner
import org.jetbrains.kotlin.generators.tree.InterfaceAndAbstractClassConfigurator
fun configureInterfacesAndAbstractClasses(elements: List<Element>) {
object : InterfaceAndAbstractClassConfigurator() {
override val elements: List<ImplementationKindOwner>
get() = elements
}.configureInterfacesAndAbstractClasses()
}
@@ -10,8 +10,10 @@ import org.jetbrains.kotlin.generators.util.solveGraphForClassVsInterface
/** /**
* Decides which element in the tree must be an (abstract) class, and which must be an interface. * Decides which element in the tree must be an (abstract) class, and which must be an interface.
*
* @property elements The list of elements of the tree to infer their [ImplementationKind].
*/ */
abstract class InterfaceAndAbstractClassConfigurator { open class InterfaceAndAbstractClassConfigurator(val elements: List<ImplementationKindOwner>) {
private inner class NodeImpl(val element: ImplementationKindOwner) : Node { private inner class NodeImpl(val element: ImplementationKindOwner) : Node {
override val parents: List<NodeImpl> override val parents: List<NodeImpl>
@@ -25,11 +27,6 @@ abstract class InterfaceAndAbstractClassConfigurator {
override fun hashCode(): Int = element.hashCode() override fun hashCode(): Int = element.hashCode()
} }
/**
* The list of elements of the tree to infer their [ImplementationKind].
*/
protected abstract val elements: List<ImplementationKindOwner>
/** /**
* If [element]'s kind was inferred as abstract class, allows to forcibly make that element a final class instead. * If [element]'s kind was inferred as abstract class, allows to forcibly make that element a final class instead.
*/ */