[FIR/IR generator] Introduce the common entry point for tree generators

This reduces code duplication.
This commit is contained in:
Sergej Jaskiewicz
2023-12-05 15:09:21 +01:00
committed by Space Team
parent 858343695c
commit 8d1907e2f5
26 changed files with 220 additions and 275 deletions
@@ -9,7 +9,6 @@ val compileOnly by configurations
runtimeOnly.extendsFrom(compileOnly)
dependencies {
implementation(project(":generators"))
implementation(project(":generators:tree-generator-common"))
implementation(project(":compiler:util"))
@@ -5,11 +5,8 @@
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.util.GeneratorsFileUtil
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.collectPreviouslyGeneratedFiles
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.removeExtraFilesFromPreviousGeneration
import org.jetbrains.kotlin.generators.tree.bind
import org.jetbrains.kotlin.generators.tree.printer.generateTree
import org.jetbrains.kotlin.ir.generator.model.markLeaves
import org.jetbrains.kotlin.ir.generator.print.*
import java.io.File
@@ -21,25 +18,24 @@ internal const val TREE_GENERATOR_README = "compiler/ir/ir.tree/tree-generator/R
fun main(args: Array<String>) {
val generationPath = args.firstOrNull()?.let { File(it) }
?: File("compiler/ir/ir.tree/gen").canonicalFile
val model = IrTree.build()
InterfaceAndAbstractClassConfigurator(model.elements).configureInterfacesAndAbstractClasses()
addPureAbstractElement(model.elements, elementBaseType)
markLeaves(model.elements)
val previouslyGeneratedFiles = collectPreviouslyGeneratedFiles(generationPath)
val generatedFiles = sequence {
yieldAll(printElements(generationPath, model))
yield(printVisitor(generationPath, model))
yield(printVisitorVoid(generationPath, model))
yield(printTransformer(generationPath, model))
yield(printTransformerVoid(generationPath, model))
yield(printTypeVisitor(generationPath, model))
yield(printFactory(generationPath, model))
}.map {
GeneratorsFileUtil.writeFileIfContentChanged(it.file, it.newText, logNotChanged = false)
it.file
}.toList()
removeExtraFilesFromPreviousGeneration(previouslyGeneratedFiles, generatedFiles)
generateTree(
generationPath,
TREE_GENERATOR_README,
model,
elementBaseType,
::ElementPrinter,
listOf(
elementVisitorType to ::VisitorPrinter,
elementVisitorVoidType to ::VisitorVoidPrinter,
elementTransformerType to ::TransformerPrinter.bind(model.rootElement),
elementTransformerVoidType to ::TransformerVoidPrinter,
typeTransformerType to ::TypeTransformerPrinter.bind(model.rootElement),
),
afterConfiguration = {
markLeaves(model.elements)
},
enableBaseTransformerTypeDetection = false,
addFiles = { add(printFactory(generationPath, model)) }
)
}
@@ -8,22 +8,19 @@ package org.jetbrains.kotlin.ir.generator.print
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.*
import org.jetbrains.kotlin.ir.generator.BASE_PACKAGE
import org.jetbrains.kotlin.ir.generator.TREE_GENERATOR_README
import org.jetbrains.kotlin.ir.generator.elementTransformerType
import org.jetbrains.kotlin.ir.generator.elementVisitorType
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.model.Field
import org.jetbrains.kotlin.ir.generator.model.ListField
import org.jetbrains.kotlin.ir.generator.model.Model
import org.jetbrains.kotlin.ir.generator.model.SingleField
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
import org.jetbrains.kotlin.generators.tree.ElementRef as GenericElementRef
private val transformIfNeeded = ArbitraryImportable("$BASE_PACKAGE.util", "transformIfNeeded")
private val transformInPlace = ArbitraryImportable("$BASE_PACKAGE.util", "transformInPlace")
private class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<Element, Field>(printer) {
internal class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<Element, Field>(printer) {
override fun makeFieldPrinter(printer: SmartPrinter) = object : AbstractFieldPrinter<Field>(printer) {
override fun forceMutable(field: Field) = field.isMutable
@@ -134,9 +131,3 @@ private class ElementPrinter(printer: SmartPrinter) : AbstractElementPrinter<Ele
}
}
}
fun printElements(generationPath: File, model: Model) = model.elements.map { element ->
printGeneratedType(generationPath, TREE_GENERATOR_README, element.packageName, element.typeName) {
ElementPrinter(this).printElement(element)
}
}
@@ -6,21 +6,17 @@
package org.jetbrains.kotlin.ir.generator.print
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.printBlock
import org.jetbrains.kotlin.ir.generator.elementTransformerType
import org.jetbrains.kotlin.ir.generator.elementVisitorType
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.model.Field
import org.jetbrains.kotlin.ir.generator.model.Model
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.withIndent
import java.io.File
private class TransformerPrinter(
internal class TransformerPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
val rootElement: Element,
private val rootElement: Element,
) : AbstractVisitorPrinter<Element, Field>(printer) {
override val visitorSuperType: ClassRef<PositionTypeParameterRef>
@@ -62,8 +58,3 @@ private class TransformerPrinter(
}
}
}
fun printTransformer(generationPath: File, model: Model): GeneratedFile =
printVisitorCommon(generationPath, model, elementTransformerType) { printer, visitorType ->
TransformerPrinter(printer, visitorType, model.rootElement)
}
@@ -7,19 +7,17 @@ package org.jetbrains.kotlin.ir.generator.print
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.*
import org.jetbrains.kotlin.generators.tree.printer.FunctionParameter
import org.jetbrains.kotlin.generators.tree.printer.printBlock
import org.jetbrains.kotlin.generators.tree.printer.printFunctionWithBlockBody
import org.jetbrains.kotlin.ir.generator.IrTree
import org.jetbrains.kotlin.ir.generator.TREE_GENERATOR_README
import org.jetbrains.kotlin.ir.generator.elementTransformerType
import org.jetbrains.kotlin.ir.generator.elementTransformerVoidType
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.model.Field
import org.jetbrains.kotlin.ir.generator.model.Model
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.withIndent
import java.io.File
private class TransformerVoidPrinter(
internal class TransformerVoidPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
) : AbstractVisitorPrinter<Element, Field>(printer) {
@@ -119,24 +117,21 @@ private class TransformerVoidPrinter(
}
}
}
}
fun printTransformerVoid(generationPath: File, model: Model): GeneratedFile =
printGeneratedType(
generationPath,
TREE_GENERATOR_README,
elementTransformerVoidType.packageName,
elementTransformerVoidType.simpleName,
) {
TransformerVoidPrinter(this, elementTransformerVoidType).printVisitor(model.elements)
println()
val transformerParameter = FunctionParameter("transformer", elementTransformerVoidType)
printFunctionWithBlockBody(
name = "transformChildrenVoid",
parameters = listOf(transformerParameter),
returnType = StandardTypes.unit,
extensionReceiver = IrTree.rootElement,
) {
println("transformChildren(", transformerParameter.name, ", null)")
context(ImportCollector)
override fun printVisitor(elements: List<Element>) {
super.printVisitor(elements)
printer.run {
println()
val transformerParameter = FunctionParameter("transformer", visitorType)
printFunctionWithBlockBody(
name = "transformChildrenVoid",
parameters = listOf(transformerParameter),
returnType = StandardTypes.unit,
extensionReceiver = IrTree.rootElement,
) {
println("transformChildren(", transformerParameter.name, ", null)")
}
}
}
}
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.ir.generator.print
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.FunctionParameter
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.printBlock
import org.jetbrains.kotlin.generators.tree.printer.printFunctionDeclaration
import org.jetbrains.kotlin.ir.generator.IrTree
@@ -16,17 +15,14 @@ import org.jetbrains.kotlin.ir.generator.irTypeType
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.model.Field
import org.jetbrains.kotlin.ir.generator.model.ListField
import org.jetbrains.kotlin.ir.generator.model.Model
import org.jetbrains.kotlin.ir.generator.model.SingleField
import org.jetbrains.kotlin.ir.generator.typeTransformerType
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.withIndent
import java.io.File
private class TypeTransformerPrinter(
internal class TypeTransformerPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
val rootElement: Element,
private val rootElement: Element,
) : AbstractVisitorPrinter<Element, Field>(printer) {
override val visitorSuperType: ClassRef<PositionTypeParameterRef>
@@ -155,8 +151,3 @@ private class TypeTransformerPrinter(
}
}
}
fun printTypeVisitor(generationPath: File, model: Model): GeneratedFile =
printVisitorCommon(generationPath, model, typeTransformerType) { printer, visitorType ->
TypeTransformerPrinter(printer, visitorType, model.rootElement)
}
@@ -6,14 +6,14 @@
package org.jetbrains.kotlin.ir.generator.print
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.ir.generator.*
import org.jetbrains.kotlin.ir.generator.model.*
import org.jetbrains.kotlin.ir.generator.model.Model
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.model.Field
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
private open class VisitorPrinter(printer: SmartPrinter, override val visitorType: ClassRef<*>) :
AbstractVisitorPrinter<Element, Field>(printer) {
internal class VisitorPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>
) : AbstractVisitorPrinter<Element, Field>(printer) {
override val visitorTypeParameters: List<TypeVariable>
get() = listOf(resultTypeVariable, dataTypeVariable)
@@ -29,6 +29,3 @@ private open class VisitorPrinter(printer: SmartPrinter, override val visitorTyp
override val allowTypeParametersInVisitorMethods: Boolean
get() = false
}
fun printVisitor(generationPath: File, model: Model) = printVisitorCommon(generationPath, model, elementVisitorType, ::VisitorPrinter)
@@ -9,14 +9,11 @@ import org.jetbrains.kotlin.generators.tree.AbstractVisitorVoidPrinter
import org.jetbrains.kotlin.generators.tree.ClassRef
import org.jetbrains.kotlin.generators.tree.PositionTypeParameterRef
import org.jetbrains.kotlin.ir.generator.elementVisitorType
import org.jetbrains.kotlin.ir.generator.elementVisitorVoidType
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.model.Field
import org.jetbrains.kotlin.ir.generator.model.Model
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
private class VisitorVoidPrinter(
internal class VisitorVoidPrinter(
printer: SmartPrinter,
override val visitorType: ClassRef<*>,
) : AbstractVisitorVoidPrinter<Element, Field>(printer) {
@@ -33,6 +30,3 @@ private class VisitorVoidPrinter(
override val overriddenVisitMethodsAreFinal: Boolean
get() = false
}
fun printVisitorVoid(generationPath: File, model: Model) =
printVisitorCommon(generationPath, model, elementVisitorVoidType, ::VisitorVoidPrinter)
@@ -5,26 +5,7 @@
package org.jetbrains.kotlin.ir.generator.print
import org.jetbrains.kotlin.generators.tree.AbstractVisitorPrinter
import org.jetbrains.kotlin.generators.tree.ClassRef
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType
import org.jetbrains.kotlin.ir.generator.TREE_GENERATOR_README
import org.jetbrains.kotlin.ir.generator.model.Element
import org.jetbrains.kotlin.ir.generator.model.Field
import org.jetbrains.kotlin.ir.generator.model.Model
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
internal fun printVisitorCommon(
generationPath: File,
model: Model,
visitorType: ClassRef<*>,
makePrinter: (SmartPrinter, ClassRef<*>) -> AbstractVisitorPrinter<Element, Field>,
): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, visitorType.packageName, visitorType.simpleName) {
makePrinter(this, visitorType).printVisitor(model.elements)
}
internal fun Element.getTransformExplicitType(): Element {
return generateSequence(this) { it.parentInVisitor }