Support for generating enums and interfaces
ci/woodpecker/push/pages Pipeline was successful Details
ci/woodpecker/push/gradle Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2022-12-29 14:53:21 +01:00
parent 4d2195ee08
commit c8a938eab8
Signed by: Johannes
GPG Key ID: E76429612C2929F4
1 changed files with 12 additions and 9 deletions

View File

@ -22,7 +22,7 @@ fun SourceSet.generate(project: Project, generate: Action<ContentGenerator>) {
val generators = project.extra["codeGenerators"] as LinkedHashMap<String, ContentGenerator.Generated> val generators = project.extra["codeGenerators"] as LinkedHashMap<String, ContentGenerator.Generated>
val exists = generators.containsKey(name) val exists = generators.containsKey(name)
val generator = ContentGenerator().runAction(generate) 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) { if (!exists) {
java.srcDir(project.codegenDir.resolve("java/$name")) java.srcDir(project.codegenDir.resolve("java/$name"))
resources.srcDir(project.codegenDir.resolve("resources/$name")) resources.srcDir(project.codegenDir.resolve("resources/$name"))
@ -38,7 +38,7 @@ class ContentGenerator {
private data class ImmutableMap<Key, Value>(private val inner: Map<Key, Value>): Map<Key, Value> by inner private data class ImmutableMap<Key, Value>(private val inner: Map<Key, Value>): Map<Key, Value> by inner
fun finalize(): Generated { fun generate(): Generated {
val fin = Generated(ImmutableMap(classes), ImmutableMap(resources)) val fin = Generated(ImmutableMap(classes), ImmutableMap(resources))
finalized = true finalized = true
return fin return fin
@ -52,12 +52,16 @@ class ContentGenerator {
private val classes: MutableMap<String, String> = LinkedHashMap() private val classes: MutableMap<String, String> = LinkedHashMap()
private val resources: MutableMap<String, ByteArray> = LinkedHashMap() private val resources: MutableMap<String, ByteArray> = LinkedHashMap()
fun `class`(`package`: String, name: String, generator: Action<TypeSpec.Builder>) = ensureMutable { fun `class`(`package`: String, name: String, generator: Action<TypeSpec.Builder>) = `class`(`package`, name, TypeSpec::classBuilder, generator)
fun `enum`(`package`: String, name: String, generator: Action<TypeSpec.Builder>) = `class`(`package`, name, TypeSpec::enumBuilder, generator)
fun `interface`(`package`: String, name: String, generator: Action<TypeSpec.Builder>) = `class`(`package`, name, TypeSpec::interfaceBuilder, generator)
private fun `class`(`package`: String, name: String, builder: (ClassName) -> TypeSpec.Builder, generator: Action<TypeSpec.Builder>) = ensureMutable {
check(`package`, "package", packagePattern) check(`package`, "package", packagePattern)
check(name, "class name", classNamePattern) check(name, "class name", classNamePattern)
val builder = TypeSpec.classBuilder(ClassName.get(`package`, name)) val bld = builder(ClassName.get(`package`, name))
generator.execute(builder) generator.execute(bld)
val javaFile: JavaFile = JavaFile.builder(`package`, builder.build()) val javaFile: JavaFile = JavaFile.builder(`package`, bld.build())
.skipJavaLangImports(true) .skipJavaLangImports(true)
.indent(" ") .indent(" ")
.addFileComment("Automatically generated through JfCodegen, do not edit!") .addFileComment("Automatically generated through JfCodegen, do not edit!")
@ -65,11 +69,10 @@ class ContentGenerator {
classes["${`package`.replace('.', '/')}/$name.java"] = javaFile.toString() classes["${`package`.replace('.', '/')}/$name.java"] = javaFile.toString()
} }
fun text(path: String, generator: Action<StringBuilder>) = ensureMutable { fun text(path: String, generator: Action<StringBuilder>) = blob(path) {
check(path, "path", pathPattern)
val builder = StringBuilder() val builder = StringBuilder()
generator.execute(builder) generator.execute(builder)
resources[path] = builder.toString().toByteArray() builder.toString().toByteArray()
} }
fun blob(path: String, generator: Supplier<ByteArray>) = ensureMutable { fun blob(path: String, generator: Supplier<ByteArray>) = ensureMutable {