codegen: enhance edge cases

This commit is contained in:
Johannes Frohnmeyer 2022-10-14 15:43:17 +02:00
parent 2477a799db
commit 13c83d85c6
Signed by: Johannes
GPG Key ID: E76429612C2929F4
3 changed files with 12 additions and 5 deletions

View File

@ -10,9 +10,12 @@ val Project.codegenDir get() = buildDir.resolve("generated/sources/jfCodegen")
fun SourceSet.generate(project: Project, generate: Action<ContentGenerator>) {
val generators = project.extra["codeGenerators"] as LinkedHashMap<String, ContentGenerator.Generated>
val exists = generators.containsKey(name)
val generator = ContentGenerator()
generate.execute(generator)
generators[name] = generator.finalize()
java.srcDir(project.codegenDir.resolve("java/$name"))
resources.srcDir(project.codegenDir.resolve("resources/$name"))
generators[name] = if (exists) generators[name]!!.merge(generator.finalize()) else generator.finalize()
if (!exists) {
java.srcDir(project.codegenDir.resolve("java/$name"))
resources.srcDir(project.codegenDir.resolve("resources/$name"))
}
}

View File

@ -8,7 +8,9 @@ class ContentGenerator : Generator<ContentGenerator.Generated>() {
private val resources: MutableMap<String, ByteArray> = LinkedHashMap()
override fun generateFinalized() = Generated(ImmutableMap(classes), ImmutableMap(resources))
data class Generated(val classes: Map<String, String>, val resources: Map<String, ByteArray>)
data class Generated(val classes: Map<String, String>, val resources: Map<String, ByteArray>) {
fun merge(other: Generated): Generated = Generated(classes + other.classes, resources + other.resources)
}
fun `class`(`package`: String, name: String, generator: Action<ClassGenerator>) = ensureMutable {
if (!packagePattern.matches(`package`)) throw IllegalArgumentException("package \"$`package`\" is not a valid package")

View File

@ -10,7 +10,9 @@ extra["codeGenerators"] = LinkedHashMap<String, Generated>()
val jfCodegen by tasks.registering {
doLast {
(project.extra["codeGenerators"] as LinkedHashMap<String, Generated>).forEach { (name, generated) ->
val generators = project.extra["codeGenerators"] as LinkedHashMap<String, Generated>
if (codegenDir.exists()) codegenDir.deleteRecursively()
generators.forEach { (name, generated) ->
generated.classes.forEach { (filePath, content) ->
val path = codegenDir.resolve("java").resolve(name).resolve(filePath)
path.parentFile.mkdirs()