[FIR/IR generator] Factor out printing the preamble in generated files
This commit is contained in:
committed by
Space Team
parent
a33da2a1c6
commit
417aa236fb
+4
-13
@@ -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()) {
|
||||
|
||||
+3
-14
@@ -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) {
|
||||
|
||||
+4
-13
@@ -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() {
|
||||
|
||||
+3
-12
@@ -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()
|
||||
}
|
||||
|
||||
+4
-14
@@ -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())
|
||||
}
|
||||
|
||||
-3
@@ -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
-35
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user