From 13c83d85c6fdcad9fb10b3406b064074d0e8c0f0 Mon Sep 17 00:00:00 2001 From: JFronny Date: Fri, 14 Oct 2022 15:43:17 +0200 Subject: [PATCH] codegen: enhance edge cases --- .../main/kotlin/io/gitlab/jfronny/scripts/CodegenExt.kt | 9 ++++++--- .../gitlab/jfronny/scripts/codegen/ContentGenerator.kt | 4 +++- convention/src/main/kotlin/jf.codegen.gradle.kts | 4 +++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CodegenExt.kt b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CodegenExt.kt index f441dc0..248d555 100644 --- a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CodegenExt.kt +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CodegenExt.kt @@ -10,9 +10,12 @@ val Project.codegenDir get() = buildDir.resolve("generated/sources/jfCodegen") fun SourceSet.generate(project: Project, generate: Action) { val generators = project.extra["codeGenerators"] as LinkedHashMap + 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")) + } } \ No newline at end of file diff --git a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/codegen/ContentGenerator.kt b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/codegen/ContentGenerator.kt index 2a23e1d..8221025 100644 --- a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/codegen/ContentGenerator.kt +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/codegen/ContentGenerator.kt @@ -8,7 +8,9 @@ class ContentGenerator : Generator() { private val resources: MutableMap = LinkedHashMap() override fun generateFinalized() = Generated(ImmutableMap(classes), ImmutableMap(resources)) - data class Generated(val classes: Map, val resources: Map) + data class Generated(val classes: Map, val resources: Map) { + fun merge(other: Generated): Generated = Generated(classes + other.classes, resources + other.resources) + } fun `class`(`package`: String, name: String, generator: Action) = ensureMutable { if (!packagePattern.matches(`package`)) throw IllegalArgumentException("package \"$`package`\" is not a valid package") diff --git a/convention/src/main/kotlin/jf.codegen.gradle.kts b/convention/src/main/kotlin/jf.codegen.gradle.kts index 9fa7853..56e001a 100644 --- a/convention/src/main/kotlin/jf.codegen.gradle.kts +++ b/convention/src/main/kotlin/jf.codegen.gradle.kts @@ -10,7 +10,9 @@ extra["codeGenerators"] = LinkedHashMap() val jfCodegen by tasks.registering { doLast { - (project.extra["codeGenerators"] as LinkedHashMap).forEach { (name, generated) -> + val generators = project.extra["codeGenerators"] as LinkedHashMap + 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()