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 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<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))
finalized = true
return fin
@ -52,12 +52,16 @@ class ContentGenerator {
private val classes: MutableMap<String, String> = 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(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<StringBuilder>) = ensureMutable {
check(path, "path", pathPattern)
fun text(path: String, generator: Action<StringBuilder>) = blob(path) {
val builder = StringBuilder()
generator.execute(builder)
resources[path] = builder.toString().toByteArray()
builder.toString().toByteArray()
}
fun blob(path: String, generator: Supplier<ByteArray>) = ensureMutable {