[FIR/IR generator] Factor out printing the preamble in generated files

This commit is contained in:
Sergej Jaskiewicz
2023-09-14 20:30:42 +02:00
committed by Space Team
parent a33da2a1c6
commit 417aa236fb
438 changed files with 1373 additions and 2233 deletions
@@ -7,31 +7,22 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.declarationAttributesType
import org.jetbrains.kotlin.fir.tree.generator.model.*
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType
import org.jetbrains.kotlin.generators.tree.typeWithArguments
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.withIndent
import java.io.File
fun Builder.generateCode(generationPath: File): GeneratedFile {
val dir = generationPath.resolve(packageName.replace(".", "/"))
val file = File(dir, "$type.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("@file:Suppress(\"DuplicatedCode\", \"unused\")")
println()
println("package $packageName")
println()
fun Builder.generateCode(generationPath: File): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, packageName, type, fileSuppressions = listOf("DuplicatedCode", "unused")) {
val imports = collectImports()
imports.forEach { println("import $it") }
if (imports.isNotEmpty()) {
println()
}
printGeneratedMessage()
printBuilder(this@generateCode)
}
return GeneratedFile(file, stringBuilder.toString())
}
private fun SmartPrinter.printBuilder(builder: Builder) {
if (builder is LeafBuilder && builder.allFields.isEmpty()) {
@@ -11,31 +11,20 @@ import org.jetbrains.kotlin.fir.tree.generator.model.Field
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
import org.jetbrains.kotlin.fir.tree.generator.util.get
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.braces
import org.jetbrains.kotlin.generators.tree.printer.multipleUpperBoundsList
import org.jetbrains.kotlin.generators.tree.printer.typeParameters
import org.jetbrains.kotlin.generators.tree.printer.*
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.withIndent
import java.io.File
fun Element.generateCode(generationPath: File): GeneratedFile {
val dir = generationPath.resolve(packageName.replace(".", "/"))
val file = File(dir, "$type.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $packageName")
println()
fun Element.generateCode(generationPath: File): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, packageName, type) {
val imports = collectImports()
imports.forEach { println("import $it") }
if (imports.isNotEmpty()) {
println()
}
printGeneratedMessage()
printElement(this@generateCode)
}
return GeneratedFile(file, stringBuilder.toString())
}
fun SmartPrinter.printElement(element: Element) {
with(element) {
@@ -8,33 +8,24 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.model.*
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.braces
import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType
import org.jetbrains.kotlin.generators.tree.printer.typeParameters
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
import org.jetbrains.kotlin.utils.withIndent
import java.io.File
fun Implementation.generateCode(generationPath: File): GeneratedFile {
val dir = generationPath.resolve(packageName.replace(".", "/"))
val file = File(dir, "$type.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("@file:Suppress(\"DuplicatedCode\", \"unused\")")
println()
println("package $packageName")
println()
fun Implementation.generateCode(generationPath: File): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, packageName, type, fileSuppressions = listOf("DuplicatedCode", "unused")) {
val imports = collectImports()
imports.forEach { println("import $it") }
if (imports.isNotEmpty()) {
println()
}
printGeneratedMessage()
printImplementation(this@generateCode)
}
return GeneratedFile(file, stringBuilder.toString())
}
fun SmartPrinter.printImplementation(implementation: Implementation) {
fun Field.transform() {
@@ -6,15 +6,16 @@
package org.jetbrains.kotlin.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil.GENERATED_MESSAGE
import org.jetbrains.kotlin.utils.SmartPrinter
import java.io.File
private val COPYRIGHT = File("license/COPYRIGHT_HEADER.txt").readText()
const val VISITOR_PACKAGE = "org.jetbrains.kotlin.fir.visitors"
const val BASE_PACKAGE = "org.jetbrains.kotlin.fir"
internal const val TREE_GENERATOR_README = "compiler/fir/tree/tree-generator/Readme.md"
fun generateElements(builder: AbstractFirTreeBuilder, generationPath: File): List<GeneratedFile> {
val generatedFiles = mutableListOf<GeneratedFile>()
builder.elements.mapTo(generatedFiles) { it.generateCode(generationPath) }
@@ -29,13 +30,3 @@ fun generateElements(builder: AbstractFirTreeBuilder, generationPath: File): Lis
generatedFiles += printTransformer(builder.elements, generationPath)
return generatedFiles
}
fun SmartPrinter.printCopyright() {
println(COPYRIGHT)
println()
}
fun SmartPrinter.printGeneratedMessage() {
println(GENERATED_MESSAGE)
println()
}
@@ -7,26 +7,18 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.model.Element
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.multipleUpperBoundsList
import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType
import org.jetbrains.kotlin.generators.tree.printer.typeParameters
import org.jetbrains.kotlin.generators.tree.typeWithArguments
import org.jetbrains.kotlin.utils.SmartPrinter
import org.jetbrains.kotlin.utils.withIndent
import java.io.File
fun printTransformer(elements: List<Element>, generationPath: File): GeneratedFile {
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
val file = File(dir, "FirTransformer.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $VISITOR_PACKAGE")
println()
fun printTransformer(elements: List<Element>, generationPath: File): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, VISITOR_PACKAGE, "FirTransformer") {
elements.forEach { println("import ${it.fullQualifiedName}") }
println()
printGeneratedMessage()
println("abstract class FirTransformer<in D> : FirVisitor<FirElement, D>() {")
println()
withIndent {
@@ -66,5 +58,3 @@ fun printTransformer(elements: List<Element>, generationPath: File): GeneratedFi
}
println("}")
}
return GeneratedFile(file, stringBuilder.toString())
}
@@ -11,9 +11,6 @@ import org.jetbrains.kotlin.fir.tree.generator.model.*
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
import org.jetbrains.kotlin.generators.tree.*
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
import java.io.File
class GeneratedFile(val file: File, val newText: String)
enum class ImportKind(val postfix: String) {
Element(""), Implementation(".impl"), Builder(".builder")
@@ -8,7 +8,9 @@ package org.jetbrains.kotlin.fir.tree.generator.printer
import org.jetbrains.kotlin.fir.tree.generator.FirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.model.Element
import org.jetbrains.kotlin.generators.tree.printer.GeneratedFile
import org.jetbrains.kotlin.generators.tree.printer.multipleUpperBoundsList
import org.jetbrains.kotlin.generators.tree.printer.printGeneratedType
import org.jetbrains.kotlin.generators.tree.printer.typeParameters
import org.jetbrains.kotlin.generators.tree.typeWithArguments
import org.jetbrains.kotlin.utils.SmartPrinter
@@ -32,16 +34,9 @@ private fun Element.getNameOfSupertypeForDefaultVisiting(): String {
fun printVisitor(elements: List<Element>, generationPath: File, visitSuperTypeByDefault: Boolean): GeneratedFile {
val className = if (visitSuperTypeByDefault) "FirDefaultVisitor" else "FirVisitor"
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
val file = File(dir, "$className.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $VISITOR_PACKAGE")
println()
return printGeneratedType(generationPath, TREE_GENERATOR_README, VISITOR_PACKAGE, className) {
elements.forEach { println("import ${it.fullQualifiedName}") }
println()
printGeneratedMessage()
print("abstract class $className<out R, in D> ")
if (visitSuperTypeByDefault) {
@@ -76,22 +71,13 @@ fun printVisitor(elements: List<Element>, generationPath: File, visitSuperTypeBy
popIndent()
println("}")
}
return GeneratedFile(file, stringBuilder.toString())
}
fun printVisitorVoid(elements: List<Element>, generationPath: File): GeneratedFile {
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
val file = File(dir, "FirVisitorVoid.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $VISITOR_PACKAGE")
println()
fun printVisitorVoid(elements: List<Element>, generationPath: File): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, VISITOR_PACKAGE, "FirVisitorVoid") {
elements.forEach { println("import ${it.fullQualifiedName}") }
println()
printGeneratedMessage()
println("abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {")
withIndent {
@@ -124,23 +110,12 @@ fun printVisitorVoid(elements: List<Element>, generationPath: File): GeneratedFi
}
println("}")
}
return GeneratedFile(file, stringBuilder.toString())
}
fun printDefaultVisitorVoid(elements: List<Element>, generationPath: File): GeneratedFile {
val className = "FirDefaultVisitorVoid"
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
val file = File(dir, "$className.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $VISITOR_PACKAGE")
println()
fun printDefaultVisitorVoid(elements: List<Element>, generationPath: File): GeneratedFile =
printGeneratedType(generationPath, TREE_GENERATOR_README, VISITOR_PACKAGE, "FirDefaultVisitorVoid") {
elements.forEach { println("import ${it.fullQualifiedName}") }
println()
printGeneratedMessage()
println("abstract class $className : FirVisitorVoid() {")
println("abstract class FirDefaultVisitorVoid : FirVisitorVoid() {")
pushIndent()
for (element in elements) {
@@ -154,5 +129,3 @@ fun printDefaultVisitorVoid(elements: List<Element>, generationPath: File): Gene
popIndent()
println("}")
}
return GeneratedFile(file, stringBuilder.toString())
}