[Test] Fail if there are changes in generated fir tree files in teamcity build

This commit is contained in:
Dmitriy Novozhilov
2021-01-29 17:45:55 +03:00
parent 297288e984
commit 771600077c
11 changed files with 69 additions and 40 deletions
@@ -11,6 +11,7 @@ val compileOnly by configurations
runtimeOnly.extendsFrom(compileOnly)
dependencies {
implementation(project(":generators"))
implementation(project(":core:compiler.common"))
implementation(project(":compiler:frontend.common"))
implementation(project(":compiler:fir:cones"))
@@ -5,8 +5,9 @@
package org.jetbrains.kotlin.fir.tree.generator
import org.jetbrains.kotlin.fir.tree.generator.printer.printElements
import org.jetbrains.kotlin.fir.tree.generator.printer.generateElements
import org.jetbrains.kotlin.fir.tree.generator.util.*
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
import java.io.File
@@ -19,8 +20,9 @@ fun main(args: Array<String>) {
ImplementationConfigurator.configureImplementations()
configureInterfacesAndAbstractClasses(FirTreeBuilder)
BuilderConfigurator.configureBuilders()
removePreviousGeneratedFiles(generationPath)
printElements(FirTreeBuilder, generationPath)
// printFieldUsageTable(FirTreeBuilder)
// printHierarchyGraph(FirTreeBuilder)
val previouslyGeneratedFiles = collectPreviouslyGeneratedFiles(generationPath)
val generatedFiles = generateElements(FirTreeBuilder, generationPath)
generatedFiles.forEach { GeneratorsFileUtil.writeFileIfContentChanged(it.file, it.newText, logNotChanged = false) }
removeExtraFilesFromPreviousGeneration(previouslyGeneratedFiles, generatedFiles.map { it.file })
}
@@ -9,11 +9,11 @@ import org.jetbrains.kotlin.fir.tree.generator.declarationAttributesType
import org.jetbrains.kotlin.fir.tree.generator.model.*
import java.io.File
fun Builder.generateCode(generationPath: File) {
fun Builder.generateCode(generationPath: File): GeneratedFile {
val dir = generationPath.resolve(packageName.replace(".", "/"))
dir.mkdirs()
val file = File(dir, "$type.kt")
file.useSmartPrinter {
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $packageName")
println()
@@ -25,6 +25,7 @@ fun Builder.generateCode(generationPath: File) {
printGeneratedMessage()
printBuilder(this@generateCode)
}
return GeneratedFile(file, stringBuilder.toString())
}
private fun SmartPrinter.printBuilder(builder: Builder) {
@@ -12,11 +12,11 @@ import org.jetbrains.kotlin.fir.tree.generator.util.get
import java.io.File
fun Element.generateCode(generationPath: File) {
fun Element.generateCode(generationPath: File): GeneratedFile {
val dir = generationPath.resolve(packageName.replace(".", "/"))
dir.mkdirs()
val file = File(dir, "$type.kt")
file.useSmartPrinter {
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $packageName")
println()
@@ -28,6 +28,7 @@ fun Element.generateCode(generationPath: File) {
printGeneratedMessage()
printElement(this@generateCode)
}
return GeneratedFile(file, stringBuilder.toString())
}
fun SmartPrinter.printElement(element: Element) {
@@ -10,11 +10,11 @@ import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
import java.io.File
fun Implementation.generateCode(generationPath: File) {
fun Implementation.generateCode(generationPath: File): GeneratedFile {
val dir = generationPath.resolve(packageName.replace(".", "/"))
dir.mkdirs()
val file = File(dir, "$type.kt")
file.useSmartPrinter {
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $packageName")
println()
@@ -26,6 +26,7 @@ fun Implementation.generateCode(generationPath: File) {
printGeneratedMessage()
printImplementation(this@generateCode)
}
return GeneratedFile(file, stringBuilder.toString())
}
fun SmartPrinter.printImplementation(implementation: Implementation) {
@@ -19,15 +19,17 @@ val GENERATED_MESSAGE = """
*/
""".trimIndent()
fun printElements(builder: AbstractFirTreeBuilder, generationPath: File) {
builder.elements.forEach { it.generateCode(generationPath) }
builder.elements.flatMap { it.allImplementations }.forEach { it.generateCode(generationPath) }
builder.elements.flatMap { it.allImplementations }.mapNotNull { it.builder }.forEach { it.generateCode(generationPath) }
builder.intermediateBuilders.forEach { it.generateCode(generationPath) }
fun generateElements(builder: AbstractFirTreeBuilder, generationPath: File): List<GeneratedFile> {
val generatedFiles = mutableListOf<GeneratedFile>()
builder.elements.mapTo(generatedFiles) { it.generateCode(generationPath) }
builder.elements.flatMap { it.allImplementations }.mapTo(generatedFiles) { it.generateCode(generationPath) }
builder.elements.flatMap { it.allImplementations }.mapNotNull { it.builder }.mapTo(generatedFiles) { it.generateCode(generationPath) }
builder.intermediateBuilders.mapTo(generatedFiles) { it.generateCode(generationPath) }
printVisitor(builder.elements, generationPath)
printVisitorVoid(builder.elements, generationPath)
printTransformer(builder.elements, generationPath)
generatedFiles += printVisitor(builder.elements, generationPath)
generatedFiles += printVisitorVoid(builder.elements, generationPath)
generatedFiles += printTransformer(builder.elements, generationPath)
return generatedFiles
}
fun SmartPrinter.printCopyright() {
@@ -11,10 +11,11 @@ import org.jetbrains.kotlin.fir.tree.generator.model.Element
import java.io.File
fun printTransformer(elements: List<Element>, generationPath: File) {
fun printTransformer(elements: List<Element>, generationPath: File): GeneratedFile {
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
dir.mkdirs()
File(dir, "FirTransformer.kt").useSmartPrinter {
val file = File(dir, "FirTransformer.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $VISITOR_PACKAGE")
println()
@@ -62,4 +63,5 @@ fun printTransformer(elements: List<Element>, generationPath: File) {
}
println("}")
}
return GeneratedFile(file, stringBuilder.toString())
}
@@ -10,6 +10,10 @@ import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder
import org.jetbrains.kotlin.fir.tree.generator.firImplementationDetailType
import org.jetbrains.kotlin.fir.tree.generator.model.*
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import java.io.File
class GeneratedFile(val file: File, val newText: String)
enum class ImportKind(val postfix: String) {
Element(""), Implementation(".impl"), Builder(".builder")
@@ -7,14 +7,13 @@ 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 java.io.File
import java.io.PrintWriter
fun printVisitor(elements: List<Element>, generationPath: File) {
fun printVisitor(elements: List<Element>, generationPath: File): GeneratedFile {
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
dir.mkdirs()
File(dir, "FirVisitor.kt").useSmartPrinter {
val file = File(dir, "FirVisitor.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $VISITOR_PACKAGE")
println()
@@ -37,13 +36,15 @@ fun printVisitor(elements: List<Element>, generationPath: File) {
popIndent()
println("}")
}
return GeneratedFile(file, stringBuilder.toString())
}
fun printVisitorVoid(elements: List<Element>, generationPath: File) {
fun printVisitorVoid(elements: List<Element>, generationPath: File): GeneratedFile {
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
dir.mkdirs()
File(dir, "FirVisitorVoid.kt").useSmartPrinter {
val file = File(dir, "FirVisitorVoid.kt")
val stringBuilder = StringBuilder()
SmartPrinter(stringBuilder).apply {
printCopyright()
println("package $VISITOR_PACKAGE")
println()
@@ -83,4 +84,5 @@ fun printVisitorVoid(elements: List<Element>, generationPath: File) {
}
println("}")
}
return GeneratedFile(file, stringBuilder.toString())
}
@@ -6,12 +6,25 @@
package org.jetbrains.kotlin.fir.tree.generator.util
import org.jetbrains.kotlin.fir.tree.generator.printer.GENERATED_MESSAGE
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
import java.io.File
fun removePreviousGeneratedFiles(generationPath: File) {
generationPath.walkTopDown().forEach {
if (it.isFile && it.readText().contains(GENERATED_MESSAGE)) {
it.delete()
fun collectPreviouslyGeneratedFiles(generationPath: File): List<File> {
return generationPath.walkTopDown().filter {
it.isFile && it.readText().contains(GENERATED_MESSAGE)
}.toList()
}
fun removeExtraFilesFromPreviousGeneration(previouslyGeneratedFiles: List<File>, generatedFiles: List<File>) {
val generatedFilesPath = generatedFiles.mapTo(mutableSetOf()) { it.absolutePath }
for (file in previouslyGeneratedFiles) {
if (file.absolutePath !in generatedFilesPath) {
if (GeneratorsFileUtil.isTeamCityBuild) {
GeneratorsFileUtil.assertTeamCityMode()
}
println("Deleted: ${file.absolutePath}")
file.delete()
}
}
}
}
+2 -2
View File
@@ -11,7 +11,7 @@ import java.io.IOException
import kotlin.io.path.*
object GeneratorsFileUtil {
private val isTeamCityBuild: Boolean = System.getProperty("TEAMCITY_VERSION") != null
val isTeamCityBuild: Boolean = System.getProperty("TEAMCITY_VERSION") != null
@OptIn(ExperimentalPathApi::class)
@JvmStatic
@@ -47,7 +47,7 @@ object GeneratorsFileUtil {
println()
}
private fun assertTeamCityMode(): Nothing {
fun assertTeamCityMode(): Nothing {
throw IllegalStateException("You should commit all newly generated files before pushing them to TeamCity")
}