From c8a938eab88b2b4871f4393b1e7d88fb122fe6ba Mon Sep 17 00:00:00 2001 From: JFronny Date: Thu, 29 Dec 2022 14:53:21 +0100 Subject: [PATCH] Support for generating enums and interfaces --- .../io/gitlab/jfronny/scripts/CodegenExt.kt | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 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 4e77263..832faf2 100644 --- a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CodegenExt.kt +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CodegenExt.kt @@ -22,7 +22,7 @@ fun SourceSet.generate(project: Project, generate: Action) { val generators = project.extra["codeGenerators"] as LinkedHashMap val exists = generators.containsKey(name) val generator = ContentGenerator().runAction(generate) - generators[name] = if (exists) generators[name]!!.merge(generator.finalize()) else generator.finalize() + generators[name] = if (exists) generators[name]!!.merge(generator.generate()) else generator.generate() if (!exists) { java.srcDir(project.codegenDir.resolve("java/$name")) resources.srcDir(project.codegenDir.resolve("resources/$name")) @@ -38,7 +38,7 @@ class ContentGenerator { private data class ImmutableMap(private val inner: Map): Map by inner - fun finalize(): Generated { + fun generate(): Generated { val fin = Generated(ImmutableMap(classes), ImmutableMap(resources)) finalized = true return fin @@ -52,12 +52,16 @@ class ContentGenerator { private val classes: MutableMap = LinkedHashMap() private val resources: MutableMap = LinkedHashMap() - fun `class`(`package`: String, name: String, generator: Action) = ensureMutable { + fun `class`(`package`: String, name: String, generator: Action) = `class`(`package`, name, TypeSpec::classBuilder, generator) + fun `enum`(`package`: String, name: String, generator: Action) = `class`(`package`, name, TypeSpec::enumBuilder, generator) + fun `interface`(`package`: String, name: String, generator: Action) = `class`(`package`, name, TypeSpec::interfaceBuilder, generator) + + private fun `class`(`package`: String, name: String, builder: (ClassName) -> TypeSpec.Builder, generator: Action) = ensureMutable { check(`package`, "package", packagePattern) check(name, "class name", classNamePattern) - val builder = TypeSpec.classBuilder(ClassName.get(`package`, name)) - generator.execute(builder) - val javaFile: JavaFile = JavaFile.builder(`package`, builder.build()) + val bld = builder(ClassName.get(`package`, name)) + generator.execute(bld) + val javaFile: JavaFile = JavaFile.builder(`package`, bld.build()) .skipJavaLangImports(true) .indent(" ") .addFileComment("Automatically generated through JfCodegen, do not edit!") @@ -65,11 +69,10 @@ class ContentGenerator { classes["${`package`.replace('.', '/')}/$name.java"] = javaFile.toString() } - fun text(path: String, generator: Action) = ensureMutable { - check(path, "path", pathPattern) + fun text(path: String, generator: Action) = blob(path) { val builder = StringBuilder() generator.execute(builder) - resources[path] = builder.toString().toByteArray() + builder.toString().toByteArray() } fun blob(path: String, generator: Supplier) = ensureMutable {