[Test] Fail if there are changes in generated fir tree files in teamcity build
This commit is contained in:
@@ -11,6 +11,7 @@ val compileOnly by configurations
|
|||||||
runtimeOnly.extendsFrom(compileOnly)
|
runtimeOnly.extendsFrom(compileOnly)
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(":generators"))
|
||||||
implementation(project(":core:compiler.common"))
|
implementation(project(":core:compiler.common"))
|
||||||
implementation(project(":compiler:frontend.common"))
|
implementation(project(":compiler:frontend.common"))
|
||||||
implementation(project(":compiler:fir:cones"))
|
implementation(project(":compiler:fir:cones"))
|
||||||
|
|||||||
+7
-5
@@ -5,8 +5,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.tree.generator
|
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.fir.tree.generator.util.*
|
||||||
|
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
|
|
||||||
@@ -19,8 +20,9 @@ fun main(args: Array<String>) {
|
|||||||
ImplementationConfigurator.configureImplementations()
|
ImplementationConfigurator.configureImplementations()
|
||||||
configureInterfacesAndAbstractClasses(FirTreeBuilder)
|
configureInterfacesAndAbstractClasses(FirTreeBuilder)
|
||||||
BuilderConfigurator.configureBuilders()
|
BuilderConfigurator.configureBuilders()
|
||||||
removePreviousGeneratedFiles(generationPath)
|
val previouslyGeneratedFiles = collectPreviouslyGeneratedFiles(generationPath)
|
||||||
printElements(FirTreeBuilder, generationPath)
|
val generatedFiles = generateElements(FirTreeBuilder, generationPath)
|
||||||
// printFieldUsageTable(FirTreeBuilder)
|
generatedFiles.forEach { GeneratorsFileUtil.writeFileIfContentChanged(it.file, it.newText, logNotChanged = false) }
|
||||||
// printHierarchyGraph(FirTreeBuilder)
|
removeExtraFilesFromPreviousGeneration(previouslyGeneratedFiles, generatedFiles.map { it.file })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -9,11 +9,11 @@ import org.jetbrains.kotlin.fir.tree.generator.declarationAttributesType
|
|||||||
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun Builder.generateCode(generationPath: File) {
|
fun Builder.generateCode(generationPath: File): GeneratedFile {
|
||||||
val dir = generationPath.resolve(packageName.replace(".", "/"))
|
val dir = generationPath.resolve(packageName.replace(".", "/"))
|
||||||
dir.mkdirs()
|
|
||||||
val file = File(dir, "$type.kt")
|
val file = File(dir, "$type.kt")
|
||||||
file.useSmartPrinter {
|
val stringBuilder = StringBuilder()
|
||||||
|
SmartPrinter(stringBuilder).apply {
|
||||||
printCopyright()
|
printCopyright()
|
||||||
println("package $packageName")
|
println("package $packageName")
|
||||||
println()
|
println()
|
||||||
@@ -25,6 +25,7 @@ fun Builder.generateCode(generationPath: File) {
|
|||||||
printGeneratedMessage()
|
printGeneratedMessage()
|
||||||
printBuilder(this@generateCode)
|
printBuilder(this@generateCode)
|
||||||
}
|
}
|
||||||
|
return GeneratedFile(file, stringBuilder.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun SmartPrinter.printBuilder(builder: Builder) {
|
private fun SmartPrinter.printBuilder(builder: Builder) {
|
||||||
|
|||||||
+4
-3
@@ -12,11 +12,11 @@ import org.jetbrains.kotlin.fir.tree.generator.util.get
|
|||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun Element.generateCode(generationPath: File) {
|
fun Element.generateCode(generationPath: File): GeneratedFile {
|
||||||
val dir = generationPath.resolve(packageName.replace(".", "/"))
|
val dir = generationPath.resolve(packageName.replace(".", "/"))
|
||||||
dir.mkdirs()
|
|
||||||
val file = File(dir, "$type.kt")
|
val file = File(dir, "$type.kt")
|
||||||
file.useSmartPrinter {
|
val stringBuilder = StringBuilder()
|
||||||
|
SmartPrinter(stringBuilder).apply {
|
||||||
printCopyright()
|
printCopyright()
|
||||||
println("package $packageName")
|
println("package $packageName")
|
||||||
println()
|
println()
|
||||||
@@ -28,6 +28,7 @@ fun Element.generateCode(generationPath: File) {
|
|||||||
printGeneratedMessage()
|
printGeneratedMessage()
|
||||||
printElement(this@generateCode)
|
printElement(this@generateCode)
|
||||||
}
|
}
|
||||||
|
return GeneratedFile(file, stringBuilder.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SmartPrinter.printElement(element: Element) {
|
fun SmartPrinter.printElement(element: Element) {
|
||||||
|
|||||||
+4
-3
@@ -10,11 +10,11 @@ import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
|
|||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun Implementation.generateCode(generationPath: File) {
|
fun Implementation.generateCode(generationPath: File): GeneratedFile {
|
||||||
val dir = generationPath.resolve(packageName.replace(".", "/"))
|
val dir = generationPath.resolve(packageName.replace(".", "/"))
|
||||||
dir.mkdirs()
|
|
||||||
val file = File(dir, "$type.kt")
|
val file = File(dir, "$type.kt")
|
||||||
file.useSmartPrinter {
|
val stringBuilder = StringBuilder()
|
||||||
|
SmartPrinter(stringBuilder).apply {
|
||||||
printCopyright()
|
printCopyright()
|
||||||
println("package $packageName")
|
println("package $packageName")
|
||||||
println()
|
println()
|
||||||
@@ -26,6 +26,7 @@ fun Implementation.generateCode(generationPath: File) {
|
|||||||
printGeneratedMessage()
|
printGeneratedMessage()
|
||||||
printImplementation(this@generateCode)
|
printImplementation(this@generateCode)
|
||||||
}
|
}
|
||||||
|
return GeneratedFile(file, stringBuilder.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SmartPrinter.printImplementation(implementation: Implementation) {
|
fun SmartPrinter.printImplementation(implementation: Implementation) {
|
||||||
|
|||||||
+10
-8
@@ -19,15 +19,17 @@ val GENERATED_MESSAGE = """
|
|||||||
*/
|
*/
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
fun printElements(builder: AbstractFirTreeBuilder, generationPath: File) {
|
fun generateElements(builder: AbstractFirTreeBuilder, generationPath: File): List<GeneratedFile> {
|
||||||
builder.elements.forEach { it.generateCode(generationPath) }
|
val generatedFiles = mutableListOf<GeneratedFile>()
|
||||||
builder.elements.flatMap { it.allImplementations }.forEach { it.generateCode(generationPath) }
|
builder.elements.mapTo(generatedFiles) { it.generateCode(generationPath) }
|
||||||
builder.elements.flatMap { it.allImplementations }.mapNotNull { it.builder }.forEach { it.generateCode(generationPath) }
|
builder.elements.flatMap { it.allImplementations }.mapTo(generatedFiles) { it.generateCode(generationPath) }
|
||||||
builder.intermediateBuilders.forEach { 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)
|
generatedFiles += printVisitor(builder.elements, generationPath)
|
||||||
printVisitorVoid(builder.elements, generationPath)
|
generatedFiles += printVisitorVoid(builder.elements, generationPath)
|
||||||
printTransformer(builder.elements, generationPath)
|
generatedFiles += printTransformer(builder.elements, generationPath)
|
||||||
|
return generatedFiles
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SmartPrinter.printCopyright() {
|
fun SmartPrinter.printCopyright() {
|
||||||
|
|||||||
+5
-3
@@ -11,10 +11,11 @@ import org.jetbrains.kotlin.fir.tree.generator.model.Element
|
|||||||
|
|
||||||
import java.io.File
|
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(".", "/"))
|
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
|
||||||
dir.mkdirs()
|
val file = File(dir, "FirTransformer.kt")
|
||||||
File(dir, "FirTransformer.kt").useSmartPrinter {
|
val stringBuilder = StringBuilder()
|
||||||
|
SmartPrinter(stringBuilder).apply {
|
||||||
printCopyright()
|
printCopyright()
|
||||||
println("package $VISITOR_PACKAGE")
|
println("package $VISITOR_PACKAGE")
|
||||||
println()
|
println()
|
||||||
@@ -62,4 +63,5 @@ fun printTransformer(elements: List<Element>, generationPath: File) {
|
|||||||
}
|
}
|
||||||
println("}")
|
println("}")
|
||||||
}
|
}
|
||||||
|
return GeneratedFile(file, stringBuilder.toString())
|
||||||
}
|
}
|
||||||
|
|||||||
+4
@@ -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.firImplementationDetailType
|
||||||
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
import org.jetbrains.kotlin.fir.tree.generator.model.*
|
||||||
import org.jetbrains.kotlin.fir.tree.generator.pureAbstractElementType
|
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) {
|
enum class ImportKind(val postfix: String) {
|
||||||
Element(""), Implementation(".impl"), Builder(".builder")
|
Element(""), Implementation(".impl"), Builder(".builder")
|
||||||
|
|||||||
+10
-8
@@ -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.context.AbstractFirTreeBuilder
|
||||||
import org.jetbrains.kotlin.fir.tree.generator.model.Element
|
import org.jetbrains.kotlin.fir.tree.generator.model.Element
|
||||||
|
|
||||||
import java.io.File
|
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(".", "/"))
|
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
|
||||||
dir.mkdirs()
|
val file = File(dir, "FirVisitor.kt")
|
||||||
File(dir, "FirVisitor.kt").useSmartPrinter {
|
val stringBuilder = StringBuilder()
|
||||||
|
SmartPrinter(stringBuilder).apply {
|
||||||
printCopyright()
|
printCopyright()
|
||||||
println("package $VISITOR_PACKAGE")
|
println("package $VISITOR_PACKAGE")
|
||||||
println()
|
println()
|
||||||
@@ -37,13 +36,15 @@ fun printVisitor(elements: List<Element>, generationPath: File) {
|
|||||||
popIndent()
|
popIndent()
|
||||||
println("}")
|
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(".", "/"))
|
val dir = File(generationPath, VISITOR_PACKAGE.replace(".", "/"))
|
||||||
dir.mkdirs()
|
val file = File(dir, "FirVisitorVoid.kt")
|
||||||
File(dir, "FirVisitorVoid.kt").useSmartPrinter {
|
val stringBuilder = StringBuilder()
|
||||||
|
SmartPrinter(stringBuilder).apply {
|
||||||
printCopyright()
|
printCopyright()
|
||||||
println("package $VISITOR_PACKAGE")
|
println("package $VISITOR_PACKAGE")
|
||||||
println()
|
println()
|
||||||
@@ -83,4 +84,5 @@ fun printVisitorVoid(elements: List<Element>, generationPath: File) {
|
|||||||
}
|
}
|
||||||
println("}")
|
println("}")
|
||||||
}
|
}
|
||||||
|
return GeneratedFile(file, stringBuilder.toString())
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-5
@@ -6,12 +6,25 @@
|
|||||||
package org.jetbrains.kotlin.fir.tree.generator.util
|
package org.jetbrains.kotlin.fir.tree.generator.util
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.tree.generator.printer.GENERATED_MESSAGE
|
import org.jetbrains.kotlin.fir.tree.generator.printer.GENERATED_MESSAGE
|
||||||
|
import org.jetbrains.kotlin.generators.util.GeneratorsFileUtil
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
fun removePreviousGeneratedFiles(generationPath: File) {
|
fun collectPreviouslyGeneratedFiles(generationPath: File): List<File> {
|
||||||
generationPath.walkTopDown().forEach {
|
return generationPath.walkTopDown().filter {
|
||||||
if (it.isFile && it.readText().contains(GENERATED_MESSAGE)) {
|
it.isFile && it.readText().contains(GENERATED_MESSAGE)
|
||||||
it.delete()
|
}.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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import java.io.IOException
|
|||||||
import kotlin.io.path.*
|
import kotlin.io.path.*
|
||||||
|
|
||||||
object GeneratorsFileUtil {
|
object GeneratorsFileUtil {
|
||||||
private val isTeamCityBuild: Boolean = System.getProperty("TEAMCITY_VERSION") != null
|
val isTeamCityBuild: Boolean = System.getProperty("TEAMCITY_VERSION") != null
|
||||||
|
|
||||||
@OptIn(ExperimentalPathApi::class)
|
@OptIn(ExperimentalPathApi::class)
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
@@ -47,7 +47,7 @@ object GeneratorsFileUtil {
|
|||||||
println()
|
println()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun assertTeamCityMode(): Nothing {
|
fun assertTeamCityMode(): Nothing {
|
||||||
throw IllegalStateException("You should commit all newly generated files before pushing them to TeamCity")
|
throw IllegalStateException("You should commit all newly generated files before pushing them to TeamCity")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user