From 8a6ef9c89341b6bb2549f9c3945961ea2fc8370e Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Thu, 13 Jun 2024 21:52:37 +0200 Subject: [PATCH 01/19] wip --- .../src/main/kotlin/builder/KotlinClassBuilder.kt | 1 - kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt index 454cad1..a8b4abd 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt @@ -6,7 +6,6 @@ import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec import io.toolisticon.kotlin.generation.spec.KotlinClassSpec import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier -@Deprecated("Not implemented yet!") class KotlinClassBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( delegate = delegate ), TypeSpecSupplier { diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt index 4e018a2..d4842d3 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt @@ -2,7 +2,6 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeSpec -@Deprecated("Not implemented yet!") @JvmInline value class KotlinClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec { override fun get(): TypeSpec = spec From 4fdf4fc332e2e58b9774a1ef3c257a90d48bdcb2 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Fri, 14 Jun 2024 08:50:29 +0200 Subject: [PATCH 02/19] merge --- .../src/test/kotlin/HelloWorldExampleTest.kt | 4 +- .../test/kotlin/KotlinDataClassSpecTest.kt | 34 ++-- _itest/src/test/kotlin/KotlinFileSpecTest.kt | 16 +- _itest/src/test/kotlin/KotlinValueClassIT.kt | 8 +- .../kotlin/model/KotlinCompilationCommand.kt | 3 +- kotlin-code-generation/pom.xml | 5 + .../builder => _BAK}/IDataClassSpecBuilder.kt | 2 +- .../src/_BAK/KotlinAnnotationClassBuilder.kt | 32 ++++ .../KotlinAnnotationClassSpec.kt | 5 +- .../spec => _BAK}/KotlinAnnotationSpec.kt | 6 +- .../src/_BAK/KotlinAnnotationSpecBuilder.kt | 44 ++++++ .../src/_BAK/KotlinAnonymousClassBuilder.kt | 22 +++ .../spec => _BAK}/KotlinAnonymousClassSpec.kt | 7 +- .../src/_BAK/KotlinClassBuilder.kt | 30 ++++ .../kotlin/spec => _BAK}/KotlinClassSpec.kt | 5 +- .../src/_BAK/KotlinCompanionObjectBuilder.kt | 24 +++ .../KotlinCompanionObjectSpec.kt | 6 +- .../KotlinConstructorProperty.kt | 6 +- .../_BAK/KotlinConstructorPropertyBuilder.kt | 46 ++++++ .../src/_BAK/KotlinEnumClassBuilder.kt | 32 ++++ .../spec => _BAK}/KotlinEnumClassSpec.kt | 5 +- .../builder => _BAK}/KotlinFileBuilder.kt | 10 +- .../src/_BAK/KotlinFileSpecBuilder.kt | 37 +++++ .../src/_BAK/KotlinInterfaceBuilder.kt | 25 +++ .../spec => _BAK}/KotlinInterfaceSpec.kt | 6 +- .../spec => _BAK}/KotlinParameterSpec.kt | 5 +- .../src/_BAK/KotlinParameterSpecBuilder.kt | 32 ++++ .../src/_BAK/KotlinPropertySpecBuilder.kt | 43 ++++++ .../src/_BAK/KotlinTypeAliasSpec.kt | 9 ++ .../src/_BAK/KotlinValueClassBuilder.kt | 55 +++++++ .../{main/kotlin/builder => _BAK}/_builder.kt | 4 +- .../src/{main/kotlin/spec => _BAK}/_facet.kt | 2 +- kotlin-code-generation/src/_BAK/_spec.kt | 33 ++++ .../src/_BAK/bak/AnnotatableSpecBuilder.kt | 9 ++ .../src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt | 39 +++++ .../_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt | 29 ++++ .../bak/KotlinPoetNamedTypeSpecBuilder.kt | 14 ++ .../src/_BAK/bak/SpecBuilder.kt | 8 + .../src/_BAK/bak/ToKotlinPoetSpecBuilder.kt | 6 + .../_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt | 10 ++ .../src/_BAK/poet/AnnotatableBuilder.kt | 12 ++ .../src/_BAK/poet/AnnotationSpecBuilder.kt | 33 ++++ .../src/_BAK/poet/CodeBlockBuilder.kt | 33 ++++ .../src/_BAK/poet/ContextReceivableBuilder.kt | 12 ++ .../src/_BAK/poet/DocumentableBuilder.kt | 12 ++ .../src/_BAK/poet/FileSpecBuilder.kt | 65 ++++++++ .../src/_BAK/poet/FunSpecBuilder.kt | 75 +++++++++ .../src/_BAK/poet/KModifierHolderBuilder.kt | 19 +++ .../src/_BAK/poet/MemberSpecHolderBuilder.kt | 20 +++ .../poet/OriginatingElementsHolderBuilder.kt | 10 ++ .../src/_BAK/poet/ParameterSpecBuilder.kt | 37 +++++ .../src/_BAK/poet/PropertySpecBuilder.kt | 46 ++++++ .../src/_BAK/poet/TaggableBuilder.kt | 10 ++ .../src/_BAK/poet/TypeAliasSpecBuilder.kt | 28 ++++ .../src/_BAK/poet/TypeSpecBuilder.kt | 70 +++++++++ .../src/_BAK/poet/TypeSpecHolderBuilder.kt | 12 ++ .../_BAK/poet/TypeVariableHolderBuilder.kt | 19 +++ .../KotlinAnnotationSpecTest.kt | 7 +- .../src/_TEST/KotlinDataClassSpecTest.kt | 32 ++++ .../src/_TEST/KotlinValueClassSpecTest.kt | 26 ++++ .../builder/KotlinValueClassBuilderTest.kt | 30 ++++ .../_TEST/poet/AnnotationSpecBuilderTest.kt | 16 ++ .../src/_TEST/poet/TypeSpecBuilderTest.kt | 21 +++ .../src/main/kotlin/KotlinCodeGeneration.kt | 29 +++- .../src/main/kotlin/_builder.kt | 15 ++ .../src/main/kotlin/_ktx/TypeNameKtx.kt | 11 -- .../kotlin/builder/KotlinAnnotationBuilder.kt | 59 ------- .../builder/KotlinAnnotationClassBuilder.kt | 25 --- .../builder/KotlinAnonymousClassBuilder.kt | 23 --- .../main/kotlin/builder/KotlinClassBuilder.kt | 21 --- .../builder/KotlinCompanionObjectBuilder.kt | 21 --- .../KotlinConstructorPropertyBuilder.kt | 57 ------- .../builder/KotlinDataClassSpecBuilder.kt | 146 +++++++++++------- .../kotlin/builder/KotlinEnumClassBuilder.kt | 42 ----- .../kotlin/builder/KotlinFileSpecBuilder.kt | 30 ++++ .../main/kotlin/builder/KotlinFunBuilder.kt | 20 --- .../kotlin/builder/KotlinFunSpecBuilder.kt | 24 +++ .../kotlin/builder/KotlinInterfaceBuilder.kt | 22 --- .../kotlin/builder/KotlinObjectBuilder.kt | 48 +++--- .../kotlin/builder/KotlinParameterBuilder.kt | 33 ---- .../kotlin/builder/KotlinPropertyBuilder.kt | 54 ------- .../builder/KotlinPropertySpecBuilder.kt | 25 +++ .../kotlin/builder/KotlinTypeAliasBuilder.kt | 21 --- .../builder/KotlinTypeAliasSpecBuilder.kt | 26 ++++ .../kotlin/builder/KotlinValueClassBuilder.kt | 74 --------- .../builder/KotlinValueClassSpecBuilder.kt | 25 +++ .../src/main/kotlin/builder/_poet.kt | 55 +++++++ .../src/main/kotlin/builder/_type-aliases.kt | 11 ++ .../main/kotlin/spec/KotlinDataClassSpec.kt | 8 +- .../src/main/kotlin/spec/KotlinFileSpec.kt | 14 +- .../src/main/kotlin/spec/KotlinFunSpec.kt | 7 +- .../src/main/kotlin/spec/KotlinObjectSpec.kt | 7 +- .../main/kotlin/spec/KotlinPropertySpec.kt | 14 +- .../main/kotlin/spec/KotlinTypeAliasSpec.kt | 5 +- .../main/kotlin/spec/KotlinValueClassSpec.kt | 9 +- .../src/main/kotlin/spec/_spec.kt | 32 ---- .../test/kotlin/KotlinDataClassSpecTest.kt | 26 ---- .../test/kotlin/KotlinValueClassSpecTest.kt | 31 ---- .../src/test/kotlin/TestFixtures.kt | 4 +- pom.xml | 10 +- 100 files changed, 1688 insertions(+), 759 deletions(-) rename kotlin-code-generation/src/{main/kotlin/builder => _BAK}/IDataClassSpecBuilder.kt (79%) create mode 100644 kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinAnnotationClassSpec.kt (61%) rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinAnnotationSpec.kt (84%) create mode 100644 kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinAnonymousClassSpec.kt (53%) create mode 100644 kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinClassSpec.kt (55%) create mode 100644 kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinCompanionObjectSpec.kt (53%) rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinConstructorProperty.kt (69%) create mode 100644 kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinEnumClassSpec.kt (63%) rename kotlin-code-generation/src/{main/kotlin/builder => _BAK}/KotlinFileBuilder.kt (86%) create mode 100644 kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinInterfaceSpec.kt (54%) rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/KotlinParameterSpec.kt (75%) create mode 100644 kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt create mode 100644 kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt rename kotlin-code-generation/src/{main/kotlin/builder => _BAK}/_builder.kt (97%) rename kotlin-code-generation/src/{main/kotlin/spec => _BAK}/_facet.kt (90%) create mode 100644 kotlin-code-generation/src/_BAK/_spec.kt create mode 100644 kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt create mode 100644 kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt rename kotlin-code-generation/src/{test/kotlin => _TEST}/KotlinAnnotationSpecTest.kt (82%) create mode 100644 kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt create mode 100644 kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt create mode 100644 kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt create mode 100644 kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt create mode 100644 kotlin-code-generation/src/_TEST/poet/TypeSpecBuilderTest.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/_ktx/TypeNameKtx.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinFunBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinParameterBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinPropertyBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/_poet.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/spec/_spec.kt delete mode 100644 kotlin-code-generation/src/test/kotlin/KotlinDataClassSpecTest.kt delete mode 100644 kotlin-code-generation/src/test/kotlin/KotlinValueClassSpecTest.kt diff --git a/_itest/src/test/kotlin/HelloWorldExampleTest.kt b/_itest/src/test/kotlin/HelloWorldExampleTest.kt index 6824d3a..362c9e3 100644 --- a/_itest/src/test/kotlin/HelloWorldExampleTest.kt +++ b/_itest/src/test/kotlin/HelloWorldExampleTest.kt @@ -6,7 +6,7 @@ import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.TypeSpec import com.tschuchort.compiletesting.KotlinCompilation -import io.toolisticon.kotlin.generation.builder.KotlinFileBuilder +import io.toolisticon.kotlin.generation.builder.KotlinFileSpecBuilder import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest.assertThat import io.toolisticon.kotlin.generation.test.model.KotlinCompilationCommand @@ -30,7 +30,7 @@ internal class HelloWorldExampleTest { ) .build() - val file = KotlinFileBuilder.builder(name).invoke { + val file = KotlinFileSpecBuilder.builder(name).invoke { addType(type) }.build() diff --git a/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt b/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt index c7407db..2915a08 100644 --- a/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt +++ b/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt @@ -1,18 +1,14 @@ package io.toolisticon.kotlin.generation.itest import com.squareup.kotlinpoet.ClassName -import com.tschuchort.compiletesting.KotlinCompilation +import com.squareup.kotlinpoet.asTypeName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass +import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertyBuilder import io.toolisticon.kotlin.generation.KotlinCodeGeneration.constructorPropertyBuilder import io.toolisticon.kotlin.generation.KotlinCodeGeneration.dataClassBuilder import io.toolisticon.kotlin.generation.builder.KotlinDataClassSpecBuilder -import io.toolisticon.kotlin.generation.spec.toFileSpec -import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest -import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest.assertThat -import io.toolisticon.kotlin.generation.test.model.KotlinCompilationCommand -import org.assertj.core.api.Assertions.assertThat import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import org.junit.jupiter.api.Test -import kotlin.reflect.full.primaryConstructor @OptIn(ExperimentalCompilerApi::class) internal class KotlinDataClassSpecTest { @@ -24,16 +20,22 @@ internal class KotlinDataClassSpecTest { .addConstructorProperty(constructorPropertyBuilder("name", String::class)) .addConstructorProperty(constructorPropertyBuilder("age", Int::class)) - val file = builder.build().toFileSpec() - println(file.code) + val spec = buildDataClass(className) { + addConstructorProperty(KotlinConstructorPropertyBuilder.builder("name", String::class.asTypeName())) + addConstructorProperty(KotlinConstructorPropertyBuilder.builder("age", Int::class.asTypeName())) + } - val result = KotlinCodeGenerationTest.compile(KotlinCompilationCommand(file)) +// val file = spec.toFileSpec() +// println(file.code) - assertThat(result).errorMessages().isEmpty() - assertThat(result).hasExitCode(KotlinCompilation.ExitCode.OK) - - val klass = result.loadClass() - assertThat(klass.primaryConstructor!!.call("hello world", 25)) - .hasToString("Bar(name=hello world, age=25)") +// val result = KotlinCodeGenerationTest.compile(KotlinCompilationCommand(file)) +// +// assertThat(result).errorMessages().isEmpty() +// assertThat(result).hasExitCode(KotlinCompilation.ExitCode.OK) +// +// val klass = result.loadClass() +// assertThat(klass.primaryConstructor!!.call("hello world", 25)) +// .hasToString("Bar(name=hello world, age=25)") +// } } } diff --git a/_itest/src/test/kotlin/KotlinFileSpecTest.kt b/_itest/src/test/kotlin/KotlinFileSpecTest.kt index 1170603..a7629ce 100644 --- a/_itest/src/test/kotlin/KotlinFileSpecTest.kt +++ b/_itest/src/test/kotlin/KotlinFileSpecTest.kt @@ -1,7 +1,9 @@ package io.toolisticon.kotlin.generation.itest import com.squareup.kotlinpoet.ClassName -import io.toolisticon.kotlin.generation.builder.KotlinFileBuilder +import com.squareup.kotlinpoet.FileSpec +import io.toolisticon.kotlin.generation.builder.KotlinFileSpecBuilder +import org.jetbrains.kotlin.metadata.ProtoBuf import org.junit.jupiter.api.Test internal class KotlinFileSpecTest { @@ -9,9 +11,19 @@ internal class KotlinFileSpecTest { @Target(AnnotationTarget.FILE) annotation class Foo + @Test + fun name() { + val spec = FileSpec.builder(ClassName("some","Stuff")) + .addFileComment("%L", "this is a comment") + .addAnnotation(Foo::class) + .build() + + println(spec) + } + @Test fun `build filespec`() { - val builder: KotlinFileBuilder = KotlinFileBuilder.builder(ClassName("foo", "Bar")) { + val builder: KotlinFileSpecBuilder = KotlinFileSpecBuilder.builder(ClassName("foo", "Bar")).invoke { addFileComment("%L", "this is a comment.") } diff --git a/_itest/src/test/kotlin/KotlinValueClassIT.kt b/_itest/src/test/kotlin/KotlinValueClassIT.kt index f93bb46..4ce9026 100644 --- a/_itest/src/test/kotlin/KotlinValueClassIT.kt +++ b/_itest/src/test/kotlin/KotlinValueClassIT.kt @@ -53,12 +53,6 @@ internal class KotlinValueClassIT { @Test fun `generate value class wrapping string`() { - val builder = KotlinCodeGeneration.valueClassBuilder("Foo") { - - //primaryConstructor(FUns) - - } - - println(builder.build().code) + TODO() } } diff --git a/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt b/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt index e5036c9..07f39e5 100644 --- a/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt +++ b/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt @@ -1,8 +1,7 @@ package io.toolisticon.kotlin.generation.test.model -import com.squareup.kotlinpoet.FileSpec import com.tschuchort.compiletesting.SourceFile -import io.toolisticon.kotlin.generation.spec.KotlinFileSpec +import io.toolisticon.kotlin.generation._BAK.KotlinFileSpec data class KotlinCompilationCommand( val fileSpec: KotlinFileSpec diff --git a/kotlin-code-generation/pom.xml b/kotlin-code-generation/pom.xml index e0773cf..197c1e8 100644 --- a/kotlin-code-generation/pom.xml +++ b/kotlin-code-generation/pom.xml @@ -83,6 +83,11 @@ kotlin-test test + + ch.qos.logback + logback-classic + test + diff --git a/kotlin-code-generation/src/main/kotlin/builder/IDataClassSpecBuilder.kt b/kotlin-code-generation/src/_BAK/IDataClassSpecBuilder.kt similarity index 79% rename from kotlin-code-generation/src/main/kotlin/builder/IDataClassSpecBuilder.kt rename to kotlin-code-generation/src/_BAK/IDataClassSpecBuilder.kt index bab5775..90d1eaa 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/IDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/_BAK/IDataClassSpecBuilder.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation.builder +package io.toolisticon.kotlin.generation._BAK import com.squareup.kotlinpoet.CodeBlock diff --git a/kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt new file mode 100644 index 0000000..1f6d38e --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt @@ -0,0 +1,32 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinAnnotationClassSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + +class KotlinAnnotationClassBuilder internal constructor( + val className: ClassName, + private val delegate: TypeSpecBuilder +) : Builder, TypeSpecSupplier { + + companion object { + fun builder(className: ClassName) = KotlinAnnotationClassBuilder( + className = className, + delegate = TypeSpecBuilder.annotationBuilder(className) + ) + } + + operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinAnnotationClassBuilder = apply { + delegate.block() + } + + override fun build(): KotlinAnnotationClassSpec = KotlinAnnotationClassSpec( + className = className, + spec = delegate.build() + ) + + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinAnnotationClassSpec.kt similarity index 61% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinAnnotationClassSpec.kt index 6e57364..053366b 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinAnnotationClassSpec.kt @@ -1,11 +1,12 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec data class KotlinAnnotationClassSpec( override val className: ClassName, private val spec: TypeSpec, -) : KotlinPoetNamedTypeSpec { +) : KotlinPoetNamedTypeSpec, Documentable by spec { override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt b/kotlin-code-generation/src/_BAK/KotlinAnnotationSpec.kt similarity index 84% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinAnnotationSpec.kt index 4752682..c63a33a 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinAnnotationSpec.kt @@ -1,9 +1,9 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.builder.KotlinAnnotationBuilder +import io.toolisticon.kotlin.generation.builder.KotlinAnnotationSpecBuilder @JvmInline value class KotlinAnnotationSpec(private val spec: AnnotationSpec) : KotlinPoetSpec, @@ -24,4 +24,4 @@ value class KotlinAnnotationSpec(private val spec: AnnotationSpec) : KotlinPoetS } -fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationBuilder.builder(spec = this) +fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationSpecBuilder.from(spec = this) diff --git a/kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt new file mode 100644 index 0000000..21b68b1 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt @@ -0,0 +1,44 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.ParameterizedTypeName +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.AnnotationSpecBuilder +import io.toolisticon.kotlin.generation._BAK.poet.AnnotationSpecBuilder.Companion.wrap +import io.toolisticon.kotlin.generation._BAK.AnnotationSpecSupplier +import io.toolisticon.kotlin.generation._BAK.KotlinAnnotationSpec +import kotlin.reflect.KClass + +class KotlinAnnotationSpecBuilder internal constructor( + private val delegate: AnnotationSpecBuilder +) : Builder, AnnotationSpecSupplier { + companion object { + fun builder(type: ClassName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) + fun builder(type: ParameterizedTypeName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.Companion.builder(type)) + fun builder(type: KClass): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) + + fun from(spec: KotlinAnnotationSpec) = KotlinAnnotationSpecBuilder(delegate = spec.get().toBuilder().wrap()) + } + + operator fun invoke(block: AnnotationSpecBuilder.() -> Unit): KotlinAnnotationSpecBuilder = apply { + delegate.block() + } + + fun addMember(format: String, vararg args: Any): KotlinAnnotationSpecBuilder = apply { + delegate.addMember(format, *args) + } + + fun addMember(codeBlock: CodeBlock): KotlinAnnotationSpecBuilder = apply { + delegate.addMember(codeBlock) + } + + fun addKClassMember(name: String, klass: KClass<*>) = addMember("$name = %T::class", klass) + + fun addStringMember(name: String, value: String) = addMember("$name = %S", value) + + + override fun build(): KotlinAnnotationSpec = KotlinAnnotationSpec(spec = delegate.build()) + override fun get(): AnnotationSpec = build().get() +} diff --git a/kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt new file mode 100644 index 0000000..7dc31d6 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt @@ -0,0 +1,22 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinAnonymousClassSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + +@Deprecated("not implemented yet") +class KotlinAnonymousClassBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : Builder, TypeSpecSupplier { + + + override fun build(): KotlinAnonymousClassSpec { + TODO("Not yet implemented") + } + + override fun get(): TypeSpec { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinAnonymousClassSpec.kt similarity index 53% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinAnonymousClassSpec.kt index f10dbe6..c40b2c2 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinAnonymousClassSpec.kt @@ -1,10 +1,9 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec -@Deprecated("Not implemented yet!") @JvmInline -value class KotlinAnonymousClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec{ +value class KotlinAnonymousClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { override fun get(): TypeSpec = spec - } diff --git a/kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt new file mode 100644 index 0000000..210cc91 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt @@ -0,0 +1,30 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinClassSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + +class KotlinClassBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( + delegate = delegate +), TypeSpecSupplier { + +class KotlinClassBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : Builder, TypeSpecSupplier { + + companion object { + fun builder(className: ClassName) = KotlinClassBuilder( + delegate = TypeSpecBuilder.classBuilder(className) + ) + } + + operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinClassBuilder = apply { + delegate.block() + } + + override fun build(): KotlinClassSpec = KotlinClassSpec(spec = delegate.build()) + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinClassSpec.kt similarity index 55% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinClassSpec.kt index d4842d3..63525b3 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinClassSpec.kt @@ -1,8 +1,9 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec @JvmInline -value class KotlinClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec { +value class KotlinClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt new file mode 100644 index 0000000..3fa6ba0 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt @@ -0,0 +1,24 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinCompanionObjectSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + +class KotlinCompanionObjectBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : Builder, TypeSpecSupplier { + + companion object { + fun builder(name: String? = null) = KotlinCompanionObjectBuilder( + delegate = TypeSpecBuilder.companionObjectBuilder(name) + ) + } + operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinCompanionObjectBuilder = apply { + delegate.block() + } + + override fun build(): KotlinCompanionObjectSpec = KotlinCompanionObjectSpec(spec = delegate.build()) + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt b/kotlin-code-generation/src/_BAK/KotlinCompanionObjectSpec.kt similarity index 53% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinCompanionObjectSpec.kt index c1d1fec..eb38eb6 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinCompanionObjectSpec.kt @@ -1,9 +1,9 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec -@Deprecated("Not implemented yet!") @JvmInline -value class KotlinCompanionObjectSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec { +value class KotlinCompanionObjectSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt b/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt similarity index 69% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt rename to kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt index 1a9e837..c9e181a 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt +++ b/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt @@ -1,10 +1,10 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK import com.squareup.kotlinpoet.TypeName data class KotlinConstructorProperty( - val property: KotlinPropertySpec, - val parameter: KotlinParameterSpec, + val property: KotlinPropertySpec, + val parameter: KotlinParameterSpec, ) : ConstructorPropertySupplier, WithName, WithType { override val name: String = property.name diff --git a/kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt new file mode 100644 index 0000000..4f6089b --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt @@ -0,0 +1,46 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.ConstructorPropertySupplier +import io.toolisticon.kotlin.generation._BAK.KotlinConstructorProperty + +class KotlinConstructorPropertyBuilder internal constructor( + override val name: String, + private val type: TypeName, + private val propertyBuilder: KotlinPropertySpecBuilder, + private val parameterBuilder: KotlinParameterSpecBuilder +) : Builder, ConstructorPropertySupplier { + + companion object { + fun builder(name: String, type: TypeName): KotlinConstructorPropertyBuilder = KotlinConstructorPropertyBuilder( + name = name, + type = type, + propertyBuilder = KotlinPropertySpecBuilder.builder(name = name, type = type), + parameterBuilder = KotlinParameterSpecBuilder.builder(name = name, type = type) + ) + } + + + fun makePrivate() = apply { + propertyBuilder.makePrivate() + } + + fun addAnnotation(annotationSpec: AnnotationSpec): KotlinConstructorPropertyBuilder = apply { + parameterBuilder { + addAnnotation(annotationSpec) + } + } + + override fun build(): KotlinConstructorProperty { + val parameter = parameterBuilder.build() + val property = propertyBuilder { + initializer(parameter.name) + }.build() + + return KotlinConstructorProperty(parameter = parameter, property = property) + } + + override fun get(): KotlinConstructorProperty = build().get() +} diff --git a/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt new file mode 100644 index 0000000..6f0a029 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt @@ -0,0 +1,32 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinEnumClassSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier +import mu.KLogging + +class KotlinEnumClassBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : Builder, TypeSpecSupplier { + + companion object :KLogging() { + fun builder(className: ClassName) = KotlinEnumClassBuilder( + delegate = TypeSpecBuilder.enumBuilder(className) + ) + } + + operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinEnumClassBuilder = apply { + delegate.block() + } + + fun addEnumConstant(name: String) = apply { + delegate.addEnumConstant(name) + } + + override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) + override fun get(): TypeSpec = build().get() + +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt similarity index 63% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt index 06b08e7..bf769b2 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt @@ -1,9 +1,10 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec @JvmInline -value class KotlinEnumClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec { +value class KotlinEnumClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { init { require(spec.isEnum) { "Not an enum spec: $spec" } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinFileBuilder.kt similarity index 86% rename from kotlin-code-generation/src/main/kotlin/builder/KotlinFileBuilder.kt rename to kotlin-code-generation/src/_BAK/KotlinFileBuilder.kt index 873232a..150aff5 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileBuilder.kt +++ b/kotlin-code-generation/src/_BAK/KotlinFileBuilder.kt @@ -1,13 +1,13 @@ -package io.toolisticon.kotlin.generation.builder +package io.toolisticon.kotlin.generation._BAK import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FileSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.FileSpecSupplier -import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinFileSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier +import io.toolisticon.kotlin.generation._BAK.FileSpecSupplier +import io.toolisticon.kotlin.generation._BAK.KotlinDataClassSpec +import io.toolisticon.kotlin.generation._BAK.KotlinFileSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier class KotlinFileBuilder internal constructor(delegate: FileSpec.Builder) : KotlinPoetSpecBuilder( diff --git a/kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt new file mode 100644 index 0000000..0fa5219 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt @@ -0,0 +1,37 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.FileSpec +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.FileSpecBuilder +import io.toolisticon.kotlin.generation._BAK.FileSpecSupplier +import io.toolisticon.kotlin.generation._BAK.KotlinFileSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + + +class KotlinFileSpecBuilder internal constructor( + private val delegate: FileSpecBuilder +) : Builder, FileSpecSupplier { + + companion object { + fun builder(className: ClassName) = KotlinFileSpecBuilder( + delegate = FileSpecBuilder.builder(className) + ) + } + + operator fun invoke(block: FileSpecBuilder.() -> Unit): KotlinFileSpecBuilder = apply { + delegate.block() + } + + fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { + delegate.addType(typeSpecSupplier.get()) + } + + fun addAnnotation(annotationSpec: AnnotationSpec): KotlinFileSpecBuilder = invoke { + addAnnotation(annotationSpec) + } + + override fun build(): KotlinFileSpec = KotlinFileSpec(delegate.build()) + override fun get(): FileSpec = build().get() +} diff --git a/kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt new file mode 100644 index 0000000..7ec4035 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt @@ -0,0 +1,25 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinInterfaceSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + +class KotlinInterfaceBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : Builder, TypeSpecSupplier { + companion object { + fun builder(className: ClassName) = KotlinInterfaceBuilder( + delegate = TypeSpecBuilder.Companion.interfaceBuilder(className) + ) + } + + operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinInterfaceBuilder = apply { + delegate.block() + } + + override fun build(): KotlinInterfaceSpec = KotlinInterfaceSpec(spec = delegate.build()) + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt similarity index 54% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt index 44692b2..181a739 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt @@ -1,9 +1,9 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec -@Deprecated("Not implemented yet!") @JvmInline -value class KotlinInterfaceSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec { +value class KotlinInterfaceSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt b/kotlin-code-generation/src/_BAK/KotlinParameterSpec.kt similarity index 75% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt rename to kotlin-code-generation/src/_BAK/KotlinParameterSpec.kt index 377a6a3..1cd3059 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt +++ b/kotlin-code-generation/src/_BAK/KotlinParameterSpec.kt @@ -1,10 +1,11 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.ParameterSpec import com.squareup.kotlinpoet.TypeName @JvmInline -value class KotlinParameterSpec(private val spec: ParameterSpec) : KotlinPoetSpec, ParameterSpecSupplier, WithName { +value class KotlinParameterSpec(private val spec: ParameterSpec) : KotlinPoetSpec, ParameterSpecSupplier, WithName, Documentable by spec { override val name: String get() = spec.name diff --git a/kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt new file mode 100644 index 0000000..ac820b8 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt @@ -0,0 +1,32 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.ParameterSpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinParameterSpec +import io.toolisticon.kotlin.generation._BAK.ParameterSpecSupplier + +class KotlinParameterSpecBuilder internal constructor( + private val delegate: ParameterSpecBuilder +) : Builder, ParameterSpecSupplier { + + companion object { + fun builder(name: String, type: TypeName) = KotlinParameterSpecBuilder( + delegate = ParameterSpecBuilder.builder(name, type) + ) + } + + operator fun invoke(block: ParameterSpecBuilder.() -> Unit): KotlinParameterSpecBuilder = apply { + delegate.block() + } + + + fun addAnnotation(annotationSpec: AnnotationSpec): KotlinParameterSpecBuilder = invoke { + addAnnotation(annotationSpec) + } + + override fun build(): KotlinParameterSpec = KotlinParameterSpec(spec = delegate.build()) + override fun get(): ParameterSpec = build().get() +} diff --git a/kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt new file mode 100644 index 0000000..d790385 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt @@ -0,0 +1,43 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.PropertySpec +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.PropertySpecBuilder +import io.toolisticon.kotlin.generation._BAK.KotlinPropertySpec +import io.toolisticon.kotlin.generation._BAK.PropertySpecSupplier + +class KotlinPropertySpecBuilder( + private val name: String, + private val type: TypeName, + private val delegate: PropertySpecBuilder +) : Builder, PropertySpecSupplier { + companion object { + fun builder(name: String, type: TypeName, vararg modifiers: KModifier): KotlinPropertySpecBuilder = KotlinPropertySpecBuilder( + name = name, + type = type, + delegate = PropertySpecBuilder.builder(name, type, *modifiers) + ) + } + + operator fun invoke(block: PropertySpecBuilder.() -> Unit): KotlinPropertySpecBuilder = apply { + delegate.block() + } + + fun addAnnotation(annotationSpec: AnnotationSpec): KotlinPropertySpecBuilder = invoke { + addAnnotation(annotationSpec) + } + + fun makePrivate() = invoke { + addModifiers(KModifier.PRIVATE) + } + + fun makeFinal() = invoke { + addModifiers(KModifier.PRIVATE) + } + + override fun build(): KotlinPropertySpec = KotlinPropertySpec(spec = delegate.build()) + override fun get(): PropertySpec = build().get() +} diff --git a/kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt b/kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt new file mode 100644 index 0000000..308b8d3 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt @@ -0,0 +1,9 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.Documentable +import com.squareup.kotlinpoet.TypeAliasSpec + +@JvmInline +value class KotlinTypeAliasSpec(private val spec: TypeAliasSpec) : KotlinPoetSpec, TypeAliasSpecSupplier, Documentable by spec { + override fun get(): TypeAliasSpec = spec +} diff --git a/kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt new file mode 100644 index 0000000..0b3d0df --- /dev/null +++ b/kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt @@ -0,0 +1,55 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.jvm.jvmInline +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.poet.FunSpecBuilder +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation._BAK.ConstructorPropertySupplier +import io.toolisticon.kotlin.generation._BAK.KotlinConstructorProperty +import io.toolisticon.kotlin.generation._BAK.KotlinValueClassSpec + +class KotlinValueClassBuilder( + private val className: ClassName, + private val delegate: TypeSpecBuilder, +) : Builder { + + companion object { + private fun TypeSpecBuilder.init() = apply { + get().addModifiers(KModifier.VALUE) + get().jvmInline() + } + + fun builder(className: ClassName): KotlinValueClassBuilder = KotlinValueClassBuilder( + className = className, + delegate = TypeSpecBuilder.classBuilder(className).init() + ) + } + + lateinit var constructorProperty: KotlinConstructorProperty + + operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinValueClassBuilder = apply { + delegate.block() + } + + fun primaryConstructor(constructorProperty: ConstructorPropertySupplier) = apply { + this.constructorProperty = constructorProperty.get() + + val constructor = FunSpecBuilder.constructorBuilder() + .addParameter(this.constructorProperty.parameter.get()) + .build() + + delegate.addProperty(this.constructorProperty.property.get()) + .primaryConstructor(constructor) + } + + override fun build(): KotlinValueClassSpec { + check(::constructorProperty.isInitialized) { "Value class must have exactly one property." } + + return KotlinValueClassSpec( + className = className, + spec = delegate.build() + ) + } +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/_builder.kt b/kotlin-code-generation/src/_BAK/_builder.kt similarity index 97% rename from kotlin-code-generation/src/main/kotlin/builder/_builder.kt rename to kotlin-code-generation/src/_BAK/_builder.kt index 2dde14b..4ba9f11 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/_builder.kt +++ b/kotlin-code-generation/src/_BAK/_builder.kt @@ -1,7 +1,7 @@ -package io.toolisticon.kotlin.generation.builder +package io.toolisticon.kotlin.generation._BAK import com.squareup.kotlinpoet.* -import io.toolisticon.kotlin.generation.spec.* +import io.toolisticon.kotlin.generation._BAK.* import kotlin.reflect.KClass fun interface Builder { diff --git a/kotlin-code-generation/src/main/kotlin/spec/_facet.kt b/kotlin-code-generation/src/_BAK/_facet.kt similarity index 90% rename from kotlin-code-generation/src/main/kotlin/spec/_facet.kt rename to kotlin-code-generation/src/_BAK/_facet.kt index cfa689d..0259e0b 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/_facet.kt +++ b/kotlin-code-generation/src/_BAK/_facet.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation.spec +package io.toolisticon.kotlin.generation._BAK import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeName diff --git a/kotlin-code-generation/src/_BAK/_spec.kt b/kotlin-code-generation/src/_BAK/_spec.kt new file mode 100644 index 0000000..e51b583 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/_spec.kt @@ -0,0 +1,33 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.* +import java.util.function.Supplier + +sealed interface KotlinPoetSpec : SpecSupplier { + val code: String get() = get().toString() +} + +sealed interface KotlinPoetTypeSpec : KotlinPoetSpec, TypeSpecSupplier, WithAnnotationSpecs, Documentable { + override fun get(): TypeSpec + + override val annotations: List get() = KotlinAnnotationSpec.of(get().annotations) +} + +sealed interface KotlinPoetNamedTypeSpec : KotlinPoetTypeSpec, WithClassName + +interface SpecSupplier : Supplier +interface AnnotationSpecSupplier : SpecSupplier +interface FileSpecSupplier : SpecSupplier +interface FunSpecSupplier : SpecSupplier +interface ParameterSpecSupplier : SpecSupplier +interface PropertySpecSupplier : SpecSupplier +interface TypeAliasSpecSupplier : SpecSupplier +interface TypeSpecSupplier : SpecSupplier +interface DataClassSpecSupplier : SpecSupplier, TypeSpecSupplier +interface ConstructorPropertySupplier : SpecSupplier, WithName + + +interface KotlinPoetSpecToBuilder { + fun toBuilder(): BUILDER +} + diff --git a/kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt new file mode 100644 index 0000000..953a1d6 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt @@ -0,0 +1,9 @@ +package io.toolisticon.kotlin.generation._BAK.bak + +import com.squareup.kotlinpoet.Annotatable +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.SpecSupplier + +@Deprecated("remove") +interface AnnotatableSpecBuilder, SPEC : Annotatable, SPEC_BUILDER : Annotatable.Builder> : + Builder diff --git a/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt new file mode 100644 index 0000000..3cea41d --- /dev/null +++ b/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt @@ -0,0 +1,39 @@ +package io.toolisticon.kotlin.generation._BAK.bak + +import io.toolisticon.kotlin.generation._BAK.KotlinPoetSpec + +/** + * Self-Type implementation of the root Spec builder. This is needed, because: a) we want implementing builders + * to return an instance of themselves, so we can type-safe and fluently build products. + * And b) because unfortunately kotlin-poet does not provide common super-types for specs and builders. + * + * @param SELF concrete instance of this builder to return in implementing classes. + * @param PRODUCT the [KotlinPoetSpec] type returned by this builder. + * @param SPEC the kotlin poet spec the [PRODUCT] refers to. + * @param SPEC_BUILDER the specific kotlin poet builder used to modify [PRODUCT]. + * @param delegate provide an instance of the specific builder + */ +@Deprecated("remove") +sealed class BAK_KotlinPoetSpecBuilder< + SELF : BAK_KotlinPoetSpecBuilder, + PRODUCT : KotlinPoetSpec, + SPEC : Any, + SPEC_BUILDER : Any + >( + protected val delegate: SPEC_BUILDER +) : SpecBuilder { + + @Suppress("UNCHECKED_CAST") + protected fun applySelf(block: SELF.() -> Unit): SELF = (this as SELF).apply { + block() + } + + /** + * Directly invoke underlying builder to support all build-in features. + */ + operator fun invoke(block: SPEC_BUILDER.() -> Unit): SELF = applySelf { + delegate.block() + } + + abstract override fun build(): PRODUCT +} diff --git a/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt new file mode 100644 index 0000000..9d4e598 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt @@ -0,0 +1,29 @@ +package io.toolisticon.kotlin.generation._BAK.bak + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation._BAK.KotlinPoetTypeSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + +@Deprecated("remove") +sealed class BAK_KotlinPoetTypeSpecBuilder( + delegate: TypeSpec.Builder +) : BAK_KotlinPoetSpecBuilder, T, TypeSpec, TypeSpec.Builder>( + delegate = delegate +), TypeSpecSupplier +// AnnotatableSpecBuilder, T, TypeSpec, TypeSpec.Builder>, T, TypeSpec, TypeSpec.Builder>, +//, DocumentableSpecBuilder, T, TypeSpec, TypeSpec.Builder>, T, TypeSpec, TypeSpec.Builder> +{ + + + fun addAnnotation(annotationSpec: AnnotationSpec) = applySelf { + delegate.addAnnotation(annotationSpec) + } + + fun addKdoc(block: CodeBlock) = applySelf { + delegate.addKdoc(block) + } + + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt new file mode 100644 index 0000000..2258358 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt @@ -0,0 +1,14 @@ +package io.toolisticon.kotlin.generation._BAK.bak + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation._BAK.KotlinPoetNamedTypeSpec +import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier + +@Deprecated("remove") +sealed class KotlinPoetNamedTypeSpecBuilder( + protected val className: ClassName, + delegate: TypeSpec.Builder +) : BAK_KotlinPoetTypeSpecBuilder( + delegate = delegate +), TypeSpecSupplier diff --git a/kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt new file mode 100644 index 0000000..7daa197 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt @@ -0,0 +1,8 @@ +package io.toolisticon.kotlin.generation._BAK.bak + +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation._BAK.SpecSupplier + +@Deprecated("remove") +sealed interface SpecBuilder, PRODUCT : SpecSupplier, SPEC, SPEC_BUILDER> : + Builder diff --git a/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt new file mode 100644 index 0000000..dc04100 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt @@ -0,0 +1,6 @@ +package io.toolisticon.kotlin.generation._BAK.bak + +@Deprecated("remove") +interface ToKotlinPoetSpecBuilder { + operator fun invoke(spec: SPEC): BUILDER +} diff --git a/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt new file mode 100644 index 0000000..83a0a10 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation._BAK.bak + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation._BAK.KotlinPoetTypeSpec + +@Deprecated("remove") +interface ToKotlinPoetTypeSpecBuilder { + + operator fun invoke(spec: SPEC, kind: TypeSpec.Kind = spec.get().kind, name: String? = spec.get().name): BUILDER +} diff --git a/kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt new file mode 100644 index 0000000..ac4c158 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt @@ -0,0 +1,12 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.Annotatable +import com.squareup.kotlinpoet.AnnotationSpec +import io.toolisticon.kotlin.generation.BuilderSupplier + +sealed interface AnnotatableBuilder, S : Annotatable, B : Annotatable.Builder> + : BuilderSupplier, Annotatable.Builder { + override val annotations: MutableList get() = get().annotations + + fun addAnnotation(builder: AnnotationSpecBuilder): SELF = addAnnotation(builder.build()) +} diff --git a/kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt new file mode 100644 index 0000000..d95b6a4 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt @@ -0,0 +1,33 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.AnnotationSpec.Builder +import com.squareup.kotlinpoet.AnnotationSpec.UseSiteTarget +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.ParameterizedTypeName +import io.toolisticon.kotlin.generation.BuilderSupplier +import kotlin.reflect.KClass + +typealias AnnotationSpecBuilderReceiver = AnnotationSpecBuilder.() -> Unit + +@JvmInline +value class AnnotationSpecBuilder(val builder: Builder) : BuilderSupplier, + TaggableBuilder { + companion object { + internal fun Builder.wrap() = AnnotationSpecBuilder(this) + fun builder(type: ClassName): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() + fun builder(type: ParameterizedTypeName): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() + fun builder(type: KClass): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() + } + + val members: MutableList get() = get().members + + fun addMember(format: String, vararg args: Any): AnnotationSpecBuilder = apply { builder.addMember(format, *args) } + fun addMember(codeBlock: CodeBlock): AnnotationSpecBuilder = apply { builder.addMember(codeBlock) } + fun addMember(builder: CodeBlockBuilder): AnnotationSpecBuilder = addMember(builder.build()) + fun useSiteTarget(useSiteTarget: UseSiteTarget): AnnotationSpecBuilder = apply { builder.useSiteTarget(useSiteTarget) } + + override fun build(): AnnotationSpec = builder.build() + override fun get(): Builder = builder +} diff --git a/kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt b/kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt new file mode 100644 index 0000000..9a3e043 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt @@ -0,0 +1,33 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.CodeBlock.Builder +import io.toolisticon.kotlin.generation.BuilderSupplier + +typealias CodeBlockBuilderReceiver = CodeBlockBuilder.() -> Unit + +@JvmInline +value class CodeBlockBuilder(private val builder: Builder) : BuilderSupplier { + companion object { + private fun Builder.wrap() = CodeBlockBuilder(this) + fun of(format: String, vararg args: Any?): CodeBlock = CodeBlock.of(format, *args) + fun builder(): CodeBlockBuilder = CodeBlock.builder().wrap() + } + + fun add(format: String, vararg args: Any?): CodeBlockBuilder = apply { builder.add(format, *args) } + fun add(codeBlock: CodeBlock): CodeBlockBuilder = apply { builder.add(codeBlock) } + fun add(builder: CodeBlockBuilder): CodeBlockBuilder = add(builder.build()) + fun addNamed(format: String, arguments: Map): CodeBlockBuilder = apply { builder.addNamed(format, arguments) } + fun addStatement(format: String, vararg args: Any?): CodeBlockBuilder = apply { builder.addStatement(format, *args) } + fun beginControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = apply { builder.beginControlFlow(controlFlow, *args) } + fun clear(): CodeBlockBuilder = apply { builder.clear() } + fun endControlFlow(): CodeBlockBuilder = apply { builder.endControlFlow() } + fun indent(): CodeBlockBuilder = apply { builder.indent() } + fun isEmpty(): Boolean = builder.isEmpty() + fun isNotEmpty(): Boolean = builder.isNotEmpty() + fun nextControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = apply { builder.nextControlFlow(controlFlow, *args) } + fun unindent(): CodeBlockBuilder = apply { builder.unindent() } + + override fun build(): CodeBlock = get().build() + override fun get(): Builder = builder +} diff --git a/kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt new file mode 100644 index 0000000..44a03b6 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt @@ -0,0 +1,12 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.ContextReceivable +import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.BuilderSupplier + +@ExperimentalKotlinPoetApi +sealed interface ContextReceivableBuilder, S : ContextReceivable, B : ContextReceivable.Builder> + : BuilderSupplier, ContextReceivable.Builder { + override val contextReceiverTypes: MutableList get() = get().contextReceiverTypes +} diff --git a/kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt new file mode 100644 index 0000000..525e00d --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt @@ -0,0 +1,12 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.Documentable +import io.toolisticon.kotlin.generation.BuilderSupplier + +sealed interface DocumentableBuilder, S : Documentable, B : Documentable.Builder> + : BuilderSupplier, Documentable.Builder { + override val kdoc: CodeBlock.Builder get() = get().kdoc + + fun addKdoc(builder: CodeBlockBuilder): SELF = addKdoc(builder.build()) +} diff --git a/kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt new file mode 100644 index 0000000..2267aa7 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt @@ -0,0 +1,65 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.FileSpec.Builder +import io.toolisticon.kotlin.generation.BuilderSupplier +import kotlin.reflect.KClass + +typealias FileSpecBuilderReceiver = FileSpecBuilder.() -> Unit + +@JvmInline +value class FileSpecBuilder(private val builder: Builder) : BuilderSupplier, + AnnotatableBuilder, + MemberSpecHolderBuilder, + TaggableBuilder, + TypeSpecHolderBuilder { + companion object { + private fun Builder.wrap() = FileSpecBuilder(this) + fun get(packageName: String, typeSpec: TypeSpec): FileSpec = FileSpec.get(packageName, typeSpec) + fun builder(className: ClassName): FileSpecBuilder = FileSpec.builder(className).wrap() + fun builder(memberName: MemberName): FileSpecBuilder = FileSpec.builder(memberName).wrap() + fun builder(packageName: String, fileName: String): FileSpecBuilder = FileSpec.builder(packageName, fileName).wrap() + fun scriptBuilder(fileName: String, packageName: String = ""): FileSpecBuilder = FileSpec.scriptBuilder(fileName, packageName).wrap() + } + + val defaultImports: MutableSet get() = builder.defaultImports + val imports: List get() = builder.imports + val members: MutableList get() = builder.members + + fun addAliasedImport(type: KClass<*>, alias: String): FileSpecBuilder = addAliasedImport(type.asClassName(), alias) + fun addAliasedImport(className: ClassName, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(className, alias) } + fun addAliasedImport(className: ClassName, memberName: String, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(className, memberName, alias) } + fun addAliasedImport(memberName: MemberName, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(memberName, alias) } + fun addBodyComment(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addBodyComment(format, *args) } + fun addCode(format: String, vararg args: Any?): FileSpecBuilder = apply { builder.addCode(format, *args) } + fun addCode(codeBlock: CodeBlock): FileSpecBuilder = apply { builder.addCode(codeBlock) } + fun addCode(builder: CodeBlockBuilder): FileSpecBuilder = addCode(builder.build()) + fun addDefaultPackageImport(packageName: String): FileSpecBuilder = apply { builder.addDefaultPackageImport(packageName) } + fun addFileComment(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addFileComment(format, *args) } + override fun addFunction(funSpec: FunSpec): FileSpecBuilder = apply { builder.addFunction(funSpec) } + fun addImport(constant: Enum<*>): FileSpecBuilder = apply { builder.addImport(constant) } + fun addImport(type: KClass<*>, vararg names: String): FileSpecBuilder = apply { builder.addImport(type, *names) } + fun addImport(className: ClassName, vararg names: String): FileSpecBuilder = apply { builder.addImport(className, *names) } + fun addImport(type: KClass<*>, names: Iterable): FileSpecBuilder = addImport(type.asClassName(), names) + fun addImport(className: ClassName, names: Iterable): FileSpecBuilder = apply { builder.addImport(className, names) } + fun addImport(packageName: String, vararg names: String): FileSpecBuilder = apply { builder.addImport(packageName, *names) } + fun addImport(import: Import): FileSpecBuilder = apply { builder.addImport(import) } + fun addImport(packageName: String, names: Iterable): FileSpecBuilder = apply { builder.addImport(packageName, names) } + fun addKotlinDefaultImports(includeJvm: Boolean = true, includeJs: Boolean = true): FileSpecBuilder = apply { builder.addKotlinDefaultImports(includeJvm, includeJs) } + fun addNamedCode(format: String, args: Map): FileSpecBuilder = apply { builder.addNamedCode(format, args) } + override fun addProperty(propertySpec: PropertySpec): FileSpecBuilder = apply { builder.addProperty(propertySpec) } + fun addStatement(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addStatement(format, *args) } + override fun addType(typeSpec: TypeSpec): FileSpecBuilder = apply { builder.addType(typeSpec) } + fun addTypeAlias(typeAliasSpec: TypeAliasSpec): FileSpecBuilder = apply { builder.addTypeAlias(typeAliasSpec) } + fun addTypeAlias(builder: TypeAliasSpecBuilder): FileSpecBuilder = addTypeAlias(builder.build()) + fun beginControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = apply { builder.beginControlFlow(controlFlow, *args) } + fun clearBody(): FileSpecBuilder = apply { builder.clearBody() } + fun clearComment(): FileSpecBuilder = apply { builder.clearComment() } + fun clearImports(): FileSpecBuilder = apply { builder.clearImports() } + fun endControlFlow(): FileSpecBuilder = apply { builder.endControlFlow() } + fun indent(indent: String): FileSpecBuilder = apply { builder.indent(indent) } + fun nextControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = apply { builder.nextControlFlow(controlFlow, *args) } + + override fun build(): FileSpec = builder.build() + override fun get(): Builder = builder +} diff --git a/kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt new file mode 100644 index 0000000..f0e5736 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt @@ -0,0 +1,75 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.FunSpec.Builder +import io.toolisticon.kotlin.generation.BuilderSupplier +import java.lang.reflect.Type +import javax.lang.model.element.Modifier +import kotlin.reflect.KClass + +typealias FunSpecBuilderReceiver = FunSpecBuilder.() -> Unit + +@OptIn(ExperimentalKotlinPoetApi::class) +@JvmInline +value class FunSpecBuilder(private val builder: Builder) : BuilderSupplier, + AnnotatableBuilder, + ContextReceivableBuilder, + DocumentableBuilder, + KModifierHolderBuilder, + OriginatingElementsHolderBuilder, + TaggableBuilder, + TypeVariableHolderBuilder { + companion object { + private fun Builder.wrap() = FunSpecBuilder(this) + fun builder(name: String): FunSpecBuilder = FunSpec.builder(name).wrap() + fun builder(memberName: MemberName): FunSpecBuilder = FunSpec.builder(memberName).wrap() + + fun constructorBuilder(): FunSpecBuilder = FunSpec.constructorBuilder().wrap() + fun getterBuilder(): FunSpecBuilder = FunSpec.getterBuilder().wrap() + fun setterBuilder(): FunSpecBuilder = FunSpec.setterBuilder().wrap() + } + + override val modifiers: MutableList get() = builder.modifiers + override val typeVariables: MutableList get() = builder.typeVariables + val parameters: MutableList get() = builder.parameters + + fun addCode(codeBlock: CodeBlock): FunSpecBuilder = apply { builder.addCode(codeBlock) } + fun addCode(format: String, vararg args: Any?): FunSpecBuilder = apply { builder.addCode(format, *args) } + fun addComment(format: String, vararg args: Any): FunSpecBuilder = apply { builder.addComment("//·${format.replace(' ', '·')}\n", *args) } + fun addNamedCode(format: String, args: Map): FunSpecBuilder = apply { builder.addNamedCode(format, args) } + fun addParameter(parameterSpec: ParameterSpec): FunSpecBuilder = apply { builder.addParameter(parameterSpec) } + fun addParameter(name: String, type: TypeName, vararg modifiers: KModifier): FunSpecBuilder = addParameter(ParameterSpec.builder(name, type, *modifiers).build()) + fun addParameter(name: String, type: Type, vararg modifiers: KModifier): FunSpecBuilder = addParameter(name, type.asTypeName(), *modifiers) + fun addParameter(name: String, type: KClass<*>, vararg modifiers: KModifier): FunSpecBuilder = addParameter(name, type.asTypeName(), *modifiers) + fun addParameter(name: String, type: TypeName, modifiers: Iterable): FunSpecBuilder = addParameter(ParameterSpec.builder(name, type, modifiers).build()) + fun addParameter(name: String, type: Type, modifiers: Iterable): FunSpecBuilder = addParameter(name, type.asTypeName(), modifiers) + fun addParameter(name: String, type: KClass<*>, modifiers: Iterable): FunSpecBuilder = addParameter(name, type.asTypeName(), modifiers) + fun addParameters(parameterSpecs: Iterable): FunSpecBuilder = apply { builder.addParameters(parameterSpecs) } + fun addStatement(format: String, vararg args: Any): FunSpecBuilder = apply { builder.addStatement(format, *args) } + fun beginControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = apply { builder.beginControlFlow(controlFlow, *args) } + fun callSuperConstructor(args: Iterable): FunSpecBuilder = apply { builder.callSuperConstructor(args.toList()) } + fun callSuperConstructor(args: List): FunSpecBuilder = apply { builder.callSuperConstructor(args) } + fun callSuperConstructor(vararg args: String): FunSpecBuilder = apply { builder.callSuperConstructor(args.map { CodeBlock.of(it) }) } + fun callSuperConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = apply { builder.callSuperConstructor(args.toList()) } + fun callThisConstructor(args: List): FunSpecBuilder = apply { builder.callThisConstructor(args) } + fun callThisConstructor(args: Iterable): FunSpecBuilder = apply { builder.callThisConstructor(args.toList()) } + fun callThisConstructor(vararg args: String): FunSpecBuilder = apply { builder.callThisConstructor(args.map { CodeBlock.of(it) }) } + fun callThisConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = apply { builder.callThisConstructor(args.toList()) } + fun clearBody(): FunSpecBuilder = apply { builder.clearBody() } + fun endControlFlow(): FunSpecBuilder = apply { builder.endControlFlow() } + fun jvmModifiers(modifiers: Iterable): FunSpecBuilder = apply { builder.jvmModifiers(modifiers) } + fun nextControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = apply { builder.nextControlFlow(controlFlow, *args) } + fun receiver(receiverType: TypeName, kdoc: CodeBlock): FunSpecBuilder = apply { builder.receiver(receiverType, kdoc) } + fun receiver(receiverType: Type, kdoc: CodeBlock): FunSpecBuilder = receiver(receiverType.asTypeName(), kdoc) + fun receiver(receiverType: Type, kdoc: String, vararg args: Any): FunSpecBuilder = receiver(receiverType, CodeBlock.of(kdoc, args)) + fun receiver(receiverType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = receiver(receiverType.asTypeName(), kdoc) + fun receiver(receiverType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = receiver(receiverType, CodeBlock.of(kdoc, args)) + fun returns(returnType: TypeName, kdoc: CodeBlock): FunSpecBuilder = apply { builder.returns(returnType, kdoc) } + fun returns(returnType: Type, kdoc: CodeBlock): FunSpecBuilder = returns(returnType.asTypeName(), kdoc) + fun returns(returnType: Type, kdoc: String, vararg args: Any): FunSpecBuilder = returns(returnType.asTypeName(), CodeBlock.of(kdoc, args)) + fun returns(returnType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = returns(returnType.asTypeName(), kdoc) + fun returns(returnType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = returns(returnType.asTypeName(), CodeBlock.of(kdoc, args)) + + override fun build(): FunSpec = builder.build() + override fun get(): Builder = builder +} diff --git a/kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt new file mode 100644 index 0000000..c903c18 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt @@ -0,0 +1,19 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.KModifier +import io.toolisticon.kotlin.generation.BuilderSupplier + +@Suppress("UNCHECKED_CAST") +sealed interface KModifierHolderBuilder, S : Any, B : Any> + : BuilderSupplier { + val modifiers: MutableList + + fun addModifiers(vararg modifiers: KModifier): SELF = apply { + this.modifiers += modifiers + } as SELF + + public fun addModifiers(modifiers: Iterable): SELF = apply { + this.modifiers += modifiers + } as SELF + +} diff --git a/kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt new file mode 100644 index 0000000..3376d63 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt @@ -0,0 +1,20 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi +import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.MemberSpecHolder +import com.squareup.kotlinpoet.PropertySpec +import io.toolisticon.kotlin.generation.BuilderSupplier + +sealed interface MemberSpecHolderBuilder, S : MemberSpecHolder, B : MemberSpecHolder.Builder> + : BuilderSupplier, MemberSpecHolder.Builder { + override fun addProperty(propertySpec: PropertySpec): SELF + + @OptIn(ExperimentalKotlinPoetApi::class) + fun addProperty(builder: PropertySpecBuilder): SELF = addProperty(builder.build()) + + override fun addFunction(funSpec: FunSpec): SELF + + @OptIn(ExperimentalKotlinPoetApi::class) + fun addFunction(builder: FunSpecBuilder): SELF = addFunction(builder.build()) +} diff --git a/kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt new file mode 100644 index 0000000..dfc5c01 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.OriginatingElementsHolder +import io.toolisticon.kotlin.generation.BuilderSupplier +import javax.lang.model.element.Element + +sealed interface OriginatingElementsHolderBuilder, S : OriginatingElementsHolder, B : OriginatingElementsHolder.Builder> + : BuilderSupplier, OriginatingElementsHolder.Builder { + override val originatingElements: MutableList get() = get().originatingElements +} diff --git a/kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt new file mode 100644 index 0000000..896a808 --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt @@ -0,0 +1,37 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.ParameterSpec.Builder +import io.toolisticon.kotlin.generation.BuilderSupplier +import java.lang.reflect.Type +import kotlin.reflect.KClass + +typealias ParameterSpecBuilderReceiver = ParameterSpecBuilder.() -> Unit + +@JvmInline +value class ParameterSpecBuilder(private val builder: Builder) : BuilderSupplier, + AnnotatableBuilder, + DocumentableBuilder, + KModifierHolderBuilder, + TaggableBuilder { + companion object { + private fun Builder.wrap() = ParameterSpecBuilder(this) + fun builder(name: String, type: TypeName, vararg modifiers: KModifier): ParameterSpecBuilder = ParameterSpec.builder(name, type, *modifiers).wrap() + fun builder(name: String, type: Type, vararg modifiers: KModifier): ParameterSpecBuilder = builder(name, type.asTypeName(), *modifiers) + fun builder(name: String, type: KClass<*>, vararg modifiers: KModifier): ParameterSpecBuilder = builder(name, type.asTypeName(), *modifiers) + fun builder(name: String, type: TypeName, modifiers: Iterable): ParameterSpecBuilder = ParameterSpec.builder(name, type, modifiers).wrap() + fun builder(name: String, type: Type, modifiers: Iterable): ParameterSpecBuilder = ParameterSpec.builder(name, type.asTypeName(), modifiers).wrap() + fun builder(name: String, type: KClass<*>, modifiers: Iterable): ParameterSpecBuilder = builder(name, type.asTypeName(), modifiers) + fun unnamed(type: KClass<*>): ParameterSpec = unnamed(type.asTypeName()) + fun unnamed(type: Type): ParameterSpec = unnamed(type.asTypeName()) + fun unnamed(type: TypeName): ParameterSpec = ParameterSpec.unnamed(type) + } + + override val modifiers: MutableList get() = builder.modifiers + + fun defaultValue(format: String, vararg args: Any?): ParameterSpecBuilder = defaultValue(CodeBlock.of(format, *args)) + fun defaultValue(codeBlock: CodeBlock?): ParameterSpecBuilder = apply { builder.defaultValue(codeBlock) } + + override fun build(): ParameterSpec = builder.build() + override fun get(): Builder = builder +} diff --git a/kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt new file mode 100644 index 0000000..bce67fb --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt @@ -0,0 +1,46 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.PropertySpec.Builder +import io.toolisticon.kotlin.generation.BuilderSupplier +import java.lang.reflect.Type +import kotlin.reflect.KClass + +typealias PropertySpecBuilderReceiver = PropertySpecBuilder.() -> Unit + +@OptIn(ExperimentalKotlinPoetApi::class) +@JvmInline +value class PropertySpecBuilder(private val builder: Builder) : BuilderSupplier, + AnnotatableBuilder, + ContextReceivableBuilder, + DocumentableBuilder, + KModifierHolderBuilder, + TaggableBuilder, + TypeVariableHolderBuilder, + OriginatingElementsHolderBuilder { + companion object { + private fun Builder.wrap() = PropertySpecBuilder(this) + fun builder(name: String, type: TypeName, vararg modifiers: KModifier): PropertySpecBuilder = PropertySpec.builder(name, type, *modifiers).wrap() + fun builder(name: String, type: Type, vararg modifiers: KModifier): PropertySpecBuilder = builder(name, type.asTypeName(), *modifiers) + fun builder(name: String, type: KClass<*>, vararg modifiers: KModifier): PropertySpecBuilder = builder(name, type.asTypeName(), *modifiers) + fun builder(name: String, type: TypeName, modifiers: Iterable): PropertySpecBuilder = PropertySpec.builder(name, type, modifiers).wrap() + fun builder(name: String, type: KClass<*>, modifiers: Iterable): PropertySpecBuilder = builder(name, type.asTypeName(), modifiers) + } + + override val modifiers: MutableList get() = builder.modifiers + override val typeVariables: MutableList get() = builder.typeVariables + + fun delegate(codeBlock: CodeBlock): PropertySpecBuilder = apply { builder.delegate(codeBlock) } + fun delegate(format: String, vararg args: Any?): PropertySpecBuilder = delegate(CodeBlock.of(format, *args)) + fun getter(getter: FunSpec?): PropertySpecBuilder = apply { builder.getter(getter) } + fun initializer(format: String, vararg args: Any?): PropertySpecBuilder = initializer(CodeBlock.of(format, *args)) + fun initializer(codeBlock: CodeBlock?): PropertySpecBuilder = apply { builder.initializer(codeBlock) } + fun mutable(mutable: Boolean = true): PropertySpecBuilder = apply { builder.mutable(mutable) } + fun receiver(receiverType: TypeName?): PropertySpecBuilder = apply { builder.receiver(receiverType) } + fun receiver(receiverType: KClass<*>): PropertySpecBuilder = receiver(receiverType.asTypeName()) + fun setter(setter: FunSpec?): PropertySpecBuilder = apply { builder.setter(setter) } + + override fun build(): PropertySpec = builder.build() + override fun get(): Builder = builder +} + diff --git a/kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt new file mode 100644 index 0000000..b306bee --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.Taggable +import io.toolisticon.kotlin.generation.BuilderSupplier +import kotlin.reflect.KClass + +sealed interface TaggableBuilder, S : Taggable, B : Taggable.Builder> + : BuilderSupplier, Taggable.Builder { + override val tags: MutableMap, Any> get() = get().tags +} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt new file mode 100644 index 0000000..e556e7e --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt @@ -0,0 +1,28 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.TypeAliasSpec.Builder +import io.toolisticon.kotlin.generation.BuilderSupplier +import kotlin.reflect.KClass + +typealias TypeAliasSpecBuilderReceiver = TypeAliasSpecBuilder.() -> Unit + +@JvmInline +value class TypeAliasSpecBuilder(private val builder: Builder) : BuilderSupplier, + AnnotatableBuilder, + DocumentableBuilder, + KModifierHolderBuilder, + TaggableBuilder, + TypeVariableHolderBuilder { + companion object { + private fun Builder.wrap() = TypeAliasSpecBuilder(this) + fun builder(name: String, type: TypeName): TypeAliasSpecBuilder = TypeAliasSpec.builder(name, type).wrap() + fun builder(name: String, type: KClass<*>): TypeAliasSpecBuilder = builder(name, type.asTypeName()) + } + + override val modifiers: MutableList get() = builder.modifiers.toMutableList() + override val typeVariables: MutableList get() = builder.typeVariables.toMutableList() + + override fun build(): TypeAliasSpec = builder.build() + override fun get(): Builder = builder +} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt new file mode 100644 index 0000000..54d91eb --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt @@ -0,0 +1,70 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.TypeSpec.Builder +import io.toolisticon.kotlin.generation.BuilderSupplier +import kotlin.reflect.KClass + +typealias TypeSpecBuilderReceiver = TypeSpecBuilder.() -> Unit + +@JvmInline +@OptIn(ExperimentalKotlinPoetApi::class) +value class TypeSpecBuilder(private val builder: Builder) : BuilderSupplier, + AnnotatableBuilder, + ContextReceivableBuilder, + DocumentableBuilder, + KModifierHolderBuilder, + MemberSpecHolderBuilder, + OriginatingElementsHolderBuilder, + TaggableBuilder, + TypeSpecHolderBuilder, + TypeVariableHolderBuilder { + + companion object { + private fun Builder.wrap() = TypeSpecBuilder(this) + fun annotationBuilder(name: String): TypeSpecBuilder = TypeSpec.annotationBuilder(name).wrap() + fun annotationBuilder(className: ClassName): TypeSpecBuilder = annotationBuilder(className.simpleName) + fun anonymousClassBuilder(): TypeSpecBuilder = TypeSpec.anonymousClassBuilder().wrap() + fun classBuilder(name: String): TypeSpecBuilder = TypeSpec.classBuilder(name).wrap() + fun classBuilder(className: ClassName): TypeSpecBuilder = classBuilder(className.simpleName) + fun companionObjectBuilder(name: String? = null): TypeSpecBuilder = TypeSpec.companionObjectBuilder(name).wrap() + fun enumBuilder(name: String): TypeSpecBuilder = TypeSpec.enumBuilder(name).wrap() + fun enumBuilder(className: ClassName): TypeSpecBuilder = TypeSpec.enumBuilder(className).wrap() + fun funInterfaceBuilder(name: String): TypeSpecBuilder = TypeSpec.funInterfaceBuilder(name).wrap() + fun funInterfaceBuilder(className: ClassName): TypeSpecBuilder = TypeSpec.funInterfaceBuilder(className).wrap() + fun interfaceBuilder(name: String): TypeSpecBuilder = TypeSpec.interfaceBuilder(name).wrap() + fun interfaceBuilder(className: ClassName): TypeSpecBuilder = TypeSpec.interfaceBuilder(className).wrap() + fun objectBuilder(name: String): TypeSpecBuilder = TypeSpec.objectBuilder(name).wrap() + fun objectBuilder(className: ClassName): TypeSpecBuilder = objectBuilder(className.simpleName) + } + + val enumConstants: MutableMap get() = builder.enumConstants + val funSpecs: MutableList get() = builder.funSpecs + override val modifiers: MutableList get() = builder.modifiers.toMutableList() + val propertySpecs: MutableList get() = builder.propertySpecs + val superclassConstructorParameters: MutableList get() = builder.superclassConstructorParameters + val superinterfaces: MutableMap get() = builder.superinterfaces + val typeSpecs: MutableList get() = builder.typeSpecs + override val typeVariables: MutableList get() = builder.typeVariables + + fun addEnumConstant(name: String, typeSpec: TypeSpec = anonymousClassBuilder().build()): TypeSpecBuilder = apply { builder.addEnumConstant(name, typeSpec) } + override fun addFunction(funSpec: FunSpec): TypeSpecBuilder = apply { builder.addFunction(funSpec) } + fun addInitializerBlock(block: CodeBlock): TypeSpecBuilder = apply { builder.addInitializerBlock(block) } + fun addInitializerBlock(builder: CodeBlockBuilder): TypeSpecBuilder = addInitializerBlock(builder.build()) + override fun addProperty(propertySpec: PropertySpec): TypeSpecBuilder = apply { builder.addProperty(propertySpec) } + fun addSuperclassConstructorParameter(format: String, vararg args: Any): TypeSpecBuilder = apply { builder.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock): TypeSpecBuilder = apply { builder.addSuperclassConstructorParameter(codeBlock) } + fun addSuperclassConstructorParameter(builder: CodeBlockBuilder): TypeSpecBuilder = addSuperclassConstructorParameter(builder.build()) + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock): TypeSpecBuilder = addSuperinterface(superinterface.asTypeName(), delegate) + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String): TypeSpecBuilder = addSuperinterface(superinterface.asTypeName(), constructorParameterName) + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, constructorParameter) } + fun addSuperinterfaces(superinterfaces: Iterable): TypeSpecBuilder = apply { builder.addSuperinterfaces(superinterfaces) } + override fun addType(typeSpec: TypeSpec): TypeSpecBuilder = apply { builder.addType(typeSpec) } + fun primaryConstructor(primaryConstructor: FunSpec): TypeSpecBuilder = apply { builder.primaryConstructor(primaryConstructor) } + fun superclass(superclass: TypeName): TypeSpecBuilder = apply { builder.superclass(superclass) } + fun superclass(superclass: KClass<*>): TypeSpecBuilder = superclass(superclass.asTypeName()) + + override fun build(): TypeSpec = builder.build() + override fun get(): Builder = builder +} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt new file mode 100644 index 0000000..ceb792c --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt @@ -0,0 +1,12 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.* +import io.toolisticon.kotlin.generation.BuilderSupplier + +sealed interface TypeSpecHolderBuilder, S : TypeSpecHolder, B : TypeSpecHolder.Builder> + : BuilderSupplier, TypeSpecHolder.Builder { + override fun addType(typeSpec: TypeSpec): SELF + + @OptIn(ExperimentalKotlinPoetApi::class) + fun addType(builder: TypeSpecBuilder): SELF = addType(builder.build()) +} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt new file mode 100644 index 0000000..6d0108d --- /dev/null +++ b/kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt @@ -0,0 +1,19 @@ +package io.toolisticon.kotlin.generation._BAK.poet + +import com.squareup.kotlinpoet.TypeVariableName +import io.toolisticon.kotlin.generation.BuilderSupplier + +@Suppress("UNCHECKED_CAST") +sealed interface TypeVariableHolderBuilder, S : Any, B : Any> + : BuilderSupplier { + val typeVariables: MutableList + + fun addTypeVariables(typeVariables: Iterable): SELF = apply { + this.typeVariables += typeVariables + } as SELF + + fun addTypeVariable(typeVariable: TypeVariableName): SELF = apply { + typeVariables += typeVariable + } as SELF + +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationSpecTest.kt b/kotlin-code-generation/src/_TEST/KotlinAnnotationSpecTest.kt similarity index 82% rename from kotlin-code-generation/src/test/kotlin/KotlinAnnotationSpecTest.kt rename to kotlin-code-generation/src/_TEST/KotlinAnnotationSpecTest.kt index 5751ab8..49459ba 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationSpecTest.kt +++ b/kotlin-code-generation/src/_TEST/KotlinAnnotationSpecTest.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation -import io.toolisticon.kotlin.generation.spec.toBuilder +import io.toolisticon.kotlin.generation.builder.KotlinAnnotationSpecBuilder +import io.toolisticon.kotlin.generation._BAK.toBuilder import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import kotlin.reflect.KClass @@ -15,7 +16,7 @@ class KotlinAnnotationSpecTest { @Test fun `create Foo annotation`() { - val spec = KotlinCodeGeneration.annotationBuilder(Foo::class) + val spec = KotlinAnnotationSpecBuilder.builder(Foo::class) .addMember("bar = %S", "hello world") .addStringMember("x", "foo") .addKClassMember("type", Long::class) @@ -37,7 +38,7 @@ class KotlinAnnotationSpecTest { @Test fun `use toBuilder to add members`() { - var spec = KotlinCodeGeneration.annotationBuilder(Foo::class) + var spec = KotlinAnnotationSpecBuilder.builder(Foo::class) .addMember("bar", "hello") .build() diff --git a/kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt b/kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt new file mode 100644 index 0000000..82f5c33 --- /dev/null +++ b/kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt @@ -0,0 +1,32 @@ +package io.toolisticon.kotlin.generation + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.asTypeName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +internal class KotlinDataClassSpecTest { + + @Test + fun `create foo`() { + val className = ClassName("test", "Foo") + + val spec = buildDataClass(className) { + addConstructorProperty("x", Int::class.asTypeName()) + addConstructorProperty(buildConstructorProperty("y", Long::class.asTypeName()) { + makePrivate() + }) + } + + assertThat(spec.code.trim()).isEqualTo( + """ + public data class Foo( + public val x: kotlin.Int, + private val y: kotlin.Long, + ) + """.trimIndent() + ) + } +} diff --git a/kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt b/kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt new file mode 100644 index 0000000..2eb3ede --- /dev/null +++ b/kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt @@ -0,0 +1,26 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinValueClassSpecTest { + + @Test + fun `build foo with string value`() { + //val builder = valueClassBuilder_BAK("test","Foo") +// .primaryConstructor( +// constructorPropertyBuilder("bar", String::class.asClassName()) +// .addAnnotation(TestFixtures.myAnnotationSpec) +// ) + + + //val spec = builder.build() + +// assertThat(spec.code.trim()).isEqualTo(""" +// @kotlin.jvm.JvmInline +// public value class Foo( +// @io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation +// public val bar: kotlin.String, +// ) +// """.trimIndent()) + } +} diff --git a/kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt b/kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt new file mode 100644 index 0000000..5beb317 --- /dev/null +++ b/kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt @@ -0,0 +1,30 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.asTypeName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildValueClass +import io.toolisticon.kotlin.generation.TestFixtures +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +internal class KotlinValueClassBuilderTest { + + @Test + fun `create foo value class`() { + val className = ClassName("io.acme","Foo") + + val spec = buildValueClass(className) { + primaryConstructor(KotlinConstructorPropertyBuilder.builder("bar", String::class.asTypeName()) + .addAnnotation(TestFixtures.myAnnotationSpec.get()) + .build()) + } + + assertThat(spec.code.trim()).isEqualTo(""" + @kotlin.jvm.JvmInline + public value class Foo( + @io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation + public val bar: kotlin.String, + ) + """.trimIndent()) + } +} diff --git a/kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt b/kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt new file mode 100644 index 0000000..d48698f --- /dev/null +++ b/kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt @@ -0,0 +1,16 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.AnnotationSpec +import io.toolisticon.kotlin.generation._BAK.poet.AnnotationSpecBuilder +import org.junit.jupiter.api.Test + +internal class AnnotationSpecBuilderTest { + + @Test + fun name() { + val b = AnnotationSpec.builder(Deprecated::class) + val a = AnnotationSpecBuilder(b) + + + } +} diff --git a/kotlin-code-generation/src/_TEST/poet/TypeSpecBuilderTest.kt b/kotlin-code-generation/src/_TEST/poet/TypeSpecBuilderTest.kt new file mode 100644 index 0000000..f85952f --- /dev/null +++ b/kotlin-code-generation/src/_TEST/poet/TypeSpecBuilderTest.kt @@ -0,0 +1,21 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder +import jakarta.annotation.Generated +import org.junit.jupiter.api.Test + +internal class TypeSpecBuilderTest { + + @OptIn(ExperimentalKotlinPoetApi::class) + @Test + fun `verify builder`() { + val builder: TypeSpecBuilder = TypeSpecBuilder(TypeSpec.classBuilder(ClassName("foo","Bar"))) + + var x: TypeSpecBuilder = builder.addAnnotation(Generated::class) + + println(builder.build().toString()) + } +} diff --git a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt index 2cf30c9..dcd2ac4 100644 --- a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt +++ b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt @@ -1,18 +1,26 @@ package io.toolisticon.kotlin.generation +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.builder.* object KotlinCodeGeneration { - val annotationBuilder = KotlinAnnotationBuilder.builder - val constructorPropertyBuilder = KotlinConstructorPropertyBuilder.builder - val dataClassBuilder = KotlinDataClassSpecBuilder.builder - val parameterBuilder = KotlinParameterBuilder.builder - val propertyBuilder = KotlinPropertyBuilder.builder - val valueClassBuilder = KotlinValueClassBuilder.builder +// val annotationBuilder = KotlinAnnotationBuilder.builder +// val constructorPropertyBuilder = KotlinConstructorPropertyBuilder.builder +// val dataClassBuilder = KotlinDataClassSpecBuilder.builder +// val parameterBuilder = KotlinParameterBuilder.builder +// val propertyBuilder = KotlinPropertyBuilder.builder +// val valueClassBuilder = KotlinValueClassBuilder.builder + +// inline fun buildAnnotation(type: ClassName, block: KotlinAnnotationSpecBuilder.() -> Unit) = KotlinAnnotationSpecBuilder.builder(type).also(block).build() +// inline fun buildDataClass(className: ClassName, block: io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.() -> Unit): KotlinDataClassSpec = +// io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.builder(className).also(block).build() +// +// inline fun buildConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertyBuilder.() -> Unit) = KotlinConstructorPropertyBuilder.builder(name, type).also(block).build() +// inline fun buildValueClass(className: ClassName, block: KotlinValueClassBuilder.() -> Unit) = KotlinValueClassBuilder.builder(className).also(block).build() internal object Supressions { const val CLASS_NAME = "ClassName" @@ -36,4 +44,11 @@ object KotlinCodeGeneration { val TypeSpec.isValueClass: Boolean get() = hasModifier(KModifier.VALUE) } + @Suppress(CLASS_NAME) + object typeName { + + operator fun ClassName.plus(suffix: String?) = ClassName(this.packageName, this.simpleNames) + + fun TypeName.nullable(nullable: Boolean = true): TypeName = this.copy(nullable = nullable) + } } diff --git a/kotlin-code-generation/src/main/kotlin/_builder.kt b/kotlin-code-generation/src/main/kotlin/_builder.kt index b964138..9f406d9 100644 --- a/kotlin-code-generation/src/main/kotlin/_builder.kt +++ b/kotlin-code-generation/src/main/kotlin/_builder.kt @@ -1,5 +1,20 @@ package io.toolisticon.kotlin.generation +import com.squareup.kotlinpoet.* +import java.util.function.Supplier + fun interface Builder

{ fun build(): P } + +interface BuilderSupplier

: Builder

, Supplier + +interface SpecSupplier : Supplier +interface AnnotationSpecSupplier : SpecSupplier +interface FileSpecSupplier : SpecSupplier +interface FunSpecSupplier : SpecSupplier +interface ParameterSpecSupplier : SpecSupplier +interface PropertySpecSupplier : SpecSupplier +interface TypeAliasSpecSupplier : SpecSupplier +interface TypeSpecSupplier : SpecSupplier +interface DataClassSpecSupplier : SpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/_ktx/TypeNameKtx.kt b/kotlin-code-generation/src/main/kotlin/_ktx/TypeNameKtx.kt deleted file mode 100644 index 159ef21..0000000 --- a/kotlin-code-generation/src/main/kotlin/_ktx/TypeNameKtx.kt +++ /dev/null @@ -1,11 +0,0 @@ -package io.toolisticon.kotlin.generation._ktx - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeName - -object TypeNameKtx { - - operator fun ClassName.plus(suffix: String?) = ClassName(this.packageName, this.simpleNames) - - fun TypeName.nullable(nullable: Boolean = true): TypeName = this.copy(nullable = nullable) -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationBuilder.kt deleted file mode 100644 index 33cdc8e..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationBuilder.kt +++ /dev/null @@ -1,59 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.* -import com.squareup.kotlinpoet.AnnotationSpec.Builder -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.AnnotationSpecSupplier -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpec -import kotlin.reflect.KClass - -class KotlinAnnotationBuilder internal constructor( - private val typeName: TypeName, - delegate: Builder -) : KotlinPoetSpecBuilder( - delegate = delegate -), AnnotationSpecSupplier { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetSpecBuilder { - - operator fun invoke(type: KClass, block: AnnotationSpecBuilderReceiver = {}): KotlinAnnotationBuilder = invoke( - typeName = type.asClassName(), - block = block - ) - - operator fun invoke(typeName: ClassName, block: AnnotationSpecBuilderReceiver = {}): KotlinAnnotationBuilder = KotlinAnnotationBuilder( - typeName = typeName, - delegate = AnnotationSpec.builder(typeName) - ).invoke(block) - - operator fun invoke(typeName: ParameterizedTypeName, block: AnnotationSpecBuilderReceiver = {}): KotlinAnnotationBuilder = KotlinAnnotationBuilder( - typeName = typeName, - delegate = AnnotationSpec.builder(typeName) - ).invoke(block) - - override fun invoke(spec: KotlinAnnotationSpec): KotlinAnnotationBuilder = KotlinAnnotationBuilder( - typeName = spec.typeName, - delegate = spec.get().toBuilder() - ) - } - - fun addMember(format: String, vararg args: Any): KotlinAnnotationBuilder = apply { - delegate.addMember(format, *args) - } - - fun addMember(codeBlock: CodeBlock): KotlinAnnotationBuilder = apply { - delegate.addMember(codeBlock) - } - - fun addKClassMember(name: String, klass: KClass<*>) = addMember("$name = %T::class", klass) - - fun addStringMember(name: String, value: String) = addMember("$name = %S", value) - - override fun build(): KotlinAnnotationSpec = KotlinAnnotationSpec( - spec = delegate.build() - ) - - override fun get(): AnnotationSpec = build().get() - -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassBuilder.kt deleted file mode 100644 index 333f620..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassBuilder.kt +++ /dev/null @@ -1,25 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier - -class KotlinAnnotationClassBuilder internal constructor(className: ClassName, delegate: TypeSpec.Builder) : KotlinPoetNamedTypeSpecBuilder( - className = className, - delegate = delegate -), TypeSpecSupplier { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - override fun invoke(spec: KotlinAnnotationClassSpec, kind: TypeSpec.Kind, name: String?): KotlinAnnotationClassBuilder = TODO() // FIXME KotlinAnnotationClassBuilder(spec.get().toBuilder(kind, - // name)) - } - - - override fun build(): KotlinAnnotationClassSpec = KotlinAnnotationClassSpec( - className = className, - spec = delegate.build() - ) -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt deleted file mode 100644 index 20b8ae5..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt +++ /dev/null @@ -1,23 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinAnonymousClassSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier - -@Deprecated("Not implemented yet!") -class KotlinAnonymousClassBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier { - - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - override fun invoke(spec: KotlinAnonymousClassSpec, kind: TypeSpec.Kind, name: String?): KotlinAnonymousClassBuilder = KotlinAnonymousClassBuilder(spec.get().toBuilder(kind,name)) - } - - override fun build(): KotlinAnonymousClassSpec { - TODO("Not yet implemented") - } -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt deleted file mode 100644 index a8b4abd..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassBuilder.kt +++ /dev/null @@ -1,21 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinClassSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier - -class KotlinClassBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier { - - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - override fun invoke(spec: KotlinClassSpec, kind: TypeSpec.Kind, name: String?): KotlinClassBuilder = KotlinClassBuilder(spec.get().toBuilder(kind,name)) - } - - - override fun build(): KotlinClassSpec = KotlinClassSpec(spec = delegate.build()) -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectBuilder.kt deleted file mode 100644 index 71b3023..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectBuilder.kt +++ /dev/null @@ -1,21 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinCompanionObjectSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier - -@Deprecated("Not implemented yet!") -class KotlinCompanionObjectBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier { - - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - override fun invoke(spec: KotlinCompanionObjectSpec, kind: TypeSpec.Kind, name: String?): KotlinCompanionObjectBuilder = KotlinCompanionObjectBuilder(spec.get().toBuilder(kind,name)) - } - - override fun build(): KotlinCompanionObjectSpec = KotlinCompanionObjectSpec(spec = delegate.build()) -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt deleted file mode 100644 index 5c9db4e..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt +++ /dev/null @@ -1,57 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asClassName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.parameterBuilder -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.propertyBuilder -import io.toolisticon.kotlin.generation.spec.ConstructorPropertySupplier -import io.toolisticon.kotlin.generation.spec.KotlinConstructorProperty -import kotlin.reflect.KClass - -class KotlinConstructorPropertyBuilder internal constructor( - override val name: String, - private val type: TypeName, - private val propertyBuilder: KotlinPropertyBuilder, - private val parameterBuilder: KotlinParameterBuilder -) : Builder, ConstructorPropertySupplier, KotlinAnnotatableBuilder { - - @Suppress(CLASS_NAME) - object builder { - - operator fun invoke(name: String, type: KClass<*>): KotlinConstructorPropertyBuilder = invoke( - name = name, - type = type.asClassName(), - ) - - operator fun invoke(name: String, type: TypeName): KotlinConstructorPropertyBuilder { - - return KotlinConstructorPropertyBuilder( - name = name, - type = type, - propertyBuilder = propertyBuilder(name, type), - parameterBuilder = parameterBuilder(name, type) - ) - } - } - - fun makePrivate() = apply { - propertyBuilder.makePrivate() - } - - override fun addAnnotation(annotationSpec: AnnotationSpec): KotlinConstructorPropertyBuilder = apply { - parameterBuilder.addAnnotation(annotationSpec) - } - - override fun build(): KotlinConstructorProperty { - val parameter = parameterBuilder.build() - val property = propertyBuilder { - initializer(parameter.name) - }.build() - - return KotlinConstructorProperty(parameter = parameter, property = property) - } - - override fun get(): KotlinConstructorProperty = build().get() -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index d02db49..940a71a 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -1,69 +1,105 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.* -import io.toolisticon.kotlin.generation.spec.ConstructorPropertySupplier -import io.toolisticon.kotlin.generation.spec.DataClassSpecSupplier +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier +import mu.KLogging -class KotlinDataClassSpecBuilder internal constructor(className: ClassName, delegate: TypeSpec.Builder) : KotlinPoetNamedTypeSpecBuilder( - className = className, - delegate = delegate.addModifiers(KModifier.DATA) -), DataClassSpecSupplier, IDataClassSpecBuilder { - @Suppress("ClassName") - object builder : ToKotlinPoetSpecBuilder { +class KotlinDataClassBuilder internal constructor( + private val className: ClassName, + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier { + companion object : KLogging() {} - operator fun invoke(packageName: String, name: String): KotlinDataClassSpecBuilder = invoke(ClassName(packageName, name)) + internal constructor(className: ClassName) : this(className = className, delegate = TypeSpecBuilder(TypeSpec.classBuilder(className))) - operator fun invoke(className: ClassName): KotlinDataClassSpecBuilder = KotlinDataClassSpecBuilder( - className = className, - delegate = TypeSpec.classBuilder(className) - ) - - override fun invoke(spec: KotlinDataClassSpec): KotlinDataClassSpecBuilder = KotlinDataClassSpecBuilder( - className = spec.className, - delegate = spec.get().toBuilder() - ) - } - - private val constructorProperties = LinkedHashMap() - - override fun addKdoc(kdoc: CodeBlock) = apply { - delegate.addKdoc(kdoc) - } - - fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { - delegate.addType(typeSpecSupplier.get()) - } - - fun addConstructorProperty(constructorProperty: ConstructorPropertySupplier) = apply { - constructorProperties.put(constructorProperty.name, constructorProperty) + init { + delegate { addModifiers(KModifier.DATA) } } - /** - * Finalize a data class based on its primary constructor parameters. - * - * * adds primary constructor. - * * backs parameters with properties. - */ override fun build(): KotlinDataClassSpec { - check(constructorProperties.isNotEmpty()) { "Data class must have at least one property." } - - val constructor = FunSpec.constructorBuilder() - - constructorProperties.values.map(ConstructorPropertySupplier::get).forEach { - constructor.addParameter(it.parameter.get()) - delegate.addProperty(it.property.get()) - } - - delegate.primaryConstructor(constructor.build()) - return KotlinDataClassSpec(className = className, spec = delegate.build()) } - override fun addAnnotation(annotation: ClassName): KotlinDataClassSpecBuilder = apply { - delegate.addAnnotation(annotation) - } - + override fun get(): TypeSpec = build().get() + +// operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( +// className = spec.className, +// delegate = spec.get().toBuilder() +// ) +//} +// +//private val constructorProperties = LinkedHashMap() +// +//operator fun invoke(block: TypeSpecBuilder.() -> Unit): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { +// delegate.block() +// override fun addKdoc(kdoc: CodeBlock) = apply { +// delegate.addKdoc(kdoc) +// } +// +// fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { +// delegate.addType(typeSpecSupplier.get()) +// } +// +// fun addConstructorProperty(name: String, type: TypeName, block: _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinConstructorPropertyBuilder.() -> Unit = {}) = apply { +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[name] = buildConstructorProperty(name, type, block) +// } +// +// fun addConstructorProperty(constructorProperty: ConstructorPropertySupplier) = apply { +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[constructorProperty.name] = constructorProperty +// } +// +// /** +// * Finalize a data class based on its primary constructor parameters. +// * +// * * adds primary constructor. +// * * backs parameters with properties. +// */ +// override fun build(): KotlinDataClassSpec { +// check(_root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.isNotEmpty()) { "Data class must have at least one property." } +// +// val constructor = FunSpec.constructorBuilder() +// +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.values.map(ConstructorPropertySupplier::get).forEach { +// constructor.addParameter(it.parameter.get()) +// delegate.addProperty(it.property.get()) +// } +// +// delegate.primaryConstructor(constructor.build()) +// +// return KotlinDataClassSpec(className = className, spec = delegate.build()) +// } +// +// override fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = apply { +// fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { +// delegate.addAnnotation(annotation) +// } +// +// override fun get(): TypeSpec = build().get() +// +// } } + + +// @Suppress("ClassName") +// object builder : +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.ToKotlinPoetSpecBuilder { +// +// fun builder(className: ClassName) = _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder(className = className) +// operator fun invoke(packageName: String, name: String): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.invoke(ClassName(packageName, name)) +// +// fun builder(packageName: String, name: String) = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.builder(ClassName(packageName, name)) +// operator fun invoke(className: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( +// className = className, +// delegate = TypeSpec.classBuilder(className) +// ) +// +// } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassBuilder.kt deleted file mode 100644 index 489ac3b..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassBuilder.kt +++ /dev/null @@ -1,42 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier - -class KotlinEnumClassBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - override fun invoke(spec: KotlinEnumClassSpec, kind: TypeSpec.Kind, name: String?): KotlinEnumClassBuilder = KotlinEnumClassBuilder(spec.get().toBuilder(kind,name)) - } - - - companion object { - fun builder(other: TypeSpec.Builder, block: TypeSpecBuilderReceiver = {}) = with(KotlinEnumClassBuilder(delegate = other)) { - invoke(block) - } - - fun builder(className: ClassName) = KotlinEnumClassBuilder(delegate = TypeSpec.enumBuilder(className)) - - } - - - fun addKdoc(kdoc: CodeBlock) = apply { - delegate.addKdoc(kdoc) - } - - fun addEnumConstant(name: String) = apply { - delegate.addEnumConstant(name) - } - - - override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) - -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt new file mode 100644 index 0000000..895df43 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -0,0 +1,30 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.FileSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.FileSpecSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinFileSpec + +class KotlinFileSpecBuilder internal constructor( + private val delegate: FileSpecBuilder +) : BuilderSupplier, FileSpecSupplier, DelegatingBuilder { + + + override fun builder(block: FileSpecBuilderReceiver) = apply { + delegate { block() } + } + + fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { + delegate { + addType(typeSpecSupplier.get()) + } + } + + override fun build(): KotlinFileSpec { + val spec = delegate.build() + return KotlinFileSpec(spec = spec) + } + + override fun get(): FileSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunBuilder.kt deleted file mode 100644 index 36fc2b0..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunBuilder.kt +++ /dev/null @@ -1,20 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.FunSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.FunSpecSupplier -import io.toolisticon.kotlin.generation.spec.KotlinFunSpec - -class KotlinFunBuilder internal constructor(delegate: FunSpec.Builder) : KotlinPoetSpecBuilder( - delegate = delegate -), FunSpecSupplier { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetSpecBuilder { - override fun invoke(spec: KotlinFunSpec): KotlinFunBuilder = KotlinFunBuilder(spec.get().toBuilder()) - } - - override fun build(): KotlinFunSpec = KotlinFunSpec(spec = delegate.build()) - - override fun get(): FunSpec = build().get() -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt new file mode 100644 index 0000000..401a163 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -0,0 +1,24 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.FunSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.FunSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinFunSpec + +class KotlinFunSpecBuilder internal constructor( + private val delegate: FunSpecBuilder +) : BuilderSupplier, + FunSpecSupplier, + DelegatingBuilder { + +//companion object { +// fun builder(name: String) = KotlinFunSpecBuilder(FunSpecBuilder.builder(name)) +// } + + override fun builder(block: FunSpecBuilderReceiver): KotlinFunSpecBuilder = apply { + delegate { block() } + } + + override fun build(): KotlinFunSpec = KotlinFunSpec(spec = delegate.build()) + override fun get(): FunSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceBuilder.kt deleted file mode 100644 index ee12229..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceBuilder.kt +++ /dev/null @@ -1,22 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinInterfaceSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier - -@Deprecated("Not implemented yet!") -class KotlinInterfaceBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier { - - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - override fun invoke(spec: KotlinInterfaceSpec, kind: TypeSpec.Kind, name: String?): KotlinInterfaceBuilder = KotlinInterfaceBuilder(spec.get().toBuilder(kind,name)) - } - - - override fun build(): KotlinInterfaceSpec = KotlinInterfaceSpec(spec = delegate.build()) -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectBuilder.kt index 6113de4..f88601a 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectBuilder.kt @@ -1,31 +1,35 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinObjectSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier -class KotlinObjectBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier { - - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - - operator fun invoke(className: ClassName) = KotlinObjectBuilder(delegate = TypeSpec.objectBuilder(className)) - - override fun invoke(spec: KotlinObjectSpec, kind: TypeSpec.Kind, name: String?): KotlinObjectBuilder = KotlinObjectBuilder(spec.get().toBuilder(kind, name)) - } - - fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { - delegate.addType(typeSpecSupplier.get()) - } - - fun addTypes(typeSpecSupplier: Iterable) = apply { - typeSpecSupplier.forEach(::addType) +class KotlinObjectBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : BuilderSupplier, + TypeSpecSupplier, + DelegatingBuilder { + +// companion object { +// fun builder(className: ClassName) = KotlinObjectBuilder( +// delegate = TypeSpecBuilder.objectBuilder(className) +// ) +// } + + + // +// fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { +// delegate.addType(typeSpecSupplier.get()) +// } +// +// fun addTypes(typeSpecSupplier: Iterable) = apply { +// typeSpecSupplier.forEach(::addType) +// } + override fun builder(block: TypeSpecBuilderReceiver): KotlinObjectBuilder = apply { + delegate { block() } } override fun build(): KotlinObjectSpec = KotlinObjectSpec(spec = delegate.build()) + override fun get(): TypeSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterBuilder.kt deleted file mode 100644 index c4510d2..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterBuilder.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ParameterSpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asTypeName -import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec -import io.toolisticon.kotlin.generation.spec.ParameterSpecSupplier -import kotlin.reflect.KClass - -class KotlinParameterBuilder internal constructor(delegate: ParameterSpec.Builder) : KotlinPoetSpecBuilder( - delegate = delegate -), ParameterSpecSupplier, KotlinAnnotatableBuilder { - - @Suppress("ClassName") - object builder : ToKotlinPoetSpecBuilder { - operator fun invoke(name: String, type: KClass<*>) = invoke(name, type.asTypeName()) - operator fun invoke(name: String, type: TypeName) = KotlinParameterBuilder( - delegate = ParameterSpec.builder(name, type) - ) - - override fun invoke(spec: KotlinParameterSpec): KotlinParameterBuilder = KotlinParameterBuilder(delegate = spec.get().toBuilder()) - } - - override fun addAnnotation(annotationSpec: AnnotationSpec): KotlinParameterBuilder = invoke { - addAnnotation(annotationSpec) - } - - override fun build(): KotlinParameterSpec = KotlinParameterSpec(spec = delegate.build()) - - override fun get(): ParameterSpec = build().get() - -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertyBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertyBuilder.kt deleted file mode 100644 index faa6a16..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertyBuilder.kt +++ /dev/null @@ -1,54 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.PropertySpec -import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinPropertySpec -import io.toolisticon.kotlin.generation.spec.ParameterSpecSupplier -import io.toolisticon.kotlin.generation.spec.PropertySpecSupplier - -class KotlinPropertyBuilder internal constructor( - private val name: String, - private val type: TypeName, - delegate: PropertySpec.Builder -) : KotlinPoetSpecBuilder( - delegate = delegate -), PropertySpecSupplier, KotlinAnnotatableBuilder { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetSpecBuilder { - - operator fun invoke(name: String, type: TypeName, block: PropertySpecBuilderReceiver = {}) = KotlinPropertyBuilder( - name = name, - type = type, - delegate = PropertySpec.builder(name, type) - ).invoke(block) - - override fun invoke(spec: KotlinPropertySpec): KotlinPropertyBuilder = KotlinPropertyBuilder( - name = spec.name, - type = spec.type, - delegate = spec.get().toBuilder() - ) - } - - override fun addAnnotation(annotationSpec: AnnotationSpec): KotlinPropertyBuilder = invoke { - addAnnotation(annotationSpec) - } - - fun makePrivate() = invoke { - addModifiers(KModifier.PRIVATE) - } - - fun makeFinal() = invoke { - addModifiers(KModifier.PRIVATE) - } - - override fun build(): KotlinPropertySpec = KotlinPropertySpec(spec = delegate.build()) - - override fun get(): PropertySpec = build().get() - -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt new file mode 100644 index 0000000..53c6728 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -0,0 +1,25 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.PropertySpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.PropertySpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinPropertySpec + +class KotlinPropertySpecBuilder internal constructor( + private val delegate: PropertySpecBuilder +) : BuilderSupplier, + PropertySpecSupplier, + DelegatingBuilder { + + + override fun builder(block: PropertySpecBuilderReceiver) = apply { + delegate { block() } + } + + override fun build(): KotlinPropertySpec { + val spec = delegate.build() + return KotlinPropertySpec(spec = spec) + } + + override fun get(): PropertySpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasBuilder.kt deleted file mode 100644 index 2316ea6..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasBuilder.kt +++ /dev/null @@ -1,21 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.TypeAliasSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.KotlinTypeAliasSpec -import io.toolisticon.kotlin.generation.spec.TypeAliasSpecSupplier - -@Deprecated("Not implemented yet!") -class KotlinTypeAliasBuilder internal constructor(delegate: TypeAliasSpec.Builder) : KotlinPoetSpecBuilder( - delegate = delegate -), TypeAliasSpecSupplier { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetSpecBuilder { - override fun invoke(spec: KotlinTypeAliasSpec) = KotlinTypeAliasBuilder(delegate = spec.get().toBuilder()) - } - - override fun build() = KotlinTypeAliasSpec(spec = delegate.build()) - - override fun get(): TypeAliasSpec = build().get() -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt new file mode 100644 index 0000000..7b529d3 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt @@ -0,0 +1,26 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.TypeAliasSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeAliasSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinTypeAliasSpec + +class KotlinTypeAliasSpecBuilder internal constructor( + private val delegate: TypeAliasSpecBuilder +) : BuilderSupplier, + TypeAliasSpecSupplier, + DelegatingBuilder { + +// companion object { +// fun builder(name: String, type: TypeName) = KotlinTypeAliasSpecBuilder( +// delegate = TypeAliasSpecBuilder.builder(name, type) +// ) +// } + + override fun builder(block: TypeAliasSpecBuilderReceiver) = apply { + delegate { block() } + } + + override fun build() = KotlinTypeAliasSpec(spec = delegate.build()) + override fun get(): TypeAliasSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassBuilder.kt deleted file mode 100644 index 646fc5f..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassBuilder.kt +++ /dev/null @@ -1,74 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.FunSpec -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.TypeSpec -import com.squareup.kotlinpoet.jvm.jvmInline -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation.spec.ConstructorPropertySupplier -import io.toolisticon.kotlin.generation.spec.KotlinConstructorProperty -import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec -import io.toolisticon.kotlin.generation.spec.TypeSpecSupplier - -class KotlinValueClassBuilder internal constructor(className: ClassName, delegate: TypeSpec.Builder) : KotlinPoetNamedTypeSpecBuilder( - className = className, - delegate = delegate -), TypeSpecSupplier { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetTypeSpecBuilder { - - operator fun invoke(packageName: String, name: String, block: TypeSpecBuilderReceiver = {}): KotlinValueClassBuilder = invoke( - className = ClassName(packageName, name), - block = block - ) - - operator fun invoke(name: String, block: TypeSpecBuilderReceiver = {}): KotlinValueClassBuilder = invoke( - packageName = "", - name = name, - block = block - ) - - operator fun invoke(className: ClassName, block: TypeSpecBuilderReceiver = {}): KotlinValueClassBuilder { - val builder: KotlinValueClassBuilder = KotlinValueClassBuilder( - className = className, - delegate = TypeSpec.classBuilder(className) - ) - - return builder.invoke(block) as KotlinValueClassBuilder - } - - override fun invoke(spec: KotlinValueClassSpec, kind: TypeSpec.Kind, name: String?): KotlinValueClassBuilder = TODO() // FIXME KotlinValueClassBuilder(spec.get().toBuilder()) - } - - init { - invoke { - addModifiers(KModifier.VALUE) - jvmInline() - } - } - - lateinit var constructorProperty: KotlinConstructorProperty - - fun primaryConstructor(constructorProperty: ConstructorPropertySupplier) = apply { - this.constructorProperty = constructorProperty.get() - - val constructor = FunSpec.constructorBuilder() - .addParameter(this.constructorProperty.parameter.get()) - .build() - - delegate.addProperty(this.constructorProperty.property.get()) - .primaryConstructor(constructor) - } - - override fun build(): KotlinValueClassSpec { - check(::constructorProperty.isInitialized) { "Value class must have exactly one property." } - - return KotlinValueClassSpec( - className = className, - spec = delegate.build() - ) - } - -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt new file mode 100644 index 0000000..3878e93 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -0,0 +1,25 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec + +class KotlinValueClassSpecBuilder internal constructor( + val className: ClassName, + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { + + + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate { block() } + } + + override fun build(): KotlinValueClassSpec { + val spec = delegate.build() + return KotlinValueClassSpec(className = className, spec = spec) + } + + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/_poet.kt b/kotlin-code-generation/src/main/kotlin/builder/_poet.kt new file mode 100644 index 0000000..5dda2c6 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/_poet.kt @@ -0,0 +1,55 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.* + +sealed interface PoetSpecBuilder { + val builder: BUILDER + + operator fun invoke(block: BUILDER.() -> Unit): SELF + + fun build(): SPEC +} + +class AnnotationSpecBuilder(override val builder: AnnotationSpec.Builder) : PoetSpecBuilder { + override fun invoke(block: AnnotationSpec.Builder.() -> Unit): AnnotationSpecBuilder = apply { builder.block() } + override fun build(): AnnotationSpec = builder.build() +} + +class FileSpecBuilder(override val builder: FileSpec.Builder) : PoetSpecBuilder { + override fun invoke(block: FileSpec.Builder.() -> Unit): FileSpecBuilder = apply { builder.block() } + override fun build(): FileSpec = builder.build() +} + +class FunSpecBuilder(override val builder: FunSpec.Builder) : PoetSpecBuilder { + override fun invoke(block: FunSpec.Builder.() -> Unit): FunSpecBuilder = apply { builder.block() } + override fun build(): FunSpec = builder.build() +} + +class ParameterSpecBuilder(override val builder: ParameterSpec.Builder) : PoetSpecBuilder { + override fun invoke(block: ParameterSpec.Builder.() -> Unit): ParameterSpecBuilder = apply { builder.block() } + override fun build(): ParameterSpec = builder.build() +} + +class PropertySpecBuilder(override val builder: PropertySpec.Builder) : PoetSpecBuilder { + override fun invoke(block: PropertySpec.Builder.() -> Unit): PropertySpecBuilder = apply { builder.block() } + override fun build(): PropertySpec = builder.build() +} + +class TypeAliasSpecBuilder(override val builder: TypeAliasSpec.Builder) : PoetSpecBuilder { + override fun invoke(block: TypeAliasSpec.Builder.() -> Unit): TypeAliasSpecBuilder = apply { builder.block() } + override fun build(): TypeAliasSpec = builder.build() +} + +class TypeSpecBuilder(override val builder: TypeSpec.Builder) : PoetSpecBuilder { + override fun invoke(block: TypeSpec.Builder.() -> Unit): TypeSpecBuilder = apply { builder.block() } + override fun build(): TypeSpec = builder.build() +} + +typealias AnnotationSpecBuilderReceiver = AnnotationSpec.Builder.() -> Unit +typealias FileSpecBuilderReceiver = FileSpec.Builder.() -> Unit +typealias FunSpecBuilderReceiver = FunSpec.Builder.() -> Unit +typealias ParameterSpecBuilderReceiver = ParameterSpec.Builder.() -> Unit +typealias PropertySpecBuilderReceiver = PropertySpec.Builder.() -> Unit +typealias TypeSpecBuilderReceiver = TypeSpec.Builder.() -> Unit +typealias TypeAliasSpecBuilderReceiver = TypeAliasSpec.Builder.() -> Unit + diff --git a/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt b/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt new file mode 100644 index 0000000..87a30df --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt @@ -0,0 +1,11 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.TypeAliasSpec +import com.squareup.kotlinpoet.TypeSpec + + + +interface DelegatingBuilder { + fun builder(block: RECEIVER) : SELF +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt index 7375b6d..0df43d8 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt @@ -1,24 +1,26 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.typeSpec.isDataClass +import io.toolisticon.kotlin.generation.TypeSpecSupplier import io.toolisticon.kotlin.generation.builder.KotlinDataClassSpecBuilder import io.toolisticon.kotlin.generation.builder.KotlinFileBuilder data class KotlinDataClassSpec( override val className: ClassName, private val spec: TypeSpec -) : KotlinPoetNamedTypeSpec, DataClassSpecSupplier { +) : TypeSpecSupplier { init { require(spec.isDataClass) { "Not a dataClass spec: $spec." } } - - override fun get(): TypeSpec = spec } fun KotlinDataClassSpec.toBuilder() = KotlinDataClassSpecBuilder.builder(spec = this) fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() +// TODO fun KotlinDataClassSpec.toBuilder() = KotlinDataClassBuilder.from(spec = this) +// TODO fun KotlinDataClassSpec.toFileSpec() = KotlinFileSpecBuilder.builder(this).build() diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt index d957b07..6403fec 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt @@ -2,15 +2,15 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FileSpec +import io.toolisticon.kotlin.generation.FileSpecSupplier -@JvmInline -value class KotlinFileSpec(private val spec: FileSpec) : KotlinPoetSpec, FileSpecSupplier { +data class KotlinFileSpec(private val spec: FileSpec) : FileSpecSupplier { - val packageName: String get() = spec.packageName - val rootName: String get() = spec.name - val className: ClassName get() = ClassName(packageName, rootName) - val fqn: String get() = "$packageName.$rootName" - val fileName: String get() = "$fqn.kt" + val packageName: String = spec.packageName + val rootName: String = spec.name + val className: ClassName = ClassName(packageName, rootName) + val fqn: String = "$packageName.$rootName" + val fileName: String = "$fqn.kt" override fun get(): FileSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt index c151610..dce7c2c 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt @@ -1,9 +1,10 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.FunSpec +import io.toolisticon.kotlin.generation.FunSpecSupplier -@Deprecated("Not implemented yet!") -@JvmInline -value class KotlinFunSpec(private val spec: FunSpec) : KotlinPoetSpec, FunSpecSupplier{ +data class KotlinFunSpec( + private val spec: FunSpec +) : FunSpecSupplier { override fun get(): FunSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt index 57aa886..0b604fa 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt @@ -1,10 +1,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier - -@JvmInline -value class KotlinObjectSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec { +data class KotlinObjectSpec( + private val spec: TypeSpec +) : TypeSpecSupplier { override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt index 3a032af..5819804 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt @@ -2,14 +2,10 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.builder.KotlinPropertyBuilder +import io.toolisticon.kotlin.generation.PropertySpecSupplier -@JvmInline -value class KotlinPropertySpec(private val spec: PropertySpec) : KotlinPoetSpec, - PropertySpecSupplier, - WithName, - WithAnnotationSpecs { - override val name: String get() = spec.name +data class KotlinPropertySpec(private val spec: PropertySpec) : PropertySpecSupplier { + val name: String get() = spec.name val type: TypeName get() = spec.type @@ -17,7 +13,7 @@ value class KotlinPropertySpec(private val spec: PropertySpec) : KotlinPoetSpec< override fun get(): PropertySpec = spec - override val annotations: List get() = KotlinAnnotationSpec.of(spec.annotations) + //override val annotations: List get() = KotlinAnnotationSpec.of(spec.annotations) // override val kdoc: CodeBlock = builder.kdoc.build() // public val modifiers: Set = builder.modifiers.toImmutableSet() @@ -29,4 +25,4 @@ value class KotlinPropertySpec(private val spec: PropertySpec) : KotlinPoetSpec< // public val receiverType: TypeName? = builder.receiverType } -fun KotlinPropertySpec.toBuilder() = KotlinPropertyBuilder.builder(spec = this) +// TODO fun KotlinPropertySpec.toBuilder() = KotlinPropertyBuilder.builder(spec = this) diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt index 586fd6f..f45d5d6 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt @@ -1,9 +1,8 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeAliasSpec +import io.toolisticon.kotlin.generation.TypeAliasSpecSupplier -@Deprecated("Not implemented yet!") -@JvmInline -value class KotlinTypeAliasSpec(private val spec: TypeAliasSpec) : KotlinPoetSpec, TypeAliasSpecSupplier { +data class KotlinTypeAliasSpec(private val spec: TypeAliasSpec) : TypeAliasSpecSupplier { override fun get(): TypeAliasSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt index f95a7f1..a8e8615 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt @@ -3,19 +3,18 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.typeSpec.isValueClass -import io.toolisticon.kotlin.generation.builder.KotlinValueClassBuilder +import io.toolisticon.kotlin.generation.SpecSupplier data class KotlinValueClassSpec( - override val className: ClassName, + val className: ClassName, private val spec: TypeSpec -) : KotlinPoetNamedTypeSpec { +) : SpecSupplier { init { require(spec.isValueClass) { "Not a valueClass spec: $spec." } } override fun get(): TypeSpec = spec - } -fun KotlinValueClassSpec.toBuilder() = KotlinValueClassBuilder.builder(spec = this) +// fun KotlinValueClassSpec.toBuilder() = KotlinValueClassBuilder.builder(spec = this) diff --git a/kotlin-code-generation/src/main/kotlin/spec/_spec.kt b/kotlin-code-generation/src/main/kotlin/spec/_spec.kt deleted file mode 100644 index b547109..0000000 --- a/kotlin-code-generation/src/main/kotlin/spec/_spec.kt +++ /dev/null @@ -1,32 +0,0 @@ -package io.toolisticon.kotlin.generation.spec - -import com.squareup.kotlinpoet.* -import java.util.function.Supplier - -sealed interface KotlinPoetSpec : Supplier { - val code: String get() = get().toString() -} - -sealed interface KotlinPoetTypeSpec : KotlinPoetSpec, TypeSpecSupplier { - override fun get(): TypeSpec - - val annotations: List get() = KotlinAnnotationSpec.of(get().annotations) -} - -sealed interface KotlinPoetNamedTypeSpec : KotlinPoetTypeSpec, WithClassName - -interface AnnotationSpecSupplier : Supplier -interface FileSpecSupplier : Supplier -interface FunSpecSupplier : Supplier -interface ParameterSpecSupplier : Supplier -interface PropertySpecSupplier : Supplier -interface TypeAliasSpecSupplier : Supplier -interface TypeSpecSupplier : Supplier -interface DataClassSpecSupplier : Supplier, TypeSpecSupplier -interface ConstructorPropertySupplier : Supplier, WithName - - -interface KotlinPoetSpecToBuilder { - fun toBuilder(): BUILDER -} - diff --git a/kotlin-code-generation/src/test/kotlin/KotlinDataClassSpecTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinDataClassSpecTest.kt deleted file mode 100644 index 5c26b00..0000000 --- a/kotlin-code-generation/src/test/kotlin/KotlinDataClassSpecTest.kt +++ /dev/null @@ -1,26 +0,0 @@ -package io.toolisticon.kotlin.generation - -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.constructorPropertyBuilder -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.dataClassBuilder -import org.assertj.core.api.Assertions -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class KotlinDataClassSpecTest { - - @Test - fun `create foo`() { - val builder = dataClassBuilder("test", "Foo") - .addConstructorProperty(constructorPropertyBuilder("x", Int::class)) - .addConstructorProperty(constructorPropertyBuilder("y", Long::class)) - - val spec = builder.build() - - assertThat(spec.code.trim()).isEqualTo(""" - public data class Foo( - public val x: kotlin.Int, - public val y: kotlin.Long, - ) - """.trimIndent()) - } -} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinValueClassSpecTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinValueClassSpecTest.kt deleted file mode 100644 index 8fa3044..0000000 --- a/kotlin-code-generation/src/test/kotlin/KotlinValueClassSpecTest.kt +++ /dev/null @@ -1,31 +0,0 @@ -package io.toolisticon.kotlin.generation - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.asClassName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.constructorPropertyBuilder -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.valueClassBuilder -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class KotlinValueClassSpecTest { - - @Test - fun `build foo with string value`() { - val builder = valueClassBuilder("test","Foo") - .primaryConstructor( - constructorPropertyBuilder("bar", String::class.asClassName()) - .addAnnotation(TestFixtures.myAnnotationSpec) - ) - - - val spec = builder.build() - - assertThat(spec.code.trim()).isEqualTo(""" - @kotlin.jvm.JvmInline - public value class Foo( - @io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation - public val bar: kotlin.String, - ) - """.trimIndent()) - } -} diff --git a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt index fcb4c8c..60afbb7 100644 --- a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt +++ b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt @@ -1,12 +1,10 @@ package io.toolisticon.kotlin.generation -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.annotationBuilder - object TestFixtures { @Target(AnnotationTarget.VALUE_PARAMETER) annotation class MyAnnotation() - val myAnnotationSpec = annotationBuilder(type = MyAnnotation::class) +// val myAnnotationSpec = buildAnnotation(MyAnnotation::class.asClassName()) {} } diff --git a/pom.xml b/pom.xml index fce22ae..ecb8d7f 100644 --- a/pom.xml +++ b/pom.xml @@ -20,13 +20,13 @@ _bom - kotlin-code-generation-test + kotlin-code-generation - + @@ -35,6 +35,12 @@ 3.26.0 test + + ch.qos.logback + logback-classic + 1.5.6 + test + From 30d0427faf9af990fb1fc28eaeb368d1ae6fc60f Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Fri, 14 Jun 2024 11:02:41 +0200 Subject: [PATCH 03/19] chore: wip --- .mvn/wrapper/maven-wrapper.properties | 21 +++---------------- .../builder/KotlinDataClassSpecBuilder.kt | 2 +- .../main/kotlin/spec/KotlinDataClassSpec.kt | 6 +++--- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index a017f34..ce65fef 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,18 +1,3 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.1/maven-wrapper-3.3.1.jar +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index 940a71a..ea08095 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -9,7 +9,7 @@ import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec import mu.KLogging -class KotlinDataClassBuilder internal constructor( +class KotlinDataClassSpecBuilder internal constructor( private val className: ClassName, private val delegate: TypeSpecBuilder ) : BuilderSupplier, TypeSpecSupplier { diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt index 0df43d8..0ce4f25 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt @@ -9,7 +9,7 @@ import io.toolisticon.kotlin.generation.builder.KotlinDataClassSpecBuilder import io.toolisticon.kotlin.generation.builder.KotlinFileBuilder data class KotlinDataClassSpec( - override val className: ClassName, + val className: ClassName, private val spec: TypeSpec ) : TypeSpecSupplier { @@ -20,7 +20,7 @@ data class KotlinDataClassSpec( override fun get(): TypeSpec = spec } -fun KotlinDataClassSpec.toBuilder() = KotlinDataClassSpecBuilder.builder(spec = this) -fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() +//fun KotlinDataClassSpec.toBuilder() = KotlinDataClassSpecBuilder.builder(spec = this) +//fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() // TODO fun KotlinDataClassSpec.toBuilder() = KotlinDataClassBuilder.from(spec = this) // TODO fun KotlinDataClassSpec.toFileSpec() = KotlinFileSpecBuilder.builder(this).build() From 2c4042bb6098c987e3ddbd59fba17cce656062b1 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Fri, 14 Jun 2024 15:39:00 +0200 Subject: [PATCH 04/19] chore: wip --- README.md | 14 +++++- .../src/_BAK/IDataClassSpecBuilder.kt | 9 ---- .../src/_BAK/KotlinAnnotationSpecBuilder.kt | 44 ------------------- .../src/_BAK/KotlinAnonymousClassBuilder.kt | 22 ---------- .../src/_BAK/KotlinAnonymousClassSpec.kt | 9 ---- .../src/_BAK/KotlinClassBuilder.kt | 30 ------------- .../src/_BAK/KotlinClassSpec.kt | 9 ---- .../src/_BAK/KotlinParameterSpec.kt | 16 ------- .../src/_BAK/KotlinParameterSpecBuilder.kt | 32 -------------- .../builder/KotlinAnnotationSpecBuilder.kt | 39 ++++++++++++++++ .../builder/KotlinAnonymousClassBuilder.kt | 20 +++++++++ .../kotlin/builder/KotlinClassSpecBuilder.kt | 24 ++++++++++ .../builder/KotlinDataClassSpecBuilder.kt | 6 ++- .../builder/KotlinParameterSpecBuilder.kt | 32 ++++++++++++++ .../main/kotlin/spec/KotlinAnnotationSpec.kt | 27 ++++++++++++ .../kotlin/spec/KotlinAnonymousClassSpec.kt | 8 ++++ .../src/main/kotlin/spec/KotlinClassSpec.kt | 10 +++++ .../main/kotlin/spec/KotlinParameterSpec.kt | 15 +++++++ 18 files changed, 192 insertions(+), 174 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/IDataClassSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinAnonymousClassSpec.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinClassSpec.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinParameterSpec.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt diff --git a/README.md b/README.md index 71bbd10..3db0ce8 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,23 @@ * see [kotlin-poet](https://square.github.io/kotlinpoet/) +## Features + +* KotlinAnnotationSpec + * KotlinAnnotationSpecBuilder +* KotlinFileSpec + * KotlinFileSpecBuilder +* KotlinFunSpec + * KotlinFunSpecBuilder +* KotlinFunSpec + * KotlinFunSpecBuilder + + ## Roadmap ### Specs to support -* com/squareup/kotlinpoet/AnnotationSpec -* com/squareup/kotlinpoet/FileSpec * com/squareup/kotlinpoet/FunSpec * com/squareup/kotlinpoet/ParameterSpec * com/squareup/kotlinpoet/PropertySpec diff --git a/kotlin-code-generation/src/_BAK/IDataClassSpecBuilder.kt b/kotlin-code-generation/src/_BAK/IDataClassSpecBuilder.kt deleted file mode 100644 index 90d1eaa..0000000 --- a/kotlin-code-generation/src/_BAK/IDataClassSpecBuilder.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.CodeBlock - -internal interface IDataClassSpecBuilder : Builder { - - fun addKdoc(kdoc: CodeBlock) : SELF - -} diff --git a/kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt deleted file mode 100644 index 21b68b1..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinAnnotationSpecBuilder.kt +++ /dev/null @@ -1,44 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.ParameterizedTypeName -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.AnnotationSpecBuilder -import io.toolisticon.kotlin.generation._BAK.poet.AnnotationSpecBuilder.Companion.wrap -import io.toolisticon.kotlin.generation._BAK.AnnotationSpecSupplier -import io.toolisticon.kotlin.generation._BAK.KotlinAnnotationSpec -import kotlin.reflect.KClass - -class KotlinAnnotationSpecBuilder internal constructor( - private val delegate: AnnotationSpecBuilder -) : Builder, AnnotationSpecSupplier { - companion object { - fun builder(type: ClassName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) - fun builder(type: ParameterizedTypeName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.Companion.builder(type)) - fun builder(type: KClass): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) - - fun from(spec: KotlinAnnotationSpec) = KotlinAnnotationSpecBuilder(delegate = spec.get().toBuilder().wrap()) - } - - operator fun invoke(block: AnnotationSpecBuilder.() -> Unit): KotlinAnnotationSpecBuilder = apply { - delegate.block() - } - - fun addMember(format: String, vararg args: Any): KotlinAnnotationSpecBuilder = apply { - delegate.addMember(format, *args) - } - - fun addMember(codeBlock: CodeBlock): KotlinAnnotationSpecBuilder = apply { - delegate.addMember(codeBlock) - } - - fun addKClassMember(name: String, klass: KClass<*>) = addMember("$name = %T::class", klass) - - fun addStringMember(name: String, value: String) = addMember("$name = %S", value) - - - override fun build(): KotlinAnnotationSpec = KotlinAnnotationSpec(spec = delegate.build()) - override fun get(): AnnotationSpec = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt deleted file mode 100644 index 7dc31d6..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinAnonymousClassBuilder.kt +++ /dev/null @@ -1,22 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinAnonymousClassSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - -@Deprecated("not implemented yet") -class KotlinAnonymousClassBuilder internal constructor( - private val delegate: TypeSpecBuilder -) : Builder, TypeSpecSupplier { - - - override fun build(): KotlinAnonymousClassSpec { - TODO("Not yet implemented") - } - - override fun get(): TypeSpec { - TODO("Not yet implemented") - } -} diff --git a/kotlin-code-generation/src/_BAK/KotlinAnonymousClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinAnonymousClassSpec.kt deleted file mode 100644 index c40b2c2..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinAnonymousClassSpec.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeSpec - -@JvmInline -value class KotlinAnonymousClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { - override fun get(): TypeSpec = spec -} diff --git a/kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt deleted file mode 100644 index 210cc91..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinClassBuilder.kt +++ /dev/null @@ -1,30 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinClassSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - -class KotlinClassBuilder internal constructor(delegate: TypeSpec.Builder) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier { - -class KotlinClassBuilder internal constructor( - private val delegate: TypeSpecBuilder -) : Builder, TypeSpecSupplier { - - companion object { - fun builder(className: ClassName) = KotlinClassBuilder( - delegate = TypeSpecBuilder.classBuilder(className) - ) - } - - operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinClassBuilder = apply { - delegate.block() - } - - override fun build(): KotlinClassSpec = KotlinClassSpec(spec = delegate.build()) - override fun get(): TypeSpec = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/KotlinClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinClassSpec.kt deleted file mode 100644 index 63525b3..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinClassSpec.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeSpec - -@JvmInline -value class KotlinClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { - override fun get(): TypeSpec = spec -} diff --git a/kotlin-code-generation/src/_BAK/KotlinParameterSpec.kt b/kotlin-code-generation/src/_BAK/KotlinParameterSpec.kt deleted file mode 100644 index 1cd3059..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinParameterSpec.kt +++ /dev/null @@ -1,16 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.ParameterSpec -import com.squareup.kotlinpoet.TypeName - -@JvmInline -value class KotlinParameterSpec(private val spec: ParameterSpec) : KotlinPoetSpec, ParameterSpecSupplier, WithName, Documentable by spec { - - override val name: String get() = spec.name - - val type: TypeName get() = spec.type - - override fun get(): ParameterSpec = this.spec -} - diff --git a/kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt deleted file mode 100644 index ac820b8..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinParameterSpecBuilder.kt +++ /dev/null @@ -1,32 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ParameterSpec -import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.ParameterSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinParameterSpec -import io.toolisticon.kotlin.generation._BAK.ParameterSpecSupplier - -class KotlinParameterSpecBuilder internal constructor( - private val delegate: ParameterSpecBuilder -) : Builder, ParameterSpecSupplier { - - companion object { - fun builder(name: String, type: TypeName) = KotlinParameterSpecBuilder( - delegate = ParameterSpecBuilder.builder(name, type) - ) - } - - operator fun invoke(block: ParameterSpecBuilder.() -> Unit): KotlinParameterSpecBuilder = apply { - delegate.block() - } - - - fun addAnnotation(annotationSpec: AnnotationSpec): KotlinParameterSpecBuilder = invoke { - addAnnotation(annotationSpec) - } - - override fun build(): KotlinParameterSpec = KotlinParameterSpec(spec = delegate.build()) - override fun get(): ParameterSpec = build().get() -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt new file mode 100644 index 0000000..95c2b7f --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt @@ -0,0 +1,39 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.CodeBlock +import io.toolisticon.kotlin.generation.AnnotationSpecSupplier +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpec +import kotlin.reflect.KClass + +class KotlinAnnotationSpecBuilder internal constructor( + private val delegate: AnnotationSpecBuilder +) : BuilderSupplier, AnnotationSpecSupplier, DelegatingBuilder { +// companion object { +// fun builder(type: ClassName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) +// fun builder(type: ParameterizedTypeName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.Companion.builder(type)) +// fun builder(type: KClass): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) +// +// fun from(spec: KotlinAnnotationSpec) = KotlinAnnotationSpecBuilder(delegate = spec.get().toBuilder().wrap()) +// } + + fun addMember(format: String, vararg args: Any): KotlinAnnotationSpecBuilder = apply { + TODO() //delegate.addMember(format, *args) + } + + fun addMember(codeBlock: CodeBlock): KotlinAnnotationSpecBuilder = apply { + TODO() //delegate.addMember(codeBlock) + } + + fun addKClassMember(name: String, klass: KClass<*>) = addMember("$name = %T::class", klass) + + fun addStringMember(name: String, value: String) = addMember("$name = %S", value) + + override fun builder(block: AnnotationSpecBuilderReceiver) = apply { + delegate.builder.block() + } + + override fun build(): KotlinAnnotationSpec = KotlinAnnotationSpec(spec = delegate.build()) + override fun get(): AnnotationSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt new file mode 100644 index 0000000..071434f --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt @@ -0,0 +1,20 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinAnonymousClassSpec + + +class KotlinAnonymousClassBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { + + override fun build(): KotlinAnonymousClassSpec = KotlinAnonymousClassSpec(delegate.build()) + + override fun get(): TypeSpec = build().get() + + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate.builder.block() + } +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt new file mode 100644 index 0000000..b4e5dbc --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -0,0 +1,24 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinClassSpec + +class KotlinClassSpecBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { + +// companion object { +// fun builder(className: ClassName) = KotlinClassBuilder( +// delegate = TypeSpecBuilder.classBuilder(className) +// ) +// } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate.builder.block() + } + + override fun build(): KotlinClassSpec = KotlinClassSpec(spec = delegate.build()) + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index ea08095..a35220d 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -12,7 +12,7 @@ import mu.KLogging class KotlinDataClassSpecBuilder internal constructor( private val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier { +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { companion object : KLogging() {} internal constructor(className: ClassName) : this(className = className, delegate = TypeSpecBuilder(TypeSpec.classBuilder(className))) @@ -21,6 +21,10 @@ class KotlinDataClassSpecBuilder internal constructor( delegate { addModifiers(KModifier.DATA) } } + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate.builder.block() + } + override fun build(): KotlinDataClassSpec { return KotlinDataClassSpec(className = className, spec = delegate.build()) } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt new file mode 100644 index 0000000..79ece2d --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -0,0 +1,32 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.ParameterSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.ParameterSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec + +class KotlinParameterSpecBuilder internal constructor( + private val delegate: ParameterSpecBuilder +) : BuilderSupplier, + ParameterSpecSupplier, + DelegatingBuilder { + +// companion object { +// fun builder(name: String, type: TypeName) = KotlinParameterSpecBuilder( +// delegate = ParameterSpecBuilder.builder(name, type) +// ) +// } + + + override fun builder(block: ParameterSpecBuilderReceiver) = apply { + delegate { block() } + } + + +// fun addAnnotation(annotationSpec: AnnotationSpec): KotlinParameterSpecBuilder = invoke { +// addAnnotation(annotationSpec) +// } + + override fun build(): KotlinParameterSpec = KotlinParameterSpec(spec = delegate.build()) + override fun get(): ParameterSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt new file mode 100644 index 0000000..4d34812 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt @@ -0,0 +1,27 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.AnnotationSpecSupplier + +data class KotlinAnnotationSpec( + private val spec: AnnotationSpec +) : AnnotationSpecSupplier { + + companion object { + fun of(annotations: List): List = annotations.map { KotlinAnnotationSpec(it) } + } + + val typeName: TypeName get() = spec.typeName + val members: List get() = spec.members + + override fun get(): AnnotationSpec = spec + + override fun toString(): String { + return "KotlinAnnotationSpec(typeName=$typeName, members=$members)" + } + +} + +// TODO fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationSpecBuilder.from(spec = this) diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt new file mode 100644 index 0000000..f186cd1 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt @@ -0,0 +1,8 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier + +data class KotlinAnonymousClassSpec(private val spec: TypeSpec) : TypeSpecSupplier { + override fun get(): TypeSpec = spec +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt new file mode 100644 index 0000000..bad1950 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier + +data class KotlinClassSpec( + private val spec: TypeSpec +) : TypeSpecSupplier { + override fun get(): TypeSpec = spec +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt new file mode 100644 index 0000000..027319c --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt @@ -0,0 +1,15 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.ParameterSpecSupplier + +data class KotlinParameterSpec(private val spec: ParameterSpec) : ParameterSpecSupplier { + + val name: String get() = spec.name + + val type: TypeName get() = spec.type + + override fun get(): ParameterSpec = this.spec +} + From f7d4d0b9842ef24e780e5864b98b86d6068c0134 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Sat, 15 Jun 2024 13:10:30 +0200 Subject: [PATCH 05/19] wip --- .../src/_BAK/KotlinAnnotationSpec.kt | 27 ------ .../src/_BAK/KotlinTypeAliasSpec.kt | 9 -- .../kotlin/builder/KotlinClassSpecBuilder.kt | 84 ++++++++++++++++++- ...tBuilder.kt => KotlinObjectSpecBuilder.kt} | 6 +- .../src/main/kotlin/spec/KotlinClassSpec.kt | 12 +++ 5 files changed, 98 insertions(+), 40 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/KotlinAnnotationSpec.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt rename kotlin-code-generation/src/main/kotlin/builder/{KotlinObjectBuilder.kt => KotlinObjectSpecBuilder.kt} (87%) diff --git a/kotlin-code-generation/src/_BAK/KotlinAnnotationSpec.kt b/kotlin-code-generation/src/_BAK/KotlinAnnotationSpec.kt deleted file mode 100644 index c63a33a..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinAnnotationSpec.kt +++ /dev/null @@ -1,27 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.builder.KotlinAnnotationSpecBuilder - -@JvmInline -value class KotlinAnnotationSpec(private val spec: AnnotationSpec) : KotlinPoetSpec, - AnnotationSpecSupplier, WithTypeName { - - companion object { - fun of(annotations: List): List = annotations.map { KotlinAnnotationSpec(it) } - } - - override val typeName: TypeName get() = spec.typeName - val members: List get() = spec.members - - override fun get(): AnnotationSpec = spec - - override fun toString(): String { - return "KotlinAnnotationSpec(typeName=$typeName, members=$members)" - } - -} - -fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationSpecBuilder.from(spec = this) diff --git a/kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt b/kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt deleted file mode 100644 index 308b8d3..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinTypeAliasSpec.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeAliasSpec - -@JvmInline -value class KotlinTypeAliasSpec(private val spec: TypeAliasSpec) : KotlinPoetSpec, TypeAliasSpecSupplier, Documentable by spec { - override fun get(): TypeAliasSpec = spec -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt index b4e5dbc..ddbd9c0 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -1,11 +1,17 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec +import mu.KLogging + class KotlinClassSpecBuilder internal constructor( + private val className: ClassName, private val delegate: TypeSpecBuilder ) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { @@ -18,7 +24,83 @@ class KotlinClassSpecBuilder internal constructor( override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } - + override fun build(): KotlinClassSpec = KotlinClassSpec(spec = delegate.build()) override fun get(): TypeSpec = build().get() + +// operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( +// className = spec.className, +// delegate = spec.get().toBuilder() +// ) +//} +// +//private val constructorProperties = LinkedHashMap() +// +//operator fun invoke(block: TypeSpecBuilder.() -> Unit): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { +// delegate.block() +// override fun addKdoc(kdoc: CodeBlock) = apply { +// delegate.addKdoc(kdoc) +// } +// +// fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { +// delegate.addType(typeSpecSupplier.get()) +// } +// +// fun addConstructorProperty(name: String, type: TypeName, block: _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinConstructorPropertyBuilder.() -> Unit = {}) = apply { +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[name] = buildConstructorProperty(name, type, block) +// } +// +// fun addConstructorProperty(constructorProperty: ConstructorPropertySupplier) = apply { +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[constructorProperty.name] = constructorProperty +// } +// +// /** +// * Finalize a data class based on its primary constructor parameters. +// * +// * * adds primary constructor. +// * * backs parameters with properties. +// */ +// override fun build(): KotlinDataClassSpec { +// check(_root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.isNotEmpty()) { "Data class must have at least one property." } +// +// val constructor = FunSpec.constructorBuilder() +// +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.values.map(ConstructorPropertySupplier::get).forEach { +// constructor.addParameter(it.parameter.get()) +// delegate.addProperty(it.property.get()) +// } +// +// delegate.primaryConstructor(constructor.build()) +// +// return KotlinDataClassSpec(className = className, spec = delegate.build()) +// } +// +// override fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = apply { +// fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { +// delegate.addAnnotation(annotation) +// } +// +// override fun get(): TypeSpec = build().get() +// +// } } + + +// @Suppress("ClassName") +// object builder : +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.ToKotlinPoetSpecBuilder { +// +// fun builder(className: ClassName) = _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder(className = className) +// operator fun invoke(packageName: String, name: String): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.invoke(ClassName(packageName, name)) +// +// fun builder(packageName: String, name: String) = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.builder(ClassName(packageName, name)) +// operator fun invoke(className: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( +// className = className, +// delegate = TypeSpec.classBuilder(className) +// ) +// +// } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt similarity index 87% rename from kotlin-code-generation/src/main/kotlin/builder/KotlinObjectBuilder.kt rename to kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt index f88601a..26d075f 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt @@ -5,11 +5,11 @@ import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinObjectSpec -class KotlinObjectBuilder internal constructor( +class KotlinObjectSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, TypeSpecSupplier, - DelegatingBuilder { + DelegatingBuilder { // companion object { // fun builder(className: ClassName) = KotlinObjectBuilder( @@ -26,7 +26,7 @@ class KotlinObjectBuilder internal constructor( // fun addTypes(typeSpecSupplier: Iterable) = apply { // typeSpecSupplier.forEach(::addType) // } - override fun builder(block: TypeSpecBuilderReceiver): KotlinObjectBuilder = apply { + override fun builder(block: TypeSpecBuilderReceiver): KotlinObjectSpecBuilder = apply { delegate { block() } } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt index bad1950..c233c5d 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt @@ -1,10 +1,22 @@ package io.toolisticon.kotlin.generation.spec +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.TypeSpecSupplier data class KotlinClassSpec( + val className: ClassName, private val spec: TypeSpec ) : TypeSpecSupplier { + + init { + //require(spec.is) { "Not a dataClass spec: $spec." } + } + override fun get(): TypeSpec = spec } + +//fun KotlinDataClassSpec.toBuilder() = KotlinDataClassSpecBuilder.builder(spec = this) +//fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() +// TODO fun KotlinDataClassSpec.toBuilder() = KotlinDataClassBuilder.from(spec = this) +// TODO fun KotlinDataClassSpec.toFileSpec() = KotlinFileSpecBuilder.builder(this).build() From fa9ad774c752087f29a9b215249437fe9247f2b1 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Mon, 17 Jun 2024 07:20:06 +0200 Subject: [PATCH 06/19] wip --- README.md | 9 +++--- .../src/_BAK/KotlinAnnotationClassBuilder.kt | 32 ------------------- .../src/_BAK/KotlinCompanionObjectSpec.kt | 9 ------ .../src/_BAK/KotlinConstructorProperty.kt | 14 -------- .../src/_BAK/KotlinEnumClassBuilder.kt | 32 ------------------- .../src/_BAK/KotlinEnumClassSpec.kt | 14 -------- .../src/_BAK/KotlinInterfaceSpec.kt | 9 ------ .../src/main/kotlin/_builder.kt | 3 ++ .../KotlinAnnotationClassSpecBuilder.kt | 31 ++++++++++++++++++ ....kt => KotlinAnonymousClassSpecBuilder.kt} | 4 +-- .../kotlin/builder/KotlinClassSpecBuilder.kt | 8 ++--- .../builder/KotlinEnumClassSpecBuilder.kt | 28 ++++++++++++++++ .../src/main/kotlin/builder/_type-aliases.kt | 5 --- .../kotlin/spec}/KotlinAnnotationClassSpec.kt | 8 ++--- .../kotlin/spec/KotlinCompanionObjectSpec.kt | 10 ++++++ .../kotlin/spec/KotlinConstructorProperty.kt | 17 ++++++++++ .../main/kotlin/spec/KotlinEnumClassSpec.kt | 15 +++++++++ .../main/kotlin/spec/KotlinInterfaceSpec.kt | 8 +++++ 18 files changed, 126 insertions(+), 130 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinCompanionObjectSpec.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt rename kotlin-code-generation/src/main/kotlin/builder/{KotlinAnonymousClassBuilder.kt => KotlinAnonymousClassSpecBuilder.kt} (80%) create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt rename kotlin-code-generation/src/{_BAK => main/kotlin/spec}/KotlinAnnotationClassSpec.kt (51%) create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt diff --git a/README.md b/README.md index 3db0ce8..f008425 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,10 @@ * KotlinFileSpecBuilder * KotlinFunSpec * KotlinFunSpecBuilder -* KotlinFunSpec - * KotlinFunSpecBuilder +* KotlinParameterSpec + * KotlinParameterSpecBuilder +* KotlinPropertySpec + * KotlinPropertySpecBuilder @@ -42,9 +44,6 @@ ### Specs to support -* com/squareup/kotlinpoet/FunSpec -* com/squareup/kotlinpoet/ParameterSpec -* com/squareup/kotlinpoet/PropertySpec * com/squareup/kotlinpoet/TypeAliasSpec * com/squareup/kotlinpoet/TypeSpec diff --git a/kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt deleted file mode 100644 index 1f6d38e..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinAnnotationClassBuilder.kt +++ /dev/null @@ -1,32 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinAnnotationClassSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - -class KotlinAnnotationClassBuilder internal constructor( - val className: ClassName, - private val delegate: TypeSpecBuilder -) : Builder, TypeSpecSupplier { - - companion object { - fun builder(className: ClassName) = KotlinAnnotationClassBuilder( - className = className, - delegate = TypeSpecBuilder.annotationBuilder(className) - ) - } - - operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinAnnotationClassBuilder = apply { - delegate.block() - } - - override fun build(): KotlinAnnotationClassSpec = KotlinAnnotationClassSpec( - className = className, - spec = delegate.build() - ) - - override fun get(): TypeSpec = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/KotlinCompanionObjectSpec.kt b/kotlin-code-generation/src/_BAK/KotlinCompanionObjectSpec.kt deleted file mode 100644 index eb38eb6..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinCompanionObjectSpec.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeSpec - -@JvmInline -value class KotlinCompanionObjectSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { - override fun get(): TypeSpec = spec -} diff --git a/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt b/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt deleted file mode 100644 index c9e181a..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.TypeName - -data class KotlinConstructorProperty( - val property: KotlinPropertySpec, - val parameter: KotlinParameterSpec, -) : ConstructorPropertySupplier, WithName, WithType { - - override val name: String = property.name - override val type: TypeName = property.type - - override fun get(): KotlinConstructorProperty = this -} diff --git a/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt deleted file mode 100644 index 6f0a029..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt +++ /dev/null @@ -1,32 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinEnumClassSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier -import mu.KLogging - -class KotlinEnumClassBuilder internal constructor( - private val delegate: TypeSpecBuilder -) : Builder, TypeSpecSupplier { - - companion object :KLogging() { - fun builder(className: ClassName) = KotlinEnumClassBuilder( - delegate = TypeSpecBuilder.enumBuilder(className) - ) - } - - operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinEnumClassBuilder = apply { - delegate.block() - } - - fun addEnumConstant(name: String) = apply { - delegate.addEnumConstant(name) - } - - override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) - override fun get(): TypeSpec = build().get() - -} diff --git a/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt deleted file mode 100644 index bf769b2..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeSpec - -@JvmInline -value class KotlinEnumClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { - - init { - require(spec.isEnum) { "Not an enum spec: $spec" } - } - - override fun get(): TypeSpec = spec -} diff --git a/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt deleted file mode 100644 index 181a739..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeSpec - -@JvmInline -value class KotlinInterfaceSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { - override fun get(): TypeSpec = spec -} diff --git a/kotlin-code-generation/src/main/kotlin/_builder.kt b/kotlin-code-generation/src/main/kotlin/_builder.kt index 9f406d9..dda8483 100644 --- a/kotlin-code-generation/src/main/kotlin/_builder.kt +++ b/kotlin-code-generation/src/main/kotlin/_builder.kt @@ -1,6 +1,8 @@ package io.toolisticon.kotlin.generation import com.squareup.kotlinpoet.* +import io.toolisticon.kotlin.generation._BAK.KotlinConstructorProperty +import java.beans.ConstructorProperties import java.util.function.Supplier fun interface Builder

{ @@ -11,6 +13,7 @@ interface BuilderSupplier

: Builder

, Supplier interface SpecSupplier : Supplier interface AnnotationSpecSupplier : SpecSupplier +interface ConstructorPropertySupplier : SpecSupplier interface FileSpecSupplier : SpecSupplier interface FunSpecSupplier : SpecSupplier interface ParameterSpecSupplier : SpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt new file mode 100644 index 0000000..2641b03 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt @@ -0,0 +1,31 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec + +class KotlinAnnotationClassSpecBuilder internal constructor( + val className: ClassName, + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { + +// companion object { +// fun builder(className: ClassName) = KotlinAnnotationClassBuilder( +// className = className, +// delegate = TypeSpecBuilder.annotationBuilder(className) +// ) +// } + + override fun builder(block: TypeSpecBuilderReceiver) = apply{ + delegate.builder.block() + } + + override fun build(): KotlinAnnotationClassSpec = KotlinAnnotationClassSpec( + className = className, + spec = delegate.build() + ) + + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt similarity index 80% rename from kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt rename to kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt index 071434f..2affe79 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt @@ -6,9 +6,9 @@ import io.toolisticon.kotlin.generation.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinAnonymousClassSpec -class KotlinAnonymousClassBuilder internal constructor( +class KotlinAnonymousClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { override fun build(): KotlinAnonymousClassSpec = KotlinAnonymousClassSpec(delegate.build()) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt index ddbd9c0..58cb1db 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -1,13 +1,10 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec -import mu.KLogging class KotlinClassSpecBuilder internal constructor( @@ -25,7 +22,10 @@ class KotlinClassSpecBuilder internal constructor( delegate.builder.block() } - override fun build(): KotlinClassSpec = KotlinClassSpec(spec = delegate.build()) + override fun build(): KotlinClassSpec = KotlinClassSpec( + className = className, + spec = delegate.build() + ) override fun get(): TypeSpec = build().get() // operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt new file mode 100644 index 0000000..34a339c --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -0,0 +1,28 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpec +import mu.KLogging + +class KotlinEnumClassSpecBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { + +// companion object : KLogging() { +// fun builder(className: ClassName) = KotlinEnumClassSpecBuilder( +// delegate = TypeSpecBuilder.enumBuilder(className) +// ) +// } + + + fun addEnumConstant(name: String) = apply { + delegate.addEnumConstant(name) + } + + override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) + override fun get(): TypeSpec = build().get() + +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt b/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt index 87a30df..c13d43f 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt @@ -1,10 +1,5 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.FileSpec -import com.squareup.kotlinpoet.TypeAliasSpec -import com.squareup.kotlinpoet.TypeSpec - - interface DelegatingBuilder { fun builder(block: RECEIVER) : SELF diff --git a/kotlin-code-generation/src/_BAK/KotlinAnnotationClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt similarity index 51% rename from kotlin-code-generation/src/_BAK/KotlinAnnotationClassSpec.kt rename to kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt index 053366b..774da24 100644 --- a/kotlin-code-generation/src/_BAK/KotlinAnnotationClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt @@ -1,12 +1,12 @@ -package io.toolisticon.kotlin.generation._BAK +package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier data class KotlinAnnotationClassSpec( - override val className: ClassName, + val className: ClassName, private val spec: TypeSpec, -) : KotlinPoetNamedTypeSpec, Documentable by spec { +) : TypeSpecSupplier { override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt new file mode 100644 index 0000000..da273fa --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier + +data class KotlinCompanionObjectSpec( + private val spec: TypeSpec +) : TypeSpecSupplier { + override fun get(): TypeSpec = spec +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt new file mode 100644 index 0000000..1ddde03 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt @@ -0,0 +1,17 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.ConstructorPropertySupplier +import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec +import io.toolisticon.kotlin.generation.spec.KotlinPropertySpec + +data class KotlinConstructorProperty( + val property: KotlinPropertySpec, + val parameter: KotlinParameterSpec, +) : ConstructorPropertySupplier { + + val name: String = property.name + val type: TypeName = property.type + + override fun get(): KotlinConstructorProperty = this +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt new file mode 100644 index 0000000..16e190d --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt @@ -0,0 +1,15 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier + +data class KotlinEnumClassSpec( + private val spec: TypeSpec +) : TypeSpecSupplier { + + init { + require(spec.isEnum) { "Not an enum spec: $spec" } + } + + override fun get(): TypeSpec = spec +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt new file mode 100644 index 0000000..72ddacc --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt @@ -0,0 +1,8 @@ +package io.toolisticon.kotlin.generation._BAK + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier + +data class KotlinInterfaceSpec(private val spec: TypeSpec) : TypeSpecSupplier { + override fun get(): TypeSpec = spec +} From 4b6e707688d875cfd8f8393b28800788723a0ea8 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Mon, 17 Jun 2024 17:28:59 +0200 Subject: [PATCH 07/19] wip --- .mvn/wrapper/maven-wrapper.properties | 2 +- .../src/_BAK/KotlinConstructorProperty.kt | 14 ------ .../_BAK/KotlinConstructorPropertyBuilder.kt | 46 ------------------ .../src/_BAK/KotlinEnumClassBuilder.kt | 32 ------------- .../src/_BAK/KotlinEnumClassSpec.kt | 14 ------ .../src/_BAK/KotlinInterfaceBuilder.kt | 25 ---------- .../src/_BAK/KotlinInterfaceSpec.kt | 9 ---- .../src/main/kotlin/_builder.kt | 2 + .../KotlinConstructorPropertyBuilder.kt | 47 +++++++++++++++++++ .../builder/KotlinEnumClassSpecBuilder.kt | 33 +++++++++++++ .../builder/KotlinInterfaceSpecBuilder.kt | 23 +++++++++ .../kotlin/spec/KotlinConstructorProperty.kt | 15 ++++++ .../main/kotlin/spec/KotlinDataClassSpec.kt | 3 -- .../main/kotlin/spec/KotlinEnumClassSpec.kt | 15 ++++++ .../main/kotlin/spec/KotlinInterfaceSpec.kt | 10 ++++ 15 files changed, 146 insertions(+), 144 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index ce65fef..8a20f19 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,3 +1,3 @@ wrapperVersion=3.3.2 distributionType=only-script -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.8/apache-maven-3.9.8-bin.zip diff --git a/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt b/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt deleted file mode 100644 index c9e181a..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinConstructorProperty.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.TypeName - -data class KotlinConstructorProperty( - val property: KotlinPropertySpec, - val parameter: KotlinParameterSpec, -) : ConstructorPropertySupplier, WithName, WithType { - - override val name: String = property.name - override val type: TypeName = property.type - - override fun get(): KotlinConstructorProperty = this -} diff --git a/kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt deleted file mode 100644 index 4f6089b..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinConstructorPropertyBuilder.kt +++ /dev/null @@ -1,46 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.ConstructorPropertySupplier -import io.toolisticon.kotlin.generation._BAK.KotlinConstructorProperty - -class KotlinConstructorPropertyBuilder internal constructor( - override val name: String, - private val type: TypeName, - private val propertyBuilder: KotlinPropertySpecBuilder, - private val parameterBuilder: KotlinParameterSpecBuilder -) : Builder, ConstructorPropertySupplier { - - companion object { - fun builder(name: String, type: TypeName): KotlinConstructorPropertyBuilder = KotlinConstructorPropertyBuilder( - name = name, - type = type, - propertyBuilder = KotlinPropertySpecBuilder.builder(name = name, type = type), - parameterBuilder = KotlinParameterSpecBuilder.builder(name = name, type = type) - ) - } - - - fun makePrivate() = apply { - propertyBuilder.makePrivate() - } - - fun addAnnotation(annotationSpec: AnnotationSpec): KotlinConstructorPropertyBuilder = apply { - parameterBuilder { - addAnnotation(annotationSpec) - } - } - - override fun build(): KotlinConstructorProperty { - val parameter = parameterBuilder.build() - val property = propertyBuilder { - initializer(parameter.name) - }.build() - - return KotlinConstructorProperty(parameter = parameter, property = property) - } - - override fun get(): KotlinConstructorProperty = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt deleted file mode 100644 index 6f0a029..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinEnumClassBuilder.kt +++ /dev/null @@ -1,32 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinEnumClassSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier -import mu.KLogging - -class KotlinEnumClassBuilder internal constructor( - private val delegate: TypeSpecBuilder -) : Builder, TypeSpecSupplier { - - companion object :KLogging() { - fun builder(className: ClassName) = KotlinEnumClassBuilder( - delegate = TypeSpecBuilder.enumBuilder(className) - ) - } - - operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinEnumClassBuilder = apply { - delegate.block() - } - - fun addEnumConstant(name: String) = apply { - delegate.addEnumConstant(name) - } - - override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) - override fun get(): TypeSpec = build().get() - -} diff --git a/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt deleted file mode 100644 index bf769b2..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinEnumClassSpec.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeSpec - -@JvmInline -value class KotlinEnumClassSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { - - init { - require(spec.isEnum) { "Not an enum spec: $spec" } - } - - override fun get(): TypeSpec = spec -} diff --git a/kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt deleted file mode 100644 index 7ec4035..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinInterfaceBuilder.kt +++ /dev/null @@ -1,25 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinInterfaceSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - -class KotlinInterfaceBuilder internal constructor( - private val delegate: TypeSpecBuilder -) : Builder, TypeSpecSupplier { - companion object { - fun builder(className: ClassName) = KotlinInterfaceBuilder( - delegate = TypeSpecBuilder.Companion.interfaceBuilder(className) - ) - } - - operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinInterfaceBuilder = apply { - delegate.block() - } - - override fun build(): KotlinInterfaceSpec = KotlinInterfaceSpec(spec = delegate.build()) - override fun get(): TypeSpec = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt deleted file mode 100644 index 181a739..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinInterfaceSpec.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.TypeSpec - -@JvmInline -value class KotlinInterfaceSpec(private val spec: TypeSpec) : KotlinPoetTypeSpec, Documentable by spec { - override fun get(): TypeSpec = spec -} diff --git a/kotlin-code-generation/src/main/kotlin/_builder.kt b/kotlin-code-generation/src/main/kotlin/_builder.kt index 9f406d9..9656a36 100644 --- a/kotlin-code-generation/src/main/kotlin/_builder.kt +++ b/kotlin-code-generation/src/main/kotlin/_builder.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation import com.squareup.kotlinpoet.* +import io.toolisticon.kotlin.generation._BAK.KotlinConstructorProperty import java.util.function.Supplier fun interface Builder

{ @@ -18,3 +19,4 @@ interface PropertySpecSupplier : SpecSupplier interface TypeAliasSpecSupplier : SpecSupplier interface TypeSpecSupplier : SpecSupplier interface DataClassSpecSupplier : SpecSupplier, TypeSpecSupplier +interface ConstructorPropertySupplier : Supplier diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt new file mode 100644 index 0000000..6181439 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt @@ -0,0 +1,47 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation.ConstructorPropertySupplier +import io.toolisticon.kotlin.generation.spec.KotlinConstructorProperty + +class KotlinConstructorPropertyBuilder internal constructor( + val name: String, + private val type: TypeName, + private val propertyBuilder: KotlinPropertySpecBuilder, + private val parameterBuilder: KotlinParameterSpecBuilder +) : Builder, ConstructorPropertySupplier { + +// companion object { +// fun builder(name: String, type: TypeName): KotlinConstructorPropertyBuilder = KotlinConstructorPropertyBuilder( +// name = name, +// type = type, +// propertyBuilder = KotlinPropertySpecBuilder.builder(name = name, type = type), +// parameterBuilder = KotlinParameterSpecBuilder.builder(name = name, type = type) +// ) +// } + +// +// fun makePrivate() = apply { +// propertyBuilder.makePrivate() +// } +// +// fun addAnnotation(annotationSpec: AnnotationSpec): KotlinConstructorPropertyBuilder = apply { +// parameterBuilder { +// addAnnotation(annotationSpec) +// } +// } + + override fun build(): KotlinConstructorProperty { + val parameter = parameterBuilder.build() + val property = propertyBuilder + .builder { + initializer(parameter.name) + } + .build() + + return KotlinConstructorProperty(parameter = parameter, property = property) + } + + override fun get(): KotlinConstructorProperty = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt new file mode 100644 index 0000000..7d09c02 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -0,0 +1,33 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpec + +class KotlinEnumClassSpecBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { + +// companion object :KLogging() { +// fun builder(className: ClassName) = KotlinEnumClassSpecBuilder( +// delegate = TypeSpecBuilder.enumBuilder(className) +// ) +// } + +// operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinEnumClassSpecBuilder = apply { +// delegate.block() +// } + +// fun addEnumConstant(name: String) = apply { +// delegate.addEnumConstant(name) +// } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate.builder.block() + } + + override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) + override fun get(): TypeSpec = build().get() + +} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt new file mode 100644 index 0000000..60c8f59 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt @@ -0,0 +1,23 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinInterfaceSpec + +class KotlinInterfaceSpecBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +// companion object { +// fun builder(className: ClassName) = KotlinInterfaceSpecBuilder( +// delegate = TypeSpecBuilder.Companion.interfaceBuilder(className) +// ) +// } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate.builder.block() + } + + override fun build(): KotlinInterfaceSpec = KotlinInterfaceSpec(spec = delegate.build()) + override fun get(): TypeSpec = build().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt new file mode 100644 index 0000000..2a89b97 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt @@ -0,0 +1,15 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.ConstructorPropertySupplier + +data class KotlinConstructorProperty( + val property: KotlinPropertySpec, + val parameter: KotlinParameterSpec, +) : ConstructorPropertySupplier { + + val name: String = property.name + val type: TypeName = property.type + + override fun get(): KotlinConstructorProperty = this +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt index 0ce4f25..50ebd0a 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt @@ -1,12 +1,9 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.typeSpec.isDataClass import io.toolisticon.kotlin.generation.TypeSpecSupplier -import io.toolisticon.kotlin.generation.builder.KotlinDataClassSpecBuilder -import io.toolisticon.kotlin.generation.builder.KotlinFileBuilder data class KotlinDataClassSpec( val className: ClassName, diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt new file mode 100644 index 0000000..16e190d --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt @@ -0,0 +1,15 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier + +data class KotlinEnumClassSpec( + private val spec: TypeSpec +) : TypeSpecSupplier { + + init { + require(spec.isEnum) { "Not an enum spec: $spec" } + } + + override fun get(): TypeSpec = spec +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt new file mode 100644 index 0000000..4527a7e --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.TypeSpecSupplier + +data class KotlinInterfaceSpec( + private val spec: TypeSpec +) : TypeSpecSupplier { + override fun get(): TypeSpec = spec +} From 8c284ada3ffac67f8bfcd7155e98761190d44350 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Tue, 18 Jun 2024 18:13:21 +0200 Subject: [PATCH 08/19] chore: wip --- .../src/main/kotlin/_builder.kt | 24 ++-- .../src/main/kotlin/_types.kt | 14 +++ .../KotlinAnnotationClassSpecBuilder.kt | 8 +- .../builder/KotlinAnnotationSpecBuilder.kt | 8 +- .../KotlinAnonymousClassSpecBuilder.kt | 8 +- .../kotlin/builder/KotlinClassSpecBuilder.kt | 8 +- .../KotlinCompanionObjectSpecBuilder.kt | 107 ++++++++++++++++++ .../builder/KotlinDataClassSpecBuilder.kt | 7 +- .../builder/KotlinEnumClassSpecBuilder.kt | 7 +- .../kotlin/builder/KotlinFileSpecBuilder.kt | 11 +- .../kotlin/builder/KotlinFunSpecBuilder.kt | 7 +- .../builder/KotlinInterfaceSpecBuilder.kt | 7 +- .../kotlin/builder/KotlinObjectSpecBuilder.kt | 7 +- .../builder/KotlinParameterSpecBuilder.kt | 7 +- .../builder/KotlinPropertySpecBuilder.kt | 7 +- .../builder/KotlinTypeAliasSpecBuilder.kt | 8 +- .../builder/KotlinValueClassSpecBuilder.kt | 7 +- .../src/main/kotlin/builder/_poet.kt | 55 --------- .../main/kotlin/poet/AnnotationSpecBuilder.kt | 16 +++ .../src/main/kotlin/poet/FileSpecBuilder.kt | 16 +++ .../src/main/kotlin/poet/FunSpecBuilder.kt | 16 +++ .../main/kotlin/poet/ParameterSpecBuilder.kt | 17 +++ .../main/kotlin/poet/PropertySpecBuilder.kt | 16 +++ .../main/kotlin/poet/TypeAliasSpecBuilder.kt | 17 +++ .../src/main/kotlin/poet/TypeSpecBuilder.kt | 16 +++ .../src/main/kotlin/poet/_types.kt | 48 ++++++++ .../kotlin/spec/KotlinAnnotationClassSpec.kt | 6 +- .../main/kotlin/spec/KotlinAnnotationSpec.kt | 5 +- .../kotlin/spec/KotlinAnonymousClassSpec.kt | 7 +- .../src/main/kotlin/spec/KotlinClassSpec.kt | 5 +- .../kotlin/spec/KotlinCompanionObjectSpec.kt | 5 +- .../kotlin/spec/KotlinConstructorProperty.kt | 5 +- .../main/kotlin/spec/KotlinDataClassSpec.kt | 5 +- .../main/kotlin/spec/KotlinEnumClassSpec.kt | 5 +- .../src/main/kotlin/spec/KotlinFileSpec.kt | 7 +- .../src/main/kotlin/spec/KotlinFunSpec.kt | 5 +- .../main/kotlin/spec/KotlinInterfaceSpec.kt | 5 +- .../src/main/kotlin/spec/KotlinObjectSpec.kt | 5 +- .../main/kotlin/spec/KotlinParameterSpec.kt | 7 +- .../main/kotlin/spec/KotlinPropertySpec.kt | 8 +- .../main/kotlin/spec/KotlinTypeAliasSpec.kt | 7 +- .../main/kotlin/spec/KotlinValueClassSpec.kt | 5 +- .../src/main/kotlin/spec/_types.kt | 35 ++++++ 43 files changed, 462 insertions(+), 134 deletions(-) create mode 100644 kotlin-code-generation/src/main/kotlin/_types.kt create mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/_poet.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/_types.kt create mode 100644 kotlin-code-generation/src/main/kotlin/spec/_types.kt diff --git a/kotlin-code-generation/src/main/kotlin/_builder.kt b/kotlin-code-generation/src/main/kotlin/_builder.kt index 991a581..a3cc7bd 100644 --- a/kotlin-code-generation/src/main/kotlin/_builder.kt +++ b/kotlin-code-generation/src/main/kotlin/_builder.kt @@ -1,22 +1,18 @@ package io.toolisticon.kotlin.generation -import KotlinConstructorProperty import com.squareup.kotlinpoet.* +import io.toolisticon.kotlin.generation.spec.KotlinConstructorProperty import java.util.function.Supplier -fun interface Builder

{ - fun build(): P -} - interface BuilderSupplier

: Builder

, Supplier interface SpecSupplier : Supplier -interface AnnotationSpecSupplier : SpecSupplier -interface ConstructorPropertySupplier : SpecSupplier -interface FileSpecSupplier : SpecSupplier -interface FunSpecSupplier : SpecSupplier -interface ParameterSpecSupplier : SpecSupplier -interface PropertySpecSupplier : SpecSupplier -interface TypeAliasSpecSupplier : SpecSupplier -interface TypeSpecSupplier : SpecSupplier -interface DataClassSpecSupplier : SpecSupplier, TypeSpecSupplier +interface AnnotationSpecSupplier1 : SpecSupplier +interface ConstructorPropertySupplier1 : SpecSupplier +interface FileSpecSupplier1 : SpecSupplier +interface FunSpecSupplier1 : SpecSupplier +interface ParameterSpecSupplier1 : SpecSupplier +interface PropertySpecSupplier1 : SpecSupplier +interface TypeAliasSpecSupplier1 : SpecSupplier +interface TypeSpecSupplier1 : SpecSupplier + diff --git a/kotlin-code-generation/src/main/kotlin/_types.kt b/kotlin-code-generation/src/main/kotlin/_types.kt new file mode 100644 index 0000000..16c13f9 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/_types.kt @@ -0,0 +1,14 @@ +package io.toolisticon.kotlin.generation + +import io.toolisticon.kotlin.generation.poet.PoetSpecSupplier +import io.toolisticon.kotlin.generation.spec.* + + +/** + * Marks a type as capable of building a new product. + */ +fun interface Builder { + fun build(): PRODUCT +} + + diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt index 2641b03..38296b8 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt @@ -3,13 +3,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpecSupplier class KotlinAnnotationClassSpecBuilder internal constructor( val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinAnnotationClassSpecSupplier, DelegatingBuilder { // companion object { // fun builder(className: ClassName) = KotlinAnnotationClassBuilder( @@ -27,5 +29,7 @@ class KotlinAnnotationClassSpecBuilder internal constructor( spec = delegate.build() ) + override fun spec(): KotlinAnnotationClassSpec = build() + override fun get(): TypeSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt index 95c2b7f..3a4a9a0 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt @@ -2,14 +2,17 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.CodeBlock -import io.toolisticon.kotlin.generation.AnnotationSpecSupplier import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilder +import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpec +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import kotlin.reflect.KClass class KotlinAnnotationSpecBuilder internal constructor( private val delegate: AnnotationSpecBuilder -) : BuilderSupplier, AnnotationSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinAnnotationSpecSupplier, DelegatingBuilder { // companion object { // fun builder(type: ClassName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) // fun builder(type: ParameterizedTypeName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.Companion.builder(type)) @@ -35,5 +38,6 @@ class KotlinAnnotationSpecBuilder internal constructor( } override fun build(): KotlinAnnotationSpec = KotlinAnnotationSpec(spec = delegate.build()) + override fun spec(): KotlinAnnotationSpec = build() override fun get(): AnnotationSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt index 2affe79..6f5e495 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt @@ -2,17 +2,19 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinAnonymousClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinAnonymousClassSpecSupplier class KotlinAnonymousClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinAnonymousClassSpecSupplier, DelegatingBuilder { override fun build(): KotlinAnonymousClassSpec = KotlinAnonymousClassSpec(delegate.build()) - override fun get(): TypeSpec = build().get() + override fun spec(): KotlinAnonymousClassSpec = build() override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt index 58cb1db..52390cf 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -3,14 +3,16 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinClassSpecSupplier class KotlinClassSpecBuilder internal constructor( private val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinClassSpecSupplier, DelegatingBuilder { // companion object { // fun builder(className: ClassName) = KotlinClassBuilder( @@ -26,6 +28,8 @@ class KotlinClassSpecBuilder internal constructor( className = className, spec = delegate.build() ) + + override fun spec(): KotlinClassSpec = build() override fun get(): TypeSpec = build().get() // operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt new file mode 100644 index 0000000..c562213 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt @@ -0,0 +1,107 @@ +package io.toolisticon.kotlin.generation.builder + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.spec.KotlinCompanionObjectSpec +import io.toolisticon.kotlin.generation.spec.KotlinCompanionObjectSpecSupplier + + +class KotlinCompanionObjectSpecBuilder internal constructor( + private val delegate: TypeSpecBuilder +) : BuilderSupplier, KotlinCompanionObjectSpecSupplier, DelegatingBuilder { + +// companion object { +// fun builder(className: ClassName) = KotlinClassBuilder( +// delegate = TypeSpecBuilder.classBuilder(className) +// ) +// } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate.builder.block() + } + + override fun build(): KotlinCompanionObjectSpec = KotlinCompanionObjectSpec( + spec = delegate.build() + ) + + override fun spec(): KotlinCompanionObjectSpec = build() + override fun get(): TypeSpec = build().get() + +// operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( +// className = spec.className, +// delegate = spec.get().toBuilder() +// ) +//} +// +//private val constructorProperties = LinkedHashMap() +// +//operator fun invoke(block: TypeSpecBuilder.() -> Unit): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { +// delegate.block() +// override fun addKdoc(kdoc: CodeBlock) = apply { +// delegate.addKdoc(kdoc) +// } +// +// fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { +// delegate.addType(typeSpecSupplier.get()) +// } +// +// fun addConstructorProperty(name: String, type: TypeName, block: _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinConstructorPropertyBuilder.() -> Unit = {}) = apply { +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[name] = buildConstructorProperty(name, type, block) +// } +// +// fun addConstructorProperty(constructorProperty: ConstructorPropertySupplier) = apply { +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[constructorProperty.name] = constructorProperty +// } +// +// /** +// * Finalize a data class based on its primary constructor parameters. +// * +// * * adds primary constructor. +// * * backs parameters with properties. +// */ +// override fun build(): KotlinDataClassSpec { +// check(_root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.isNotEmpty()) { "Data class must have at least one property." } +// +// val constructor = FunSpec.constructorBuilder() +// +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.values.map(ConstructorPropertySupplier::get).forEach { +// constructor.addParameter(it.parameter.get()) +// delegate.addProperty(it.property.get()) +// } +// +// delegate.primaryConstructor(constructor.build()) +// +// return KotlinDataClassSpec(className = className, spec = delegate.build()) +// } +// +// override fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = apply { +// fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { +// delegate.addAnnotation(annotation) +// } +// +// override fun get(): TypeSpec = build().get() +// +// } +} + + +// @Suppress("ClassName") +// object builder : +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.ToKotlinPoetSpecBuilder { +// +// fun builder(className: ClassName) = _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder(className = className) +// operator fun invoke(packageName: String, name: String): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.invoke(ClassName(packageName, name)) +// +// fun builder(packageName: String, name: String) = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.builder(ClassName(packageName, name)) +// operator fun invoke(className: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = +// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( +// className = className, +// delegate = TypeSpec.classBuilder(className) +// ) +// +// } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index a35220d..58793ad 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -4,15 +4,17 @@ import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpecSupplier import mu.KLogging class KotlinDataClassSpecBuilder internal constructor( private val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinDataClassSpecSupplier, DelegatingBuilder { companion object : KLogging() {} internal constructor(className: ClassName) : this(className = className, delegate = TypeSpecBuilder(TypeSpec.classBuilder(className))) @@ -29,6 +31,7 @@ class KotlinDataClassSpecBuilder internal constructor( return KotlinDataClassSpec(className = className, spec = delegate.build()) } + override fun spec(): KotlinDataClassSpec = build() override fun get(): TypeSpec = build().get() // operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt index 4e9d424..4b5b184 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -2,12 +2,14 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpecSupplier class KotlinEnumClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinEnumClassSpecSupplier, DelegatingBuilder { // companion object :KLogging() { // fun builder(className: ClassName) = KotlinEnumClassSpecBuilder( @@ -34,6 +36,7 @@ class KotlinEnumClassSpecBuilder internal constructor( } override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) + override fun spec(): KotlinEnumClassSpec = build() override fun get(): TypeSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt index 895df43..3f1a1f0 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -2,13 +2,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.FileSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.FileSpecSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.FileSpecBuilder +import io.toolisticon.kotlin.generation.poet.FileSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinFileSpec +import io.toolisticon.kotlin.generation.spec.KotlinFileSpecSupplier class KotlinFileSpecBuilder internal constructor( private val delegate: FileSpecBuilder -) : BuilderSupplier, FileSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinFileSpecSupplier, DelegatingBuilder { override fun builder(block: FileSpecBuilderReceiver) = apply { @@ -20,11 +22,12 @@ class KotlinFileSpecBuilder internal constructor( addType(typeSpecSupplier.get()) } } - + override fun build(): KotlinFileSpec { val spec = delegate.build() return KotlinFileSpec(spec = spec) } + override fun spec(): KotlinFileSpec = build() override fun get(): FileSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index 401a163..ccbef81 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -2,13 +2,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.FunSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.FunSpecSupplier +import io.toolisticon.kotlin.generation.poet.FunSpecBuilder +import io.toolisticon.kotlin.generation.poet.FunSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinFunSpec +import io.toolisticon.kotlin.generation.spec.KotlinFunSpecSupplier class KotlinFunSpecBuilder internal constructor( private val delegate: FunSpecBuilder ) : BuilderSupplier, - FunSpecSupplier, + KotlinFunSpecSupplier, DelegatingBuilder { //companion object { @@ -20,5 +22,6 @@ class KotlinFunSpecBuilder internal constructor( } override fun build(): KotlinFunSpec = KotlinFunSpec(spec = delegate.build()) + override fun spec(): KotlinFunSpec = build() override fun get(): FunSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt index 60c8f59..0ce971d 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt @@ -2,12 +2,14 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinInterfaceSpec +import io.toolisticon.kotlin.generation.spec.KotlinInterfaceSpecSupplier class KotlinInterfaceSpecBuilder internal constructor( private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinInterfaceSpecSupplier, DelegatingBuilder { // companion object { // fun builder(className: ClassName) = KotlinInterfaceSpecBuilder( // delegate = TypeSpecBuilder.Companion.interfaceBuilder(className) @@ -19,5 +21,6 @@ class KotlinInterfaceSpecBuilder internal constructor( } override fun build(): KotlinInterfaceSpec = KotlinInterfaceSpec(spec = delegate.build()) + override fun spec(): KotlinInterfaceSpec = build() override fun get(): TypeSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt index 26d075f..3bcd375 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt @@ -2,13 +2,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinObjectSpec +import io.toolisticon.kotlin.generation.spec.KotlinObjectSpecSupplier class KotlinObjectSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, - TypeSpecSupplier, + KotlinObjectSpecSupplier, DelegatingBuilder { // companion object { @@ -31,5 +33,6 @@ class KotlinObjectSpecBuilder internal constructor( } override fun build(): KotlinObjectSpec = KotlinObjectSpec(spec = delegate.build()) + override fun spec(): KotlinObjectSpec = build() override fun get(): TypeSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt index 79ece2d..b35e0b4 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -2,13 +2,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ParameterSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.ParameterSpecSupplier +import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder +import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec +import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier class KotlinParameterSpecBuilder internal constructor( private val delegate: ParameterSpecBuilder ) : BuilderSupplier, - ParameterSpecSupplier, + KotlinParameterSpecSupplier, DelegatingBuilder { // companion object { @@ -28,5 +30,6 @@ class KotlinParameterSpecBuilder internal constructor( // } override fun build(): KotlinParameterSpec = KotlinParameterSpec(spec = delegate.build()) + override fun spec(): KotlinParameterSpec = build() override fun get(): ParameterSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index 53c6728..e4b926a 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -2,13 +2,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.PropertySpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.PropertySpecSupplier +import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder +import io.toolisticon.kotlin.generation.poet.PropertySpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinPropertySpec +import io.toolisticon.kotlin.generation.spec.KotlinPropertySpecSupplier class KotlinPropertySpecBuilder internal constructor( private val delegate: PropertySpecBuilder ) : BuilderSupplier, - PropertySpecSupplier, + KotlinPropertySpecSupplier, DelegatingBuilder { @@ -21,5 +23,6 @@ class KotlinPropertySpecBuilder internal constructor( return KotlinPropertySpec(spec = spec) } + override fun spec(): KotlinPropertySpec = build() override fun get(): PropertySpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt index 7b529d3..63aae9e 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt @@ -2,13 +2,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.TypeAliasSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeAliasSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeAliasSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeAliasSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinTypeAliasSpec +import io.toolisticon.kotlin.generation.spec.KotlinTypeAliasSpecSupplier class KotlinTypeAliasSpecBuilder internal constructor( private val delegate: TypeAliasSpecBuilder ) : BuilderSupplier, - TypeAliasSpecSupplier, + KotlinTypeAliasSpecSupplier, DelegatingBuilder { // companion object { @@ -22,5 +24,7 @@ class KotlinTypeAliasSpecBuilder internal constructor( } override fun build() = KotlinTypeAliasSpec(spec = delegate.build()) + override fun spec(): KotlinTypeAliasSpec = build() override fun get(): TypeAliasSpec = build().get() + } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt index 3878e93..490a9ca 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -3,13 +3,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpecSupplier class KotlinValueClassSpecBuilder internal constructor( val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, TypeSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, KotlinValueClassSpecSupplier, DelegatingBuilder { override fun builder(block: TypeSpecBuilderReceiver) = apply { @@ -21,5 +23,6 @@ class KotlinValueClassSpecBuilder internal constructor( return KotlinValueClassSpec(className = className, spec = spec) } + override fun spec(): KotlinValueClassSpec = build() override fun get(): TypeSpec = build().get() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/_poet.kt b/kotlin-code-generation/src/main/kotlin/builder/_poet.kt deleted file mode 100644 index 5dda2c6..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/_poet.kt +++ /dev/null @@ -1,55 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.* - -sealed interface PoetSpecBuilder { - val builder: BUILDER - - operator fun invoke(block: BUILDER.() -> Unit): SELF - - fun build(): SPEC -} - -class AnnotationSpecBuilder(override val builder: AnnotationSpec.Builder) : PoetSpecBuilder { - override fun invoke(block: AnnotationSpec.Builder.() -> Unit): AnnotationSpecBuilder = apply { builder.block() } - override fun build(): AnnotationSpec = builder.build() -} - -class FileSpecBuilder(override val builder: FileSpec.Builder) : PoetSpecBuilder { - override fun invoke(block: FileSpec.Builder.() -> Unit): FileSpecBuilder = apply { builder.block() } - override fun build(): FileSpec = builder.build() -} - -class FunSpecBuilder(override val builder: FunSpec.Builder) : PoetSpecBuilder { - override fun invoke(block: FunSpec.Builder.() -> Unit): FunSpecBuilder = apply { builder.block() } - override fun build(): FunSpec = builder.build() -} - -class ParameterSpecBuilder(override val builder: ParameterSpec.Builder) : PoetSpecBuilder { - override fun invoke(block: ParameterSpec.Builder.() -> Unit): ParameterSpecBuilder = apply { builder.block() } - override fun build(): ParameterSpec = builder.build() -} - -class PropertySpecBuilder(override val builder: PropertySpec.Builder) : PoetSpecBuilder { - override fun invoke(block: PropertySpec.Builder.() -> Unit): PropertySpecBuilder = apply { builder.block() } - override fun build(): PropertySpec = builder.build() -} - -class TypeAliasSpecBuilder(override val builder: TypeAliasSpec.Builder) : PoetSpecBuilder { - override fun invoke(block: TypeAliasSpec.Builder.() -> Unit): TypeAliasSpecBuilder = apply { builder.block() } - override fun build(): TypeAliasSpec = builder.build() -} - -class TypeSpecBuilder(override val builder: TypeSpec.Builder) : PoetSpecBuilder { - override fun invoke(block: TypeSpec.Builder.() -> Unit): TypeSpecBuilder = apply { builder.block() } - override fun build(): TypeSpec = builder.build() -} - -typealias AnnotationSpecBuilderReceiver = AnnotationSpec.Builder.() -> Unit -typealias FileSpecBuilderReceiver = FileSpec.Builder.() -> Unit -typealias FunSpecBuilderReceiver = FunSpec.Builder.() -> Unit -typealias ParameterSpecBuilderReceiver = ParameterSpec.Builder.() -> Unit -typealias PropertySpecBuilderReceiver = PropertySpec.Builder.() -> Unit -typealias TypeSpecBuilderReceiver = TypeSpec.Builder.() -> Unit -typealias TypeAliasSpecBuilderReceiver = TypeAliasSpec.Builder.() -> Unit - diff --git a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt new file mode 100644 index 0000000..b11b01e --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt @@ -0,0 +1,16 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.AnnotationSpec + +class AnnotationSpecBuilder( + override val builder: AnnotationSpec.Builder +) : PoetSpecBuilder { + + override fun invoke(block: AnnotationSpecBuilderReceiver): AnnotationSpecBuilder = apply { + builder.block() + } + + override fun build(): AnnotationSpec = builder.build() +} + +typealias AnnotationSpecBuilderReceiver = AnnotationSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt new file mode 100644 index 0000000..55e3043 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt @@ -0,0 +1,16 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.FileSpec + +class FileSpecBuilder( + override val builder: FileSpec.Builder +) : PoetSpecBuilder { + + override fun invoke(block: FileSpecBuilderReceiver): FileSpecBuilder = apply { + builder.block() + } + + override fun build(): FileSpec = builder.build() +} + +typealias FileSpecBuilderReceiver = FileSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt new file mode 100644 index 0000000..2150c02 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt @@ -0,0 +1,16 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.FunSpec + +class FunSpecBuilder( + override val builder: FunSpec.Builder +) : PoetSpecBuilder { + + override fun invoke(block: FunSpecBuilderReceiver): FunSpecBuilder = apply { + builder.block() + } + + override fun build(): FunSpec = builder.build() +} + +typealias FunSpecBuilderReceiver = FunSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt new file mode 100644 index 0000000..387ace8 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt @@ -0,0 +1,17 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.ParameterSpec + +class ParameterSpecBuilder( + override val builder: ParameterSpec.Builder +) : PoetSpecBuilder { + + override fun invoke(block: ParameterSpecBuilderReceiver): ParameterSpecBuilder = apply { + builder.block() + } + + override fun build(): ParameterSpec = builder.build() +} + +typealias ParameterSpecBuilderReceiver = ParameterSpec.Builder.() -> Unit + diff --git a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt new file mode 100644 index 0000000..a4fea4f --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt @@ -0,0 +1,16 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.PropertySpec + +class PropertySpecBuilder( + override val builder: PropertySpec.Builder +) : PoetSpecBuilder { + + override fun invoke(block: PropertySpecBuilderReceiver): PropertySpecBuilder = apply { + builder.block() + } + + override fun build(): PropertySpec = builder.build() +} + +typealias PropertySpecBuilderReceiver = PropertySpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt new file mode 100644 index 0000000..16eaf7a --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt @@ -0,0 +1,17 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.TypeAliasSpec +import com.squareup.kotlinpoet.TypeSpec + +class TypeAliasSpecBuilder( + override val builder: TypeAliasSpec.Builder +) : PoetSpecBuilder { + + override fun invoke(block: TypeAliasSpecBuilderReceiver): TypeAliasSpecBuilder = apply { + builder.block() + } + + override fun build(): TypeAliasSpec = builder.build() +} + +typealias TypeAliasSpecBuilderReceiver = TypeAliasSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt new file mode 100644 index 0000000..661eb70 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt @@ -0,0 +1,16 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.TypeSpec + +class TypeSpecBuilder( + override val builder: TypeSpec.Builder +) : PoetSpecBuilder { + + override fun invoke(block: TypeSpecBuilderReceiver): TypeSpecBuilder = apply { + builder.block() + } + + override fun build(): TypeSpec = builder.build() +} + +typealias TypeSpecBuilderReceiver = TypeSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/_types.kt b/kotlin-code-generation/src/main/kotlin/poet/_types.kt new file mode 100644 index 0000000..48bfd9b --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/_types.kt @@ -0,0 +1,48 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.* +import io.toolisticon.kotlin.generation.Builder +import java.util.function.Supplier + +/** + * Unfortunately, kotlin-poet specs do not share a common interface, this alias simulates that. + */ +typealias PoetSpec = Any + +/** + * Any class that can provide a kotlin-poet-native type like [com.squareup.kotlinpoet.TypeSpec], [com.squareup.kotlinpoet.ParameterSpec], ... + * exposes this by implementing this interface. + */ +interface PoetSpecSupplier : Supplier +interface AnnotationSpecSupplier : PoetSpecSupplier +interface FileSpecSupplier : PoetSpecSupplier +interface FunSpecSupplier : PoetSpecSupplier +interface ParameterSpecSupplier : PoetSpecSupplier +interface PropertySpecSupplier : PoetSpecSupplier +interface TypeAliasSpecSupplier : PoetSpecSupplier + +/** + * TypeSpec includes: + * + * * AnnotationClassSpec + * * AnonymousClassSpec + * * ClassSpec + * * CompanionObjectSpec + * * DataClassSpec + * * EnumClassSpec + * * InterfaceSpec + * * ObjectSpec + * * ValueClassSpec + */ +interface TypeSpecSupplier : PoetSpecSupplier + +/** + * Unfortunately, kotlin-poet spec-builders do not share a common interface, this interface simulates that. + */ +sealed interface PoetSpecBuilder, BUILDER, SPEC : PoetSpec, SUPPLIER:PoetSpecSupplier> : Builder, PoetSpecSupplier { + val builder: BUILDER + + operator fun invoke(block: BUILDER.() -> Unit): SELF + + override fun get(): SPEC = build() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt index 774da24..e79c0b9 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt @@ -2,11 +2,13 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinAnnotationClassSpec( val className: ClassName, private val spec: TypeSpec, -) : TypeSpecSupplier { +) : KotlinGeneratorTypeSpec, TypeSpecSupplier, KotlinAnnotationClassSpecSupplier { + + override fun spec(): KotlinAnnotationClassSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt index 4d34812..b2f1ac9 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt @@ -3,11 +3,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.AnnotationSpecSupplier +import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier data class KotlinAnnotationSpec( private val spec: AnnotationSpec -) : AnnotationSpecSupplier { +) : KotlinGeneratorSpec, KotlinAnnotationSpecSupplier { companion object { fun of(annotations: List): List = annotations.map { KotlinAnnotationSpec(it) } @@ -17,6 +17,7 @@ data class KotlinAnnotationSpec( val members: List get() = spec.members override fun get(): AnnotationSpec = spec + override fun spec(): KotlinAnnotationSpec = this override fun toString(): String { return "KotlinAnnotationSpec(typeName=$typeName, members=$members)" diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt index f186cd1..4ab506d 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt @@ -1,8 +1,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier -data class KotlinAnonymousClassSpec(private val spec: TypeSpec) : TypeSpecSupplier { +data class KotlinAnonymousClassSpec( + private val spec: TypeSpec +) : KotlinGeneratorTypeSpec, KotlinAnonymousClassSpecSupplier { + override fun spec(): KotlinAnonymousClassSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt index c233c5d..b81b7e0 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt @@ -2,17 +2,18 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinClassSpec( val className: ClassName, private val spec: TypeSpec -) : TypeSpecSupplier { +) : KotlinGeneratorTypeSpec, KotlinClassSpecSupplier { init { //require(spec.is) { "Not a dataClass spec: $spec." } } + override fun spec(): KotlinClassSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt index da273fa..d38a8f8 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt @@ -1,10 +1,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinCompanionObjectSpec( private val spec: TypeSpec -) : TypeSpecSupplier { +) : KotlinGeneratorTypeSpec, KotlinCompanionObjectSpecSupplier { + override fun spec(): KotlinCompanionObjectSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt index 2a89b97..8334dd8 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt @@ -1,15 +1,14 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.ConstructorPropertySupplier data class KotlinConstructorProperty( val property: KotlinPropertySpec, val parameter: KotlinParameterSpec, -) : ConstructorPropertySupplier { +) { // TODO}: ConstructorPropertySupplier { val name: String = property.name val type: TypeName = property.type - override fun get(): KotlinConstructorProperty = this + // TODO override fun get(): KotlinConstructorProperty = this } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt index 50ebd0a..fafba0a 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt @@ -3,17 +3,18 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.typeSpec.isDataClass -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinDataClassSpec( val className: ClassName, private val spec: TypeSpec -) : TypeSpecSupplier { +) : KotlinGeneratorTypeSpec, KotlinDataClassSpecSupplier { init { require(spec.isDataClass) { "Not a dataClass spec: $spec." } } + override fun spec(): KotlinDataClassSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt index 16e190d..542850b 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt @@ -1,15 +1,16 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinEnumClassSpec( private val spec: TypeSpec -) : TypeSpecSupplier { +) : KotlinGeneratorTypeSpec, KotlinEnumClassSpecSupplier { init { require(spec.isEnum) { "Not an enum spec: $spec" } } + override fun spec(): KotlinEnumClassSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt index 6403fec..bb1c345 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt @@ -2,9 +2,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FileSpec -import io.toolisticon.kotlin.generation.FileSpecSupplier +import io.toolisticon.kotlin.generation.poet.FileSpecSupplier -data class KotlinFileSpec(private val spec: FileSpec) : FileSpecSupplier { +data class KotlinFileSpec( + private val spec: FileSpec +) : KotlinGeneratorSpec, KotlinFileSpecSupplier { val packageName: String = spec.packageName val rootName: String = spec.name @@ -12,5 +14,6 @@ data class KotlinFileSpec(private val spec: FileSpec) : FileSpecSupplier { val fqn: String = "$packageName.$rootName" val fileName: String = "$fqn.kt" + override fun spec(): KotlinFileSpec = this override fun get(): FileSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt index dce7c2c..db724a4 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt @@ -1,10 +1,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.FunSpec -import io.toolisticon.kotlin.generation.FunSpecSupplier +import io.toolisticon.kotlin.generation.poet.FunSpecSupplier data class KotlinFunSpec( private val spec: FunSpec -) : FunSpecSupplier { +) : KotlinGeneratorSpec, KotlinFunSpecSupplier { + override fun spec(): KotlinFunSpec = this override fun get(): FunSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt index 4527a7e..559511c 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt @@ -1,10 +1,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinInterfaceSpec( private val spec: TypeSpec -) : TypeSpecSupplier { +) : KotlinGeneratorTypeSpec, KotlinInterfaceSpecSupplier { + override fun spec(): KotlinInterfaceSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt index 0b604fa..8394de2 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt @@ -1,11 +1,12 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.TypeSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinObjectSpec( private val spec: TypeSpec -) : TypeSpecSupplier { +) : KotlinGeneratorTypeSpec, KotlinObjectSpecSupplier { + override fun spec(): KotlinObjectSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt index 027319c..c90b1b3 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt @@ -2,14 +2,17 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ParameterSpec import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.ParameterSpecSupplier +import io.toolisticon.kotlin.generation.poet.ParameterSpecSupplier -data class KotlinParameterSpec(private val spec: ParameterSpec) : ParameterSpecSupplier { +data class KotlinParameterSpec( + private val spec: ParameterSpec +) : KotlinGeneratorSpec, KotlinParameterSpecSupplier { val name: String get() = spec.name val type: TypeName get() = spec.type + override fun spec(): KotlinParameterSpec = this override fun get(): ParameterSpec = this.spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt index 5819804..726db4b 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt @@ -2,16 +2,18 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.PropertySpecSupplier +import io.toolisticon.kotlin.generation.poet.PropertySpecSupplier -data class KotlinPropertySpec(private val spec: PropertySpec) : PropertySpecSupplier { +data class KotlinPropertySpec( + private val spec: PropertySpec +) : KotlinGeneratorSpec, KotlinPropertySpecSupplier { val name: String get() = spec.name val type: TypeName get() = spec.type val mutable: Boolean get() = spec.mutable - + override fun spec(): KotlinPropertySpec = this override fun get(): PropertySpec = spec //override val annotations: List get() = KotlinAnnotationSpec.of(spec.annotations) diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt index f45d5d6..64a4fdb 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt @@ -1,8 +1,11 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeAliasSpec -import io.toolisticon.kotlin.generation.TypeAliasSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeAliasSpecSupplier -data class KotlinTypeAliasSpec(private val spec: TypeAliasSpec) : TypeAliasSpecSupplier { +data class KotlinTypeAliasSpec( + private val spec: TypeAliasSpec +) : KotlinGeneratorSpec, KotlinTypeAliasSpecSupplier { + override fun spec(): KotlinTypeAliasSpec = this override fun get(): TypeAliasSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt index a8e8615..0804ca5 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt @@ -3,17 +3,18 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.typeSpec.isValueClass -import io.toolisticon.kotlin.generation.SpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier data class KotlinValueClassSpec( val className: ClassName, private val spec: TypeSpec -) : SpecSupplier { +) : KotlinGeneratorTypeSpec, KotlinValueClassSpecSupplier { init { require(spec.isValueClass) { "Not a valueClass spec: $spec." } } + override fun spec(): KotlinValueClassSpec = this override fun get(): TypeSpec = spec } diff --git a/kotlin-code-generation/src/main/kotlin/spec/_types.kt b/kotlin-code-generation/src/main/kotlin/spec/_types.kt new file mode 100644 index 0000000..c4e83a5 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/spec/_types.kt @@ -0,0 +1,35 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.TypeSpec +import io.toolisticon.kotlin.generation.poet.* + +interface KotlinGeneratorSpecSupplier { + fun spec() : GENERATOR_SPEC +} + + + +interface KotlinGeneratorSpec, SPEC : PoetSpec, SUPPLIER : PoetSpecSupplier> : PoetSpecSupplier, KotlinGeneratorSpecSupplier { + override fun spec(): SELF +} + +interface KotlinGeneratorTypeSpec> : KotlinGeneratorSpec { + override fun spec(): SELF +} + +interface KotlinAnnotationSpecSupplier : KotlinGeneratorSpecSupplier, AnnotationSpecSupplier +interface KotlinFileSpecSupplier : KotlinGeneratorSpecSupplier, FileSpecSupplier +interface KotlinFunSpecSupplier : KotlinGeneratorSpecSupplier, FunSpecSupplier +interface KotlinParameterSpecSupplier : KotlinGeneratorSpecSupplier, ParameterSpecSupplier +interface KotlinPropertySpecSupplier : KotlinGeneratorSpecSupplier, PropertySpecSupplier +interface KotlinTypeAliasSpecSupplier: KotlinGeneratorSpecSupplier, TypeAliasSpecSupplier + +interface KotlinAnnotationClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinAnonymousClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinCompanionObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinDataClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinEnumClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinInterfaceSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinValueClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier From 7c4857527af5455a095a27b82f1ff45aa0139ce9 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Wed, 19 Jun 2024 00:54:00 +0200 Subject: [PATCH 09/19] wip --- .../src/main/kotlin/_builder.kt | 4 +- .../KotlinAnnotationClassSpecBuilder.kt | 21 ++++--- .../builder/KotlinAnnotationSpecBuilder.kt | 30 ++++++--- .../KotlinAnonymousClassSpecBuilder.kt | 7 +++ .../kotlin/builder/KotlinClassSpecBuilder.kt | 19 ++++-- .../KotlinCompanionObjectSpecBuilder.kt | 12 ++-- ...> KotlinConstructorPropertySpecBuilder.kt} | 14 ++--- .../builder/KotlinDataClassSpecBuilder.kt | 18 +++++- .../builder/KotlinEnumClassSpecBuilder.kt | 13 ++++ .../kotlin/builder/KotlinFileSpecBuilder.kt | 32 ++++++++++ .../kotlin/builder/KotlinFunSpecBuilder.kt | 34 +++++++++- .../builder/KotlinInterfaceSpecBuilder.kt | 24 +++++-- .../kotlin/builder/KotlinObjectSpecBuilder.kt | 10 +++ .../builder/KotlinParameterSpecBuilder.kt | 62 +++++++++++++++++-- .../builder/KotlinPropertySpecBuilder.kt | 52 ++++++++++++++++ .../builder/KotlinTypeAliasSpecBuilder.kt | 23 +++++-- .../builder/KotlinValueClassSpecBuilder.kt | 23 +++++++ .../main/kotlin/poet/AnnotationSpecBuilder.kt | 17 +++++ .../src/main/kotlin/poet/FileSpecBuilder.kt | 21 +++++++ .../src/main/kotlin/poet/FunSpecBuilder.kt | 20 ++++++ .../main/kotlin/poet/ParameterSpecBuilder.kt | 54 ++++++++++++++++ .../main/kotlin/poet/PropertySpecBuilder.kt | 31 ++++++++++ .../main/kotlin/poet/TypeAliasSpecBuilder.kt | 13 +++- .../src/main/kotlin/poet/TypeSpecBuilder.kt | 48 ++++++++++++++ ...ty.kt => KotlinConstructorPropertySpec.kt} | 7 +-- .../src/main/kotlin/spec/_types.kt | 2 + 26 files changed, 549 insertions(+), 62 deletions(-) rename kotlin-code-generation/src/main/kotlin/builder/{KotlinConstructorPropertyBuilder.kt => KotlinConstructorPropertySpecBuilder.kt} (72%) rename kotlin-code-generation/src/main/kotlin/spec/{KotlinConstructorProperty.kt => KotlinConstructorPropertySpec.kt} (61%) diff --git a/kotlin-code-generation/src/main/kotlin/_builder.kt b/kotlin-code-generation/src/main/kotlin/_builder.kt index a3cc7bd..ac4d91b 100644 --- a/kotlin-code-generation/src/main/kotlin/_builder.kt +++ b/kotlin-code-generation/src/main/kotlin/_builder.kt @@ -1,14 +1,14 @@ package io.toolisticon.kotlin.generation import com.squareup.kotlinpoet.* -import io.toolisticon.kotlin.generation.spec.KotlinConstructorProperty +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec import java.util.function.Supplier interface BuilderSupplier

: Builder

, Supplier interface SpecSupplier : Supplier interface AnnotationSpecSupplier1 : SpecSupplier -interface ConstructorPropertySupplier1 : SpecSupplier +interface ConstructorPropertySupplier1 : SpecSupplier interface FileSpecSupplier1 : SpecSupplier interface FunSpecSupplier1 : SpecSupplier interface ParameterSpecSupplier1 : SpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt index 38296b8..ac79677 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt @@ -13,14 +13,19 @@ class KotlinAnnotationClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinAnnotationClassSpecSupplier, DelegatingBuilder { -// companion object { -// fun builder(className: ClassName) = KotlinAnnotationClassBuilder( -// className = className, -// delegate = TypeSpecBuilder.annotationBuilder(className) -// ) -// } - - override fun builder(block: TypeSpecBuilderReceiver) = apply{ + companion object { + + @JvmStatic + fun annotationBuilder(name: String): KotlinAnnotationClassSpecBuilder = annotationBuilder(ClassName("", name)) + + @JvmStatic + fun annotationBuilder(className: ClassName): KotlinAnnotationClassSpecBuilder = KotlinAnnotationClassSpecBuilder( + className = className, + delegate = TypeSpecBuilder.annotationBuilder(className.simpleName) + ) + } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt index 3a4a9a0..2bf6056 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt @@ -1,7 +1,6 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilder import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilderReceiver @@ -13,13 +12,26 @@ import kotlin.reflect.KClass class KotlinAnnotationSpecBuilder internal constructor( private val delegate: AnnotationSpecBuilder ) : BuilderSupplier, KotlinAnnotationSpecSupplier, DelegatingBuilder { -// companion object { -// fun builder(type: ClassName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) -// fun builder(type: ParameterizedTypeName): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.Companion.builder(type)) -// fun builder(type: KClass): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder(AnnotationSpecBuilder.builder(type)) -// -// fun from(spec: KotlinAnnotationSpec) = KotlinAnnotationSpecBuilder(delegate = spec.get().toBuilder().wrap()) -// } + companion object { + @JvmStatic + fun builder( + type: ClassName + ): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder( + delegate = AnnotationSpecBuilder.builder(type) + ) + + @JvmStatic + fun builder( + type: ParameterizedTypeName + ): KotlinAnnotationSpecBuilder = KotlinAnnotationSpecBuilder( + delegate = AnnotationSpecBuilder.builder(type) + ) + + @JvmStatic + fun builder( + type: KClass + ): KotlinAnnotationSpecBuilder = builder(type.asClassName()) + } fun addMember(format: String, vararg args: Any): KotlinAnnotationSpecBuilder = apply { TODO() //delegate.addMember(format, *args) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt index 6f5e495..fabe479 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt @@ -12,6 +12,13 @@ class KotlinAnonymousClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinAnonymousClassSpecSupplier, DelegatingBuilder { + companion object { + @JvmStatic + fun anonymousClassBuilder(): KotlinAnonymousClassSpecBuilder = KotlinAnonymousClassSpecBuilder( + delegate = TypeSpecBuilder.anonymousClassBuilder() + ) + } + override fun build(): KotlinAnonymousClassSpec = KotlinAnonymousClassSpec(delegate.build()) override fun get(): TypeSpec = build().get() override fun spec(): KotlinAnonymousClassSpec = build() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt index 52390cf..f7d4654 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -14,11 +14,20 @@ class KotlinClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinClassSpecSupplier, DelegatingBuilder { -// companion object { -// fun builder(className: ClassName) = KotlinClassBuilder( -// delegate = TypeSpecBuilder.classBuilder(className) -// ) -// } + companion object { + @JvmStatic + fun classBuilder(name: String): KotlinClassSpecBuilder = KotlinClassSpecBuilder( + className = ClassName("", name), + delegate = TypeSpecBuilder.classBuilder(name) + ) + + @JvmStatic + fun classBuilder(className: ClassName): KotlinClassSpecBuilder = KotlinClassSpecBuilder( + className = className, + delegate = TypeSpecBuilder.classBuilder(className.simpleName) + ) + + } override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt index c562213..e02e26f 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt @@ -12,11 +12,13 @@ class KotlinCompanionObjectSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinCompanionObjectSpecSupplier, DelegatingBuilder { -// companion object { -// fun builder(className: ClassName) = KotlinClassBuilder( -// delegate = TypeSpecBuilder.classBuilder(className) -// ) -// } + companion object { + @JvmStatic + @JvmOverloads + fun companionObjectBuilder(name: String? = null): KotlinCompanionObjectSpecBuilder = KotlinCompanionObjectSpecBuilder( + delegate = TypeSpecBuilder.companionObjectBuilder(name) + ) + } override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt similarity index 72% rename from kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt rename to kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt index 6181439..e06a3af 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertyBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt @@ -2,15 +2,15 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.TypeName import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation.ConstructorPropertySupplier -import io.toolisticon.kotlin.generation.spec.KotlinConstructorProperty +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier -class KotlinConstructorPropertyBuilder internal constructor( +class KotlinConstructorPropertySpecBuilder internal constructor( val name: String, private val type: TypeName, private val propertyBuilder: KotlinPropertySpecBuilder, private val parameterBuilder: KotlinParameterSpecBuilder -) : Builder, ConstructorPropertySupplier { +) : Builder, KotlinConstructorPropertySpecSupplier { // companion object { // fun builder(name: String, type: TypeName): KotlinConstructorPropertyBuilder = KotlinConstructorPropertyBuilder( @@ -32,7 +32,7 @@ class KotlinConstructorPropertyBuilder internal constructor( // } // } - override fun build(): KotlinConstructorProperty { + override fun build(): KotlinConstructorPropertySpec { val parameter = parameterBuilder.build() val property = propertyBuilder .builder { @@ -40,8 +40,8 @@ class KotlinConstructorPropertyBuilder internal constructor( } .build() - return KotlinConstructorProperty(parameter = parameter, property = property) + return KotlinConstructorPropertySpec(parameter = parameter, property = property) } - override fun get(): KotlinConstructorProperty = build().get() + override fun spec(): KotlinConstructorPropertySpec = build() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index 58793ad..55c44f3 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -10,14 +10,26 @@ import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpecSupplier import mu.KLogging - class KotlinDataClassSpecBuilder internal constructor( private val className: ClassName, private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinDataClassSpecSupplier, DelegatingBuilder { - companion object : KLogging() {} + companion object : KLogging() { + + @JvmStatic + fun builder(name: String): KotlinDataClassSpecBuilder = KotlinDataClassSpecBuilder( + className = ClassName("", name), + delegate = TypeSpecBuilder.classBuilder(name) + ) + + @JvmStatic + fun builder(className: ClassName): KotlinDataClassSpecBuilder = KotlinDataClassSpecBuilder(className) + } - internal constructor(className: ClassName) : this(className = className, delegate = TypeSpecBuilder(TypeSpec.classBuilder(className))) + internal constructor(className: ClassName) : this( + className = className, + delegate = TypeSpecBuilder.classBuilder(className) + ) init { delegate { addModifiers(KModifier.DATA) } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt index 4b5b184..086ffb3 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -1,8 +1,10 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpec import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpecSupplier @@ -11,6 +13,17 @@ class KotlinEnumClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinEnumClassSpecSupplier, DelegatingBuilder { + companion object { + @JvmStatic + fun enumBuilder(name: String): KotlinEnumClassSpecBuilder = KotlinEnumClassSpecBuilder( + delegate = TypeSpecBuilder.enumBuilder(name) + ) + + @JvmStatic + fun enumBuilder(className: ClassName): KotlinEnumClassSpecBuilder = enumBuilder(className.simpleName) + + } + // companion object :KLogging() { // fun builder(className: ClassName) = KotlinEnumClassSpecBuilder( // delegate = TypeSpecBuilder.enumBuilder(className) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt index 3f1a1f0..ccc2eb8 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -1,6 +1,8 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.MemberName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.FileSpecBuilder import io.toolisticon.kotlin.generation.poet.FileSpecBuilderReceiver @@ -11,7 +13,37 @@ import io.toolisticon.kotlin.generation.spec.KotlinFileSpecSupplier class KotlinFileSpecBuilder internal constructor( private val delegate: FileSpecBuilder ) : BuilderSupplier, KotlinFileSpecSupplier, DelegatingBuilder { + companion object { + @JvmStatic + fun builder( + className: ClassName + ): KotlinFileSpecBuilder = KotlinFileSpecBuilder( + delegate = FileSpecBuilder.builder(className) + ) + @JvmStatic + fun builder( + memberName: MemberName + ): KotlinFileSpecBuilder = KotlinFileSpecBuilder( + delegate = FileSpecBuilder.builder(memberName) + ) + + @JvmStatic + fun builder( + packageName: String, + fileName: String + ): KotlinFileSpecBuilder = KotlinFileSpecBuilder( + delegate = FileSpecBuilder.builder(packageName, fileName) + ) + + @JvmStatic + fun scriptBuilder( + fileName: String, + packageName: String = "" + ): KotlinFileSpecBuilder = KotlinFileSpecBuilder( + delegate = FileSpecBuilder.scriptBuilder(fileName, packageName) + ) + } override fun builder(block: FileSpecBuilderReceiver) = apply { delegate { block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index ccbef81..2222291 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.MemberName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.FunSpecBuilder import io.toolisticon.kotlin.generation.poet.FunSpecBuilderReceiver @@ -13,9 +14,36 @@ class KotlinFunSpecBuilder internal constructor( KotlinFunSpecSupplier, DelegatingBuilder { -//companion object { -// fun builder(name: String) = KotlinFunSpecBuilder(FunSpecBuilder.builder(name)) -// } + companion object { + @JvmStatic + fun builder( + name: String + ): KotlinFunSpecBuilder = KotlinFunSpecBuilder( + delegate = FunSpecBuilder.builder(name) + ) + + @JvmStatic + fun builder( + memberName: MemberName + ): KotlinFunSpecBuilder = KotlinFunSpecBuilder( + delegate = FunSpecBuilder.builder(memberName) + ) + + @JvmStatic + fun constructorBuilder(): KotlinFunSpecBuilder = KotlinFunSpecBuilder( + delegate = FunSpecBuilder.constructorBuilder() + ) + + @JvmStatic + fun getterBuilder(): KotlinFunSpecBuilder = KotlinFunSpecBuilder( + delegate = FunSpecBuilder.getterBuilder() + ) + + @JvmStatic + fun setterBuilder(): KotlinFunSpecBuilder = KotlinFunSpecBuilder( + delegate = FunSpecBuilder.setterBuilder() + ) + } override fun builder(block: FunSpecBuilderReceiver): KotlinFunSpecBuilder = apply { delegate { block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt index 0ce971d..915b3fd 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt @@ -1,5 +1,6 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder @@ -10,11 +11,24 @@ import io.toolisticon.kotlin.generation.spec.KotlinInterfaceSpecSupplier class KotlinInterfaceSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinInterfaceSpecSupplier, DelegatingBuilder { -// companion object { -// fun builder(className: ClassName) = KotlinInterfaceSpecBuilder( -// delegate = TypeSpecBuilder.Companion.interfaceBuilder(className) -// ) -// } + companion object { + @JvmStatic + fun interfaceBuilder(name: String): KotlinInterfaceSpecBuilder = KotlinInterfaceSpecBuilder( + delegate = TypeSpecBuilder.interfaceBuilder(name) + ) + + @JvmStatic + fun interfaceBuilder(className: ClassName): KotlinInterfaceSpecBuilder = interfaceBuilder(className.simpleName) + + @JvmStatic + fun funInterfaceBuilder(name: String): KotlinInterfaceSpecBuilder = KotlinInterfaceSpecBuilder( + delegate = TypeSpecBuilder.funInterfaceBuilder(name) + ) + + @JvmStatic + fun funInterfaceBuilder(className: ClassName): KotlinInterfaceSpecBuilder = funInterfaceBuilder(className.simpleName) + + } override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt index 3bcd375..456a0db 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt @@ -1,5 +1,6 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder @@ -12,6 +13,15 @@ class KotlinObjectSpecBuilder internal constructor( ) : BuilderSupplier, KotlinObjectSpecSupplier, DelegatingBuilder { + companion object { + @JvmStatic + fun objectBuilder(name: String): KotlinObjectSpecBuilder = KotlinObjectSpecBuilder( + delegate = TypeSpecBuilder.objectBuilder(name) + ) + + @JvmStatic + fun objectBuilder(className: ClassName): KotlinObjectSpecBuilder = objectBuilder(className.simpleName) + } // companion object { // fun builder(className: ClassName) = KotlinObjectBuilder( diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt index b35e0b4..735e070 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -1,24 +1,76 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier +import java.lang.reflect.Type +import kotlin.reflect.KClass class KotlinParameterSpecBuilder internal constructor( private val delegate: ParameterSpecBuilder ) : BuilderSupplier, KotlinParameterSpecSupplier, DelegatingBuilder { + companion object { -// companion object { -// fun builder(name: String, type: TypeName) = KotlinParameterSpecBuilder( -// delegate = ParameterSpecBuilder.builder(name, type) -// ) -// } + @JvmStatic + fun builder( + name: String, + type: TypeName, + vararg modifiers: KModifier + ): KotlinParameterSpecBuilder = KotlinParameterSpecBuilder( + delegate = ParameterSpecBuilder.builder(name, type, *modifiers) + ) + + @JvmStatic + fun builder( + name: String, + type: Type, + vararg modifiers: KModifier + ): KotlinParameterSpecBuilder = builder(name, type.asTypeName(), *modifiers) + + @JvmStatic + fun builder( + name: String, + type: KClass<*>, + vararg modifiers: KModifier, + ): KotlinParameterSpecBuilder = KotlinParameterSpecBuilder( + delegate = ParameterSpecBuilder.builder(name, type.asTypeName(), *modifiers) + ) + @JvmStatic + fun builder( + name: String, + type: TypeName, + modifiers: Iterable, + ): KotlinParameterSpecBuilder = KotlinParameterSpecBuilder( + delegate = ParameterSpecBuilder.builder(name, type, modifiers) + ) + + @JvmStatic + fun builder( + name: String, + type: Type, + modifiers: Iterable, + ): KotlinParameterSpecBuilder = KotlinParameterSpecBuilder( + delegate = ParameterSpecBuilder.builder(name, type.asTypeName(), modifiers) + ) + + @JvmStatic + fun builder( + name: String, + type: KClass<*>, + modifiers: Iterable, + ): KotlinParameterSpecBuilder = KotlinParameterSpecBuilder( + delegate = ParameterSpecBuilder.builder(name, type.asTypeName(), modifiers) + ) + } override fun builder(block: ParameterSpecBuilderReceiver) = apply { delegate { block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index e4b926a..f75c516 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -1,11 +1,16 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.PropertySpec +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder import io.toolisticon.kotlin.generation.poet.PropertySpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinPropertySpec import io.toolisticon.kotlin.generation.spec.KotlinPropertySpecSupplier +import java.lang.reflect.Type +import kotlin.reflect.KClass class KotlinPropertySpecBuilder internal constructor( private val delegate: PropertySpecBuilder @@ -13,6 +18,53 @@ class KotlinPropertySpecBuilder internal constructor( KotlinPropertySpecSupplier, DelegatingBuilder { + companion object { + + @JvmStatic + fun builder( + name: String, + type: TypeName, + vararg modifiers: KModifier, + ): KotlinPropertySpecBuilder = KotlinPropertySpecBuilder( + delegate = PropertySpecBuilder.builder(name, type, *modifiers) + ) + + @JvmStatic + fun builder( + name: String, + type: Type, + vararg modifiers: KModifier + ): KotlinPropertySpecBuilder = builder( + name = name, + type = type.asTypeName(), + modifiers = modifiers + ) + + @JvmStatic + fun builder( + name: String, + type: KClass<*>, + vararg modifiers: KModifier + ): KotlinPropertySpecBuilder = builder(name, type.asTypeName(), *modifiers) + + @JvmStatic + fun builder( + name: String, + type: TypeName, + modifiers: Iterable + ): KotlinPropertySpecBuilder = KotlinPropertySpecBuilder( + delegate = PropertySpecBuilder.builder(name, type, modifiers) + ) + + @JvmStatic + fun builder( + name: String, + type: KClass<*>, + modifiers: Iterable + ): KotlinPropertySpecBuilder = KotlinPropertySpecBuilder( + delegate = PropertySpecBuilder.builder(name, type.asTypeName(), modifiers) + ) + } override fun builder(block: PropertySpecBuilderReceiver) = apply { delegate { block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt index 63aae9e..fb5b889 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt @@ -1,11 +1,14 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.TypeAliasSpec +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeAliasSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeAliasSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinTypeAliasSpec import io.toolisticon.kotlin.generation.spec.KotlinTypeAliasSpecSupplier +import kotlin.reflect.KClass class KotlinTypeAliasSpecBuilder internal constructor( private val delegate: TypeAliasSpecBuilder @@ -13,11 +16,21 @@ class KotlinTypeAliasSpecBuilder internal constructor( KotlinTypeAliasSpecSupplier, DelegatingBuilder { -// companion object { -// fun builder(name: String, type: TypeName) = KotlinTypeAliasSpecBuilder( -// delegate = TypeAliasSpecBuilder.builder(name, type) -// ) -// } + companion object { + @JvmStatic + fun builder( + name: String, + type: TypeName + ): KotlinTypeAliasSpecBuilder = KotlinTypeAliasSpecBuilder( + delegate = TypeAliasSpecBuilder.builder(name, type) + ) + + @JvmStatic + fun builder( + name: String, + type: KClass<*> + ): KotlinTypeAliasSpecBuilder = builder(name, type.asTypeName()) + } override fun builder(block: TypeAliasSpecBuilderReceiver) = apply { delegate { block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt index 490a9ca..5d120ce 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder @@ -13,6 +14,28 @@ class KotlinValueClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinValueClassSpecSupplier, DelegatingBuilder { + companion object { + + @JvmStatic + fun builder(name: String): KotlinValueClassSpecBuilder = KotlinValueClassSpecBuilder( + className = ClassName("", name), + delegate = TypeSpecBuilder.classBuilder(name) + ) + + @JvmStatic + fun builder(className: ClassName): KotlinValueClassSpecBuilder = KotlinValueClassSpecBuilder(className) + } + + internal constructor(className: ClassName) : this( + className = className, + delegate = TypeSpecBuilder.classBuilder(className) + ) + + init { + delegate { + addModifiers(KModifier.VALUE) + } + } override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate { block() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt index b11b01e..1b7c806 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt @@ -1,10 +1,27 @@ package io.toolisticon.kotlin.generation.poet import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.ParameterizedTypeName +import com.squareup.kotlinpoet.asClassName +import kotlin.reflect.KClass class AnnotationSpecBuilder( override val builder: AnnotationSpec.Builder ) : PoetSpecBuilder { + companion object { + fun AnnotationSpec.Builder.wrap() = AnnotationSpecBuilder(this) + + @JvmStatic + fun builder(type: ClassName): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() + + @JvmStatic + fun builder(type: ParameterizedTypeName): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() + + + @JvmStatic + fun builder(type: KClass): AnnotationSpecBuilder = builder(type.asClassName()) + } override fun invoke(block: AnnotationSpecBuilderReceiver): AnnotationSpecBuilder = apply { builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt index 55e3043..60d84de 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt @@ -1,10 +1,31 @@ package io.toolisticon.kotlin.generation.poet +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.MemberName +import com.squareup.kotlinpoet.TypeSpec class FileSpecBuilder( override val builder: FileSpec.Builder ) : PoetSpecBuilder { + companion object { + fun FileSpec.Builder.wrap() = FileSpecBuilder(this) + + @JvmStatic + fun get(packageName: String, typeSpec: TypeSpec): FileSpec = FileSpec.get(packageName, typeSpec) + + @JvmStatic + fun builder(className: ClassName): FileSpecBuilder = FileSpec.builder(className).wrap() + + @JvmStatic + fun builder(memberName: MemberName): FileSpecBuilder = FileSpec.builder(memberName).wrap() + + @JvmStatic + fun builder(packageName: String, fileName: String): FileSpecBuilder = FileSpec.builder(packageName, fileName).wrap() + + @JvmStatic + fun scriptBuilder(fileName: String, packageName: String = ""): FileSpecBuilder = FileSpec.scriptBuilder(fileName, packageName).wrap() + } override fun invoke(block: FileSpecBuilderReceiver): FileSpecBuilder = apply { builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt index 2150c02..0b8e332 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt @@ -1,10 +1,30 @@ package io.toolisticon.kotlin.generation.poet import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.MemberName class FunSpecBuilder( override val builder: FunSpec.Builder ) : PoetSpecBuilder { + companion object { + fun FunSpec.Builder.wrap() = FunSpecBuilder(this) + + @JvmStatic + fun builder(name: String): FunSpecBuilder = FunSpec.builder(name).wrap() + + @JvmStatic + fun builder(memberName: MemberName): FunSpecBuilder = FunSpec.builder(memberName).wrap() + + @JvmStatic + fun constructorBuilder(): FunSpecBuilder = FunSpec.constructorBuilder().wrap() + + @JvmStatic + fun getterBuilder(): FunSpecBuilder = FunSpec.getterBuilder().wrap() + + @JvmStatic + fun setterBuilder(): FunSpecBuilder = FunSpec.setterBuilder().wrap() + + } override fun invoke(block: FunSpecBuilderReceiver): FunSpecBuilder = apply { builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt index 387ace8..8a5fc13 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt @@ -1,10 +1,64 @@ package io.toolisticon.kotlin.generation.poet +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.asTypeName +import java.lang.reflect.Type +import kotlin.reflect.KClass class ParameterSpecBuilder( override val builder: ParameterSpec.Builder ) : PoetSpecBuilder { + companion object { + fun ParameterSpec.Builder.wrap() = ParameterSpecBuilder(this) + + + @JvmStatic + fun builder(name: String, type: TypeName, vararg modifiers: KModifier): ParameterSpecBuilder = ParameterSpec.builder(name, type, *modifiers).wrap() + + @JvmStatic + fun builder(name: String, type: Type, vararg modifiers: KModifier): ParameterSpecBuilder = + builder(name, type.asTypeName(), *modifiers) + + @JvmStatic + fun builder( + name: String, + type: KClass<*>, + vararg modifiers: KModifier, + ): ParameterSpecBuilder = ParameterSpec.builder(name, type.asTypeName(), *modifiers).wrap() + + @JvmStatic + fun builder( + name: String, + type: TypeName, + modifiers: Iterable, + ): ParameterSpecBuilder = ParameterSpec.builder(name, type, modifiers).wrap() + + @JvmStatic + fun builder( + name: String, + type: Type, + modifiers: Iterable, + ): ParameterSpecBuilder = ParameterSpec.builder(name, type.asTypeName(), modifiers).wrap() + + @JvmStatic + fun builder( + name: String, + type: KClass<*>, + modifiers: Iterable, + ): ParameterSpecBuilder = ParameterSpec.builder(name, type.asTypeName(), modifiers).wrap() + + @JvmStatic + fun unnamed(type: KClass<*>): ParameterSpec = ParameterSpec.unnamed(type.asTypeName()) + + @JvmStatic + fun unnamed(type: Type): ParameterSpec = ParameterSpec.unnamed(type.asTypeName()) + + @JvmStatic + fun unnamed(type: TypeName): ParameterSpec = ParameterSpec.unnamed(type) + } + override fun invoke(block: ParameterSpecBuilderReceiver): ParameterSpecBuilder = apply { builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt index a4fea4f..6385bae 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt @@ -1,10 +1,41 @@ package io.toolisticon.kotlin.generation.poet +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.PropertySpec +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.asTypeName +import java.lang.reflect.Type +import kotlin.reflect.KClass class PropertySpecBuilder( override val builder: PropertySpec.Builder ) : PoetSpecBuilder { + companion object { + fun PropertySpec.Builder.wrap() = PropertySpecBuilder(builder = this) + + @JvmStatic + fun builder( + name: String, + type: TypeName, + vararg modifiers: KModifier, + ): PropertySpecBuilder = PropertySpec.builder(name, type, *modifiers).wrap() + + @JvmStatic + fun builder(name: String, type: Type, vararg modifiers: KModifier): PropertySpecBuilder = builder( + name = name, + type = type.asTypeName(), + modifiers = modifiers + ) + + @JvmStatic + fun builder(name: String, type: KClass<*>, vararg modifiers: KModifier): PropertySpecBuilder = builder(name, type.asTypeName(), *modifiers) + + @JvmStatic + fun builder(name: String, type: TypeName, modifiers: Iterable): PropertySpecBuilder = PropertySpec.builder(name, type, modifiers).wrap() + + @JvmStatic + fun builder(name: String, type: KClass<*>, modifiers: Iterable): PropertySpecBuilder = PropertySpec.builder(name, type.asTypeName(), modifiers).wrap() + } override fun invoke(block: PropertySpecBuilderReceiver): PropertySpecBuilder = apply { builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt index 16eaf7a..6e66d82 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt @@ -1,11 +1,22 @@ package io.toolisticon.kotlin.generation.poet import com.squareup.kotlinpoet.TypeAliasSpec -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.asTypeName +import kotlin.reflect.KClass class TypeAliasSpecBuilder( override val builder: TypeAliasSpec.Builder ) : PoetSpecBuilder { + companion object { + fun TypeAliasSpec.Builder.wrap() = TypeAliasSpecBuilder(builder = this) + + @JvmStatic + fun builder(name: String, type: TypeName): TypeAliasSpecBuilder = TypeAliasSpec.builder(name, type).wrap() + + @JvmStatic + fun builder(name: String, type: KClass<*>): TypeAliasSpecBuilder = builder(name, type.asTypeName()) + } override fun invoke(block: TypeAliasSpecBuilderReceiver): TypeAliasSpecBuilder = apply { builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt index 661eb70..1586d02 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt @@ -1,10 +1,58 @@ package io.toolisticon.kotlin.generation.poet +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.TypeSpec class TypeSpecBuilder( override val builder: TypeSpec.Builder ) : PoetSpecBuilder { + companion object { + fun TypeSpec.Builder.wrap() = TypeSpecBuilder(builder = this) + + @JvmStatic + fun classBuilder(name: String): TypeSpecBuilder = TypeSpec.classBuilder(name).wrap() + + @JvmStatic + fun classBuilder(className: ClassName): TypeSpecBuilder = classBuilder(className.simpleName) + + @JvmStatic + fun objectBuilder(name: String): TypeSpecBuilder = TypeSpec.objectBuilder(name).wrap() + + @JvmStatic + fun objectBuilder(className: ClassName): TypeSpecBuilder = objectBuilder(className.simpleName) + + @JvmStatic + @JvmOverloads + fun companionObjectBuilder(name: String? = null): TypeSpecBuilder = TypeSpec.companionObjectBuilder(name).wrap() + + @JvmStatic + fun interfaceBuilder(name: String): TypeSpecBuilder = TypeSpec.interfaceBuilder(name).wrap() + + @JvmStatic + fun interfaceBuilder(className: ClassName): TypeSpecBuilder = interfaceBuilder(className.simpleName) + + @JvmStatic + fun funInterfaceBuilder(name: String): TypeSpecBuilder = TypeSpec.funInterfaceBuilder(name).wrap() + + @JvmStatic + fun funInterfaceBuilder(className: ClassName): TypeSpecBuilder = funInterfaceBuilder(className.simpleName) + + @JvmStatic + fun enumBuilder(name: String): TypeSpecBuilder = TypeSpec.enumBuilder(name).wrap() + + @JvmStatic + fun enumBuilder(className: ClassName): TypeSpecBuilder = enumBuilder(className.simpleName) + + @JvmStatic + fun anonymousClassBuilder(): TypeSpecBuilder = TypeSpec.anonymousClassBuilder().wrap() + + @JvmStatic + fun annotationBuilder(name: String): TypeSpecBuilder = TypeSpec.annotationBuilder(name).wrap() + + @JvmStatic + fun annotationBuilder(className: ClassName): TypeSpecBuilder = annotationBuilder(className.simpleName) + } + override fun invoke(block: TypeSpecBuilderReceiver): TypeSpecBuilder = apply { builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt similarity index 61% rename from kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt rename to kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt index 8334dd8..e1723db 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorProperty.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt @@ -2,13 +2,12 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.TypeName -data class KotlinConstructorProperty( +data class KotlinConstructorPropertySpec( val property: KotlinPropertySpec, val parameter: KotlinParameterSpec, -) { // TODO}: ConstructorPropertySupplier { +) : KotlinConstructorPropertySpecSupplier { val name: String = property.name val type: TypeName = property.type - - // TODO override fun get(): KotlinConstructorProperty = this + override fun spec(): KotlinConstructorPropertySpec = this } diff --git a/kotlin-code-generation/src/main/kotlin/spec/_types.kt b/kotlin-code-generation/src/main/kotlin/spec/_types.kt index c4e83a5..61dfdf2 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/_types.kt @@ -33,3 +33,5 @@ interface KotlinEnumClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier interface KotlinObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier interface KotlinValueClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier + +interface KotlinConstructorPropertySpecSupplier : KotlinGeneratorSpecSupplier From e1a763ab7fac49f421a18818a18bbef720b0c2fa Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Wed, 19 Jun 2024 16:42:41 +0200 Subject: [PATCH 10/19] chore: wip --- .../src/_BAK/KotlinFileSpecBuilder.kt | 37 ------------------- .../kotlin/builder/KotlinFileSpecBuilder.kt | 12 ++++++ .../kotlin/builder/KotlinFunSpecBuilder.kt | 8 ++++ .../builder/KotlinParameterSpecBuilder.kt | 8 ++++ .../builder/KotlinPropertySpecBuilder.kt | 7 ++++ 5 files changed, 35 insertions(+), 37 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt diff --git a/kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt deleted file mode 100644 index 0fa5219..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinFileSpecBuilder.kt +++ /dev/null @@ -1,37 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.FileSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.FileSpecBuilder -import io.toolisticon.kotlin.generation._BAK.FileSpecSupplier -import io.toolisticon.kotlin.generation._BAK.KotlinFileSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - - -class KotlinFileSpecBuilder internal constructor( - private val delegate: FileSpecBuilder -) : Builder, FileSpecSupplier { - - companion object { - fun builder(className: ClassName) = KotlinFileSpecBuilder( - delegate = FileSpecBuilder.builder(className) - ) - } - - operator fun invoke(block: FileSpecBuilder.() -> Unit): KotlinFileSpecBuilder = apply { - delegate.block() - } - - fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { - delegate.addType(typeSpecSupplier.get()) - } - - fun addAnnotation(annotationSpec: AnnotationSpec): KotlinFileSpecBuilder = invoke { - addAnnotation(annotationSpec) - } - - override fun build(): KotlinFileSpec = KotlinFileSpec(delegate.build()) - override fun get(): FileSpec = build().get() -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt index ccc2eb8..39fd520 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -1,10 +1,12 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FileSpec import com.squareup.kotlinpoet.MemberName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.FileSpecBuilder +import io.toolisticon.kotlin.generation.poet.FileSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.FileSpecBuilderReceiver import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinFileSpec @@ -43,6 +45,12 @@ class KotlinFileSpecBuilder internal constructor( ): KotlinFileSpecBuilder = KotlinFileSpecBuilder( delegate = FileSpecBuilder.scriptBuilder(fileName, packageName) ) + + @JvmStatic + fun builder(spec: KotlinFileSpec) = builder(spec.get()) + + @JvmStatic + fun builder(spec: FileSpec) = KotlinFileSpecBuilder(delegate = spec.toBuilder().wrap()) } override fun builder(block: FileSpecBuilderReceiver) = apply { @@ -55,6 +63,10 @@ class KotlinFileSpecBuilder internal constructor( } } + fun addAnnotation(annotationSpec: AnnotationSpec): KotlinFileSpecBuilder = builder { + addAnnotation(annotationSpec) + } + override fun build(): KotlinFileSpec { val spec = delegate.build() return KotlinFileSpec(spec = spec) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index 2222291..8eee991 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -4,6 +4,7 @@ import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.MemberName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.FunSpecBuilder +import io.toolisticon.kotlin.generation.poet.FunSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.FunSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinFunSpec import io.toolisticon.kotlin.generation.spec.KotlinFunSpecSupplier @@ -43,6 +44,13 @@ class KotlinFunSpecBuilder internal constructor( fun setterBuilder(): KotlinFunSpecBuilder = KotlinFunSpecBuilder( delegate = FunSpecBuilder.setterBuilder() ) + + + @JvmStatic + fun builder(spec: KotlinFunSpec) = builder(spec.get()) + + @JvmStatic + fun builder(spec: FunSpec) = KotlinFunSpecBuilder(delegate = spec.toBuilder().wrap()) } override fun builder(block: FunSpecBuilderReceiver): KotlinFunSpecBuilder = apply { diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt index 735e070..a598e27 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -6,6 +6,7 @@ import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder +import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier @@ -70,6 +71,13 @@ class KotlinParameterSpecBuilder internal constructor( ): KotlinParameterSpecBuilder = KotlinParameterSpecBuilder( delegate = ParameterSpecBuilder.builder(name, type.asTypeName(), modifiers) ) + + + @JvmStatic + fun builder(spec: KotlinParameterSpec) = builder(spec.get()) + + @JvmStatic + fun builder(spec: ParameterSpec) = KotlinParameterSpecBuilder(delegate = spec.toBuilder().wrap()) } override fun builder(block: ParameterSpecBuilderReceiver) = apply { diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index f75c516..3d387e5 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -6,6 +6,7 @@ import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder +import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.PropertySpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinPropertySpec import io.toolisticon.kotlin.generation.spec.KotlinPropertySpecSupplier @@ -64,6 +65,12 @@ class KotlinPropertySpecBuilder internal constructor( ): KotlinPropertySpecBuilder = KotlinPropertySpecBuilder( delegate = PropertySpecBuilder.builder(name, type.asTypeName(), modifiers) ) + + @JvmStatic + fun builder(spec: KotlinPropertySpec) = builder(spec.get()) + + @JvmStatic + fun builder(spec: PropertySpec) = KotlinPropertySpecBuilder(delegate = spec.toBuilder().wrap()) } override fun builder(block: PropertySpecBuilderReceiver) = apply { From 5f043311ecf2ff727b093be4e6d5d4a4b21565ee Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Thu, 20 Jun 2024 17:39:46 +0200 Subject: [PATCH 11/19] chore: wip --- .../src/_BAK/KotlinValueClassBuilder.kt | 55 ------------ .../src/_BAK/poet/CodeBlockBuilder.kt | 33 ------- .../src/_TEST/KotlinValueClassSpecTest.kt | 26 ------ .../src/main/kotlin/KotlinCodeGeneration.kt | 35 +++++++- .../builder/KotlinAnnotationSpecBuilder.kt | 2 + .../KotlinConstructorPropertySpecBuilder.kt | 36 +++++--- .../kotlin/builder/KotlinFileSpecBuilder.kt | 2 + .../kotlin/builder/KotlinFunSpecBuilder.kt | 8 ++ .../builder/KotlinParameterSpecBuilder.kt | 7 +- .../builder/KotlinPropertySpecBuilder.kt | 3 + .../builder/KotlinValueClassSpecBuilder.kt | 27 +++++- .../main/kotlin/poet/AnnotationSpecBuilder.kt | 15 +++- .../src/main/kotlin/poet/CodeBlockBuilder.kt | 38 +++++++++ .../src/main/kotlin/poet/FileSpecBuilder.kt | 57 +++++++++++-- .../src/main/kotlin/poet/FunSpecBuilder.kt | 85 ++++++++++++++++++- .../main/kotlin/poet/ParameterSpecBuilder.kt | 23 +++-- .../main/kotlin/poet/PropertySpecBuilder.kt | 46 ++++++++-- .../main/kotlin/poet/TypeAliasSpecBuilder.kt | 26 ++++-- .../src/main/kotlin/poet/TypeSpecBuilder.kt | 80 ++++++++++++++++- .../src/main/kotlin/poet/_types.kt | 73 +++++++++++----- .../test/kotlin/KotlinAnnotationClassTest.kt | 10 +++ .../src/test/kotlin/KotlinAnnotationTest.kt | 10 +++ .../test/kotlin/KotlinAnonymousClassTest.kt | 10 +++ .../src/test/kotlin/KotlinClassTest.kt | 10 +++ .../test/kotlin/KotlinCompanionObjectTest.kt | 10 +++ .../kotlin/KotlinConstructorPropertyTest.kt | 10 +++ .../src/test/kotlin/KotlinDataClassTest.kt | 10 +++ .../src/test/kotlin/KotlinEnumClassTest.kt | 10 +++ .../src/test/kotlin/KotlinFileTest.kt | 10 +++ .../src/test/kotlin/KotlinFunTest.kt | 10 +++ .../src/test/kotlin/KotlinInterfaceTest.kt | 10 +++ .../src/test/kotlin/KotlinObjectTest.kt | 10 +++ .../src/test/kotlin/KotlinParameterTest.kt | 10 +++ .../src/test/kotlin/KotlinPropertyTest.kt | 10 +++ .../src/test/kotlin/KotlinTypeAliasTest.kt | 10 +++ .../src/test/kotlin/KotlinValueClassTest.kt | 47 ++++++++++ .../src/test/kotlin/TestFixtures.kt | 4 +- 37 files changed, 687 insertions(+), 191 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt delete mode 100644 kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt create mode 100644 kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinAnonymousClassTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinClassTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinCompanionObjectTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinEnumClassTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinFileTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinFunTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinInterfaceTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinObjectTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinParameterTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinPropertyTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinTypeAliasTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt diff --git a/kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt deleted file mode 100644 index 0b3d0df..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinValueClassBuilder.kt +++ /dev/null @@ -1,55 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.jvm.jvmInline -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.FunSpecBuilder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.ConstructorPropertySupplier -import io.toolisticon.kotlin.generation._BAK.KotlinConstructorProperty -import io.toolisticon.kotlin.generation._BAK.KotlinValueClassSpec - -class KotlinValueClassBuilder( - private val className: ClassName, - private val delegate: TypeSpecBuilder, -) : Builder { - - companion object { - private fun TypeSpecBuilder.init() = apply { - get().addModifiers(KModifier.VALUE) - get().jvmInline() - } - - fun builder(className: ClassName): KotlinValueClassBuilder = KotlinValueClassBuilder( - className = className, - delegate = TypeSpecBuilder.classBuilder(className).init() - ) - } - - lateinit var constructorProperty: KotlinConstructorProperty - - operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinValueClassBuilder = apply { - delegate.block() - } - - fun primaryConstructor(constructorProperty: ConstructorPropertySupplier) = apply { - this.constructorProperty = constructorProperty.get() - - val constructor = FunSpecBuilder.constructorBuilder() - .addParameter(this.constructorProperty.parameter.get()) - .build() - - delegate.addProperty(this.constructorProperty.property.get()) - .primaryConstructor(constructor) - } - - override fun build(): KotlinValueClassSpec { - check(::constructorProperty.isInitialized) { "Value class must have exactly one property." } - - return KotlinValueClassSpec( - className = className, - spec = delegate.build() - ) - } -} diff --git a/kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt b/kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt deleted file mode 100644 index 9a3e043..0000000 --- a/kotlin-code-generation/src/_BAK/poet/CodeBlockBuilder.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.CodeBlock.Builder -import io.toolisticon.kotlin.generation.BuilderSupplier - -typealias CodeBlockBuilderReceiver = CodeBlockBuilder.() -> Unit - -@JvmInline -value class CodeBlockBuilder(private val builder: Builder) : BuilderSupplier { - companion object { - private fun Builder.wrap() = CodeBlockBuilder(this) - fun of(format: String, vararg args: Any?): CodeBlock = CodeBlock.of(format, *args) - fun builder(): CodeBlockBuilder = CodeBlock.builder().wrap() - } - - fun add(format: String, vararg args: Any?): CodeBlockBuilder = apply { builder.add(format, *args) } - fun add(codeBlock: CodeBlock): CodeBlockBuilder = apply { builder.add(codeBlock) } - fun add(builder: CodeBlockBuilder): CodeBlockBuilder = add(builder.build()) - fun addNamed(format: String, arguments: Map): CodeBlockBuilder = apply { builder.addNamed(format, arguments) } - fun addStatement(format: String, vararg args: Any?): CodeBlockBuilder = apply { builder.addStatement(format, *args) } - fun beginControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = apply { builder.beginControlFlow(controlFlow, *args) } - fun clear(): CodeBlockBuilder = apply { builder.clear() } - fun endControlFlow(): CodeBlockBuilder = apply { builder.endControlFlow() } - fun indent(): CodeBlockBuilder = apply { builder.indent() } - fun isEmpty(): Boolean = builder.isEmpty() - fun isNotEmpty(): Boolean = builder.isNotEmpty() - fun nextControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = apply { builder.nextControlFlow(controlFlow, *args) } - fun unindent(): CodeBlockBuilder = apply { builder.unindent() } - - override fun build(): CodeBlock = get().build() - override fun get(): Builder = builder -} diff --git a/kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt b/kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt deleted file mode 100644 index 2eb3ede..0000000 --- a/kotlin-code-generation/src/_TEST/KotlinValueClassSpecTest.kt +++ /dev/null @@ -1,26 +0,0 @@ -package io.toolisticon.kotlin.generation - -import org.junit.jupiter.api.Test - -internal class KotlinValueClassSpecTest { - - @Test - fun `build foo with string value`() { - //val builder = valueClassBuilder_BAK("test","Foo") -// .primaryConstructor( -// constructorPropertyBuilder("bar", String::class.asClassName()) -// .addAnnotation(TestFixtures.myAnnotationSpec) -// ) - - - //val spec = builder.build() - -// assertThat(spec.code.trim()).isEqualTo(""" -// @kotlin.jvm.JvmInline -// public value class Foo( -// @io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation -// public val bar: kotlin.String, -// ) -// """.trimIndent()) - } -} diff --git a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt index dcd2ac4..3871804 100644 --- a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt +++ b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt @@ -1,13 +1,40 @@ package io.toolisticon.kotlin.generation -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME +import io.toolisticon.kotlin.generation.builder.* +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpec +import io.toolisticon.kotlin.generation.spec.KotlinFileSpec +import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec +import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpecSupplier +import kotlin.reflect.KClass object KotlinCodeGeneration { + @JvmStatic + fun annotationBuilder(type: ClassName) = KotlinAnnotationSpecBuilder.builder(type) + + @JvmStatic + fun constructorPropertyBuilder(name: String, type: TypeName) = KotlinConstructorPropertySpecBuilder.builder(name, type) + + @JvmStatic + fun valueClassBuilder(className: ClassName) = KotlinValueClassSpecBuilder.builder(className) + + @JvmStatic + fun buildAnnotation(kclass: KClass<*>, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = buildAnnotation(kclass.asClassName(), block) + + @JvmStatic + fun buildAnnotation(className: ClassName, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = annotationBuilder(className).also(block).build() + + @JvmStatic + fun buildConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = constructorPropertyBuilder(name, type).also(block).build() + + @JvmStatic + fun buildValueClass(className: ClassName, block: KotlinValueClassSpecBuilderReceiver): KotlinValueClassSpec = KotlinValueClassSpecBuilder.builder(className).also(block).build() + + fun toFileSpec(spec: KotlinValueClassSpecSupplier): KotlinFileSpec = spec.spec().let { + KotlinFileSpecBuilder.builder(it.className).addType(it).build() + } // val annotationBuilder = KotlinAnnotationBuilder.builder // val constructorPropertyBuilder = KotlinConstructorPropertyBuilder.builder // val dataClassBuilder = KotlinDataClassSpecBuilder.builder diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt index 2bf6056..7f4a893 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt @@ -53,3 +53,5 @@ class KotlinAnnotationSpecBuilder internal constructor( override fun spec(): KotlinAnnotationSpec = build() override fun get(): AnnotationSpec = build().get() } + +typealias KotlinAnnotationSpecBuilderReceiver = KotlinAnnotationSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt index e06a3af..962f8be 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt @@ -1,7 +1,9 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeName import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier @@ -12,21 +14,24 @@ class KotlinConstructorPropertySpecBuilder internal constructor( private val parameterBuilder: KotlinParameterSpecBuilder ) : Builder, KotlinConstructorPropertySpecSupplier { -// companion object { -// fun builder(name: String, type: TypeName): KotlinConstructorPropertyBuilder = KotlinConstructorPropertyBuilder( -// name = name, -// type = type, -// propertyBuilder = KotlinPropertySpecBuilder.builder(name = name, type = type), -// parameterBuilder = KotlinParameterSpecBuilder.builder(name = name, type = type) -// ) -// } + companion object { + fun builder(name: String, type: TypeName): KotlinConstructorPropertySpecBuilder = KotlinConstructorPropertySpecBuilder( + name = name, + type = type, + propertyBuilder = KotlinPropertySpecBuilder.builder(name = name, type = type), + parameterBuilder = KotlinParameterSpecBuilder.builder(name = name, type = type) + ) + } -// -// fun makePrivate() = apply { -// propertyBuilder.makePrivate() -// } -// -// fun addAnnotation(annotationSpec: AnnotationSpec): KotlinConstructorPropertyBuilder = apply { + fun makePrivate() = apply { + propertyBuilder.builder { + addModifiers(KModifier.PRIVATE) + } + } + + fun addAnnotation(annotationSpec: KotlinAnnotationSpecSupplier) = apply { + parameterBuilder.addAnnotation(annotationSpec) + } // parameterBuilder { // addAnnotation(annotationSpec) // } @@ -45,3 +50,6 @@ class KotlinConstructorPropertySpecBuilder internal constructor( override fun spec(): KotlinConstructorPropertySpec = build() } + + +typealias KotlinConstructorPropertySpecBuilderReceiver = KotlinConstructorPropertySpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt index 39fd520..c2578f5 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -75,3 +75,5 @@ class KotlinFileSpecBuilder internal constructor( override fun spec(): KotlinFileSpec = build() override fun get(): FileSpec = build().get() } + +typealias KotlinFileSpecBuilderReceiver = KotlinFileSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index 8eee991..33eafe4 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -8,6 +8,8 @@ import io.toolisticon.kotlin.generation.poet.FunSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.FunSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinFunSpec import io.toolisticon.kotlin.generation.spec.KotlinFunSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec +import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier class KotlinFunSpecBuilder internal constructor( private val delegate: FunSpecBuilder @@ -53,6 +55,12 @@ class KotlinFunSpecBuilder internal constructor( fun builder(spec: FunSpec) = KotlinFunSpecBuilder(delegate = spec.toBuilder().wrap()) } + fun addParameter(parameter: KotlinParameterSpecSupplier) = apply { + builder { + addParameter(parameter.get()); + } + } + override fun builder(block: FunSpecBuilderReceiver): KotlinFunSpecBuilder = apply { delegate { block() } } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt index a598e27..ef37761 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -8,6 +8,7 @@ import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilderReceiver +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier import java.lang.reflect.Type @@ -85,9 +86,9 @@ class KotlinParameterSpecBuilder internal constructor( } -// fun addAnnotation(annotationSpec: AnnotationSpec): KotlinParameterSpecBuilder = invoke { -// addAnnotation(annotationSpec) -// } + fun addAnnotation(annotationSpec: KotlinAnnotationSpecSupplier): KotlinParameterSpecBuilder = builder { + addAnnotation(annotationSpec.get()) + } override fun build(): KotlinParameterSpec = KotlinParameterSpec(spec = delegate.build()) override fun spec(): KotlinParameterSpec = build() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index 3d387e5..3d7aae1 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -73,6 +73,9 @@ class KotlinPropertySpecBuilder internal constructor( fun builder(spec: PropertySpec) = KotlinPropertySpecBuilder(delegate = spec.toBuilder().wrap()) } + + + override fun builder(block: PropertySpecBuilderReceiver) = apply { delegate { block() } } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt index 5d120ce..c481661 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -3,9 +3,12 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.jvm.jvmInline import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpecSupplier @@ -26,6 +29,9 @@ class KotlinValueClassSpecBuilder internal constructor( fun builder(className: ClassName): KotlinValueClassSpecBuilder = KotlinValueClassSpecBuilder(className) } + lateinit var constructorProperty: KotlinConstructorPropertySpec + + internal constructor(className: ClassName) : this( className = className, delegate = TypeSpecBuilder.classBuilder(className) @@ -34,14 +40,30 @@ class KotlinValueClassSpecBuilder internal constructor( init { delegate { addModifiers(KModifier.VALUE) + jvmInline() } } + fun primaryConstructor(constructorPropertySupplier: KotlinConstructorPropertySpecSupplier) = apply { + this.constructorProperty = constructorPropertySupplier.spec() + + val constructor = KotlinFunSpecBuilder.constructorBuilder() + .addParameter(this.constructorProperty.parameter) + .build() + + delegate { + addProperty(constructorProperty.property.get()) + } + delegate.builder.primaryConstructor(constructor.get()) + } + override fun builder(block: TypeSpecBuilderReceiver) = apply { - delegate { block() } + delegate.builder.block() } override fun build(): KotlinValueClassSpec { + check(::constructorProperty.isInitialized) { "Value class must have exactly one property." } + val spec = delegate.build() return KotlinValueClassSpec(className = className, spec = spec) } @@ -49,3 +71,6 @@ class KotlinValueClassSpecBuilder internal constructor( override fun spec(): KotlinValueClassSpec = build() override fun get(): TypeSpec = build().get() } + +typealias KotlinValueClassSpecBuilderReceiver = KotlinValueClassSpecBuilder.() -> Unit + diff --git a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt index 1b7c806..c545342 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt @@ -1,9 +1,7 @@ package io.toolisticon.kotlin.generation.poet -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.ParameterizedTypeName -import com.squareup.kotlinpoet.asClassName +import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.AnnotationSpec.UseSiteTarget import kotlin.reflect.KClass class AnnotationSpecBuilder( @@ -23,6 +21,14 @@ class AnnotationSpecBuilder( fun builder(type: KClass): AnnotationSpecBuilder = builder(type.asClassName()) } + // Taggable + fun tag(type: KClass<*>, tag: Any?) = invoke { tag(type, tag) } + + // Annotatable + fun addMember(format: String, vararg args: Any) = invoke { addMember(CodeBlock.of(format, *args)) } + fun addMember(codeBlock: CodeBlock) = invoke { addMember(codeBlock) } + fun useSiteTarget(useSiteTarget: UseSiteTarget?) = invoke { useSiteTarget(useSiteTarget) } + override fun invoke(block: AnnotationSpecBuilderReceiver): AnnotationSpecBuilder = apply { builder.block() } @@ -30,4 +36,5 @@ class AnnotationSpecBuilder( override fun build(): AnnotationSpec = builder.build() } +interface AnnotationSpecSupplier : PoetSpecSupplier typealias AnnotationSpecBuilderReceiver = AnnotationSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt new file mode 100644 index 0000000..9a89060 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt @@ -0,0 +1,38 @@ +package io.toolisticon.kotlin.generation.poet + +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.CodeBlock.Builder + + +class CodeBlockBuilder( + override val builder: CodeBlock.Builder +) : PoetSpecBuilder { + companion object { + private fun Builder.wrap() = CodeBlockBuilder(this) + fun of(format: String, vararg args: Any?): CodeBlock = CodeBlock.of(format, *args) + fun builder(): CodeBlockBuilder = CodeBlock.builder().wrap() + } + + fun add(format: String, vararg args: Any?): CodeBlockBuilder = invoke { add(format, *args) } + fun add(codeBlock: CodeBlock): CodeBlockBuilder = invoke { add(codeBlock) } + fun add(builder: CodeBlockBuilder): CodeBlockBuilder = add(builder.build()) + fun addNamed(format: String, arguments: Map): CodeBlockBuilder = invoke { addNamed(format, arguments) } + fun addStatement(format: String, vararg args: Any?): CodeBlockBuilder = invoke { addStatement(format, *args) } + fun beginControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = invoke { beginControlFlow(controlFlow, *args) } + fun clear(): CodeBlockBuilder = invoke { clear() } + fun endControlFlow(): CodeBlockBuilder = invoke { endControlFlow() } + fun indent(): CodeBlockBuilder = invoke { indent() } + fun isEmpty(): Boolean = builder.isEmpty() + fun isNotEmpty(): Boolean = builder.isNotEmpty() + fun nextControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = invoke { nextControlFlow(controlFlow, *args) } + fun unindent(): CodeBlockBuilder = invoke { unindent() } + + override fun invoke(block: Builder.() -> Unit): CodeBlockBuilder = apply { + builder.block() + } + + override fun build(): CodeBlock = builder.build() +} + +interface CodeBlockSupplier : PoetSpecSupplier +typealias CodeBlockBuilderReceiver = CodeBlockBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt index 60d84de..cb6eb5b 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt @@ -1,13 +1,14 @@ package io.toolisticon.kotlin.generation.poet -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.FileSpec -import com.squareup.kotlinpoet.MemberName -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* +import kotlin.reflect.KClass class FileSpecBuilder( override val builder: FileSpec.Builder -) : PoetSpecBuilder { +) : PoetSpecBuilder, + AnnotatableBuilder, + MemberSpecHolderBuilder, + TypeSpecHolderBuilder { companion object { fun FileSpec.Builder.wrap() = FileSpecBuilder(this) @@ -27,11 +28,57 @@ class FileSpecBuilder( fun scriptBuilder(fileName: String, packageName: String = ""): FileSpecBuilder = FileSpec.scriptBuilder(fileName, packageName).wrap() } + // AnnotatableBuilder + override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + + // MemberSpecHolderBuilder + override fun addFunction(funSpec: FunSpec) = invoke { addFunction(funSpec) } + override fun addFunctions(funSpecs: Iterable) = invoke { addFunctions(funSpecs) } + override fun addProperty(propertySpec: PropertySpec) = invoke { addProperty(propertySpec) } + override fun addProperties(propertySpecs: Iterable) = invoke { addProperties(propertySpecs) } + + // TypeSpecHolderBuilder + override fun addType(typeSpec: TypeSpec) = invoke { addType(typeSpec) } + override fun addTypes(typeSpecs: Iterable) = invoke { addTypes(typeSpecs) } + + + fun addFileComment(format: String, vararg args: Any) = invoke { addFileComment(format, *args) } + fun clearComment(): FileSpecBuilder = invoke { clearComment() } + fun addTypeAlias(typeAliasSpec: TypeAliasSpec): FileSpecBuilder = invoke { addTypeAlias(typeAliasSpec) } + fun addImport(constant: Enum<*>): FileSpecBuilder = invoke { addImport(constant) } + fun addImport(kclass: KClass<*>, vararg names: String): FileSpecBuilder = invoke { addImport(kclass, *names) } + fun addImport(className: ClassName, vararg names: String): FileSpecBuilder = invoke { addImport(className, *names) } + fun addImport(kclass: KClass<*>, names: Iterable): FileSpecBuilder = invoke { addImport(kclass, names) } + fun addImport(className: ClassName, names: Iterable): FileSpecBuilder = invoke { addImport(className, names) } + fun addImport(packageName: String, vararg names: String): FileSpecBuilder = invoke { addImport(packageName, *names) } + fun addImport(packageName: String, names: Iterable): FileSpecBuilder = invoke { addImport(packageName, names) } + fun addImport(import: Import): FileSpecBuilder = invoke { addImport(import) } + fun clearImports(): FileSpecBuilder = invoke { clearImports() } + fun addAliasedImport(kclass: KClass<*>, alias: String): FileSpecBuilder = invoke { addAliasedImport(kclass, alias) } + fun addAliasedImport(className: ClassName, alias: String): FileSpecBuilder = invoke { addAliasedImport(className, alias) } + fun addAliasedImport(className: ClassName, memberName: String, alias: String): FileSpecBuilder = invoke { addAliasedImport(className, memberName, alias) } + fun addAliasedImport(memberName: MemberName, alias: String): FileSpecBuilder = invoke { addAliasedImport(memberName, alias) } + fun addDefaultPackageImport(packageName: String): FileSpecBuilder = invoke { addDefaultPackageImport(packageName) } + fun addKotlinDefaultImports(includeJvm: Boolean = true, includeJs: Boolean = true): FileSpecBuilder = invoke { addKotlinDefaultImports(includeJvm, includeJs) } + fun indent(indent: String): FileSpecBuilder = invoke { indent(indent) } + fun addCode(format: String, vararg args: Any?): FileSpecBuilder = invoke { addCode(format, *args) } + fun addNamedCode(format: String, args: Map): FileSpecBuilder = invoke { addNamedCode(format, args) } + fun addCode(codeBlock: CodeBlock): FileSpecBuilder = invoke { addCode(codeBlock) } + fun addBodyComment(format: String, vararg args: Any): FileSpecBuilder = invoke { addBodyComment(format, *args) } + fun beginControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = invoke { beginControlFlow(controlFlow, *args) } + fun nextControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = invoke { nextControlFlow(controlFlow, *args) } + fun endControlFlow(): FileSpecBuilder = invoke { endControlFlow() } + fun addStatement(format: String, vararg args: Any): FileSpecBuilder = invoke { addStatement(format, *args) } + fun clearBody(): FileSpecBuilder = invoke { clearBody() } + override fun invoke(block: FileSpecBuilderReceiver): FileSpecBuilder = apply { builder.block() } override fun build(): FileSpec = builder.build() + } +interface FileSpecSupplier : PoetSpecSupplier typealias FileSpecBuilderReceiver = FileSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt index 0b8e332..5b495fa 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt @@ -1,11 +1,17 @@ package io.toolisticon.kotlin.generation.poet -import com.squareup.kotlinpoet.FunSpec -import com.squareup.kotlinpoet.MemberName +import com.squareup.kotlinpoet.* +import javax.lang.model.element.Element +import javax.lang.model.element.Modifier +import kotlin.reflect.KClass class FunSpecBuilder( override val builder: FunSpec.Builder -) : PoetSpecBuilder { +) : PoetSpecBuilder, + AnnotatableBuilder, + ContextReceivableBuilder, + DocumentableBuilder, + OriginatingElementsHolderBuilder { companion object { fun FunSpec.Builder.wrap() = FunSpecBuilder(this) @@ -26,6 +32,78 @@ class FunSpecBuilder( } + // AnnotatableBuilder + override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + + // ContextReceiverBuilder + @ExperimentalKotlinPoetApi + override fun contextReceivers(receiverTypes: Iterable) = invoke { contextReceivers(receiverTypes) } + + @ExperimentalKotlinPoetApi + override fun contextReceivers(vararg receiverTypes: TypeName) = invoke { contextReceivers(*receiverTypes) } + + // DocumentableBuilder + override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + + // OriginatingElementBuilder + override fun addOriginatingElement(originatingElement: Element) = invoke { addOriginatingElement(originatingElement) } + + // FunSpecBuilder + + fun addModifiers(vararg modifiers: KModifier): FunSpecBuilder = invoke { addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): FunSpecBuilder = invoke { addModifiers(modifiers) } + + fun jvmModifiers(modifiers: Iterable) = builder.jvmModifiers(modifiers) + + fun addTypeVariables(typeVariables: Iterable): FunSpecBuilder = invoke { addTypeVariables(typeVariables) } + + fun addTypeVariable(typeVariable: TypeVariableName): FunSpecBuilder = invoke { addTypeVariable(typeVariable) } + + fun receiver(receiverType: TypeName): FunSpecBuilder = invoke { receiver(receiverType) } + fun receiver(receiverType: TypeName, kdoc: CodeBlock): FunSpecBuilder = invoke { receiver(receiverType, kdoc) } + + fun receiver(receiverType: KClass<*>): FunSpecBuilder = invoke { receiver(receiverType) } + fun receiver(receiverType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = invoke { receiver(receiverType, kdoc) } + + fun receiver(receiverType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = invoke { receiver(receiverType, kdoc, *args) } + + fun returns(returnType: TypeName): FunSpecBuilder = invoke { returns(returnType) } + fun returns(returnType: TypeName, kdoc: CodeBlock): FunSpecBuilder = invoke { returns(returnType, kdoc) } + + fun returns(returnType: KClass<*>): FunSpecBuilder = invoke { returns(returnType) } + fun returns(returnType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = invoke { returns(returnType, kdoc) } + + fun returns(returnType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = invoke { returns(returnType, kdoc, *args) } + + fun addParameters(parameterSpecs: Iterable): FunSpecBuilder = invoke { addParameters(parameterSpecs) } + fun addParameter(parameterSpec: ParameterSpec): FunSpecBuilder = invoke { addParameter(parameterSpec) } + fun callThisConstructor(args: List): FunSpecBuilder = invoke { callThisConstructor(args) } + + fun callThisConstructor(args: Iterable): FunSpecBuilder = invoke { callThisConstructor(args) } + fun callThisConstructor(vararg args: String): FunSpecBuilder = invoke { callThisConstructor(*args) } + fun callThisConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = invoke { callThisConstructor(*args) } + fun callSuperConstructor(args: Iterable): FunSpecBuilder = invoke { callSuperConstructor(args) } + fun callSuperConstructor(args: List): FunSpecBuilder = invoke { callSuperConstructor(args) } + fun callSuperConstructor(vararg args: String): FunSpecBuilder = invoke { callSuperConstructor(*args) } + fun callSuperConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = invoke { callSuperConstructor(*args) } + fun addParameter(name: String, type: TypeName, vararg modifiers: KModifier): FunSpecBuilder = invoke { addParameter(name, type, *modifiers) } + fun addParameter(name: String, type: KClass<*>, vararg modifiers: KModifier): FunSpecBuilder = invoke { addParameter(name, type, *modifiers) } + fun addParameter(name: String, type: TypeName, modifiers: Iterable): FunSpecBuilder = invoke { addParameter(name, type, modifiers) } + fun addParameter(name: String, type: KClass<*>, modifiers: Iterable): FunSpecBuilder = invoke { addParameter(name, type, modifiers) } + fun addCode(format: String, vararg args: Any?): FunSpecBuilder = invoke { addCode(format, *args) } + fun addNamedCode(format: String, args: Map): FunSpecBuilder = invoke { addNamedCode(format, args) } + fun addCode(codeBlock: CodeBlock): FunSpecBuilder = invoke { addCode(codeBlock) } + fun addComment(format: String, vararg args: Any): FunSpecBuilder = invoke { addComment(format, *args) } + + fun beginControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = invoke { beginControlFlow(controlFlow, *args) } + fun nextControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = invoke { nextControlFlow(controlFlow, *args) } + fun endControlFlow(): FunSpecBuilder = invoke { endControlFlow() } + fun addStatement(format: String, vararg args: Any): FunSpecBuilder = invoke { addStatement(format, *args) } + + fun clearBody(): FunSpecBuilder = invoke { clearBody() } + override fun invoke(block: FunSpecBuilderReceiver): FunSpecBuilder = apply { builder.block() } @@ -33,4 +111,5 @@ class FunSpecBuilder( override fun build(): FunSpec = builder.build() } +interface FunSpecSupplier : PoetSpecSupplier typealias FunSpecBuilderReceiver = FunSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt index 8a5fc13..32f28f2 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt @@ -1,15 +1,14 @@ package io.toolisticon.kotlin.generation.poet -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.ParameterSpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asTypeName +import com.squareup.kotlinpoet.* import java.lang.reflect.Type import kotlin.reflect.KClass class ParameterSpecBuilder( override val builder: ParameterSpec.Builder -) : PoetSpecBuilder { +) : PoetSpecBuilder, + AnnotatableBuilder, + DocumentableBuilder { companion object { fun ParameterSpec.Builder.wrap() = ParameterSpecBuilder(this) @@ -60,6 +59,19 @@ class ParameterSpecBuilder( } + // AnnotatableBuilder + override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + + // DocumentableBuilder + override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + + fun addModifiers(vararg modifiers: KModifier): ParameterSpecBuilder = invoke { addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): ParameterSpecBuilder = invoke { addModifiers(modifiers) } + fun defaultValue(format: String, vararg args: Any?): ParameterSpecBuilder = invoke { defaultValue(format, *args) } + fun defaultValue(codeBlock: CodeBlock?): ParameterSpecBuilder = invoke { defaultValue(codeBlock) } + override fun invoke(block: ParameterSpecBuilderReceiver): ParameterSpecBuilder = apply { builder.block() } @@ -67,5 +79,6 @@ class ParameterSpecBuilder( override fun build(): ParameterSpec = builder.build() } +interface ParameterSpecSupplier : PoetSpecSupplier typealias ParameterSpecBuilderReceiver = ParameterSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt index 6385bae..1c1ff58 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt @@ -1,15 +1,17 @@ package io.toolisticon.kotlin.generation.poet -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.PropertySpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asTypeName +import com.squareup.kotlinpoet.* import java.lang.reflect.Type +import javax.lang.model.element.Element import kotlin.reflect.KClass class PropertySpecBuilder( override val builder: PropertySpec.Builder -) : PoetSpecBuilder { +) : PoetSpecBuilder, + AnnotatableBuilder, + ContextReceivableBuilder, + DocumentableBuilder, + OriginatingElementsHolderBuilder { companion object { fun PropertySpec.Builder.wrap() = PropertySpecBuilder(builder = this) @@ -37,6 +39,39 @@ class PropertySpecBuilder( fun builder(name: String, type: KClass<*>, modifiers: Iterable): PropertySpecBuilder = PropertySpec.builder(name, type.asTypeName(), modifiers).wrap() } + + // AnnotatableBuilder + override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + + // ContextReceiverBuilder + @ExperimentalKotlinPoetApi + override fun contextReceivers(receiverTypes: Iterable) = invoke { contextReceivers(receiverTypes) } + + @ExperimentalKotlinPoetApi + override fun contextReceivers(vararg receiverTypes: TypeName) = invoke { contextReceivers(*receiverTypes) } + + // DocumentableBuilder + override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + + // OriginatingElementBuilder + override fun addOriginatingElement(originatingElement: Element) = invoke { addOriginatingElement(originatingElement) } + + fun mutable(mutable: Boolean = true): PropertySpecBuilder = invoke { mutable(mutable) } + fun addModifiers(vararg modifiers: KModifier): PropertySpecBuilder = invoke { addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): PropertySpecBuilder = invoke { addModifiers(modifiers) } + fun addTypeVariables(typeVariables: Iterable): PropertySpecBuilder = invoke { addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName): PropertySpecBuilder = invoke { addTypeVariable(typeVariable) } + fun initializer(format: String, vararg args: Any?): PropertySpecBuilder = invoke { initializer(format, *args) } + fun initializer(codeBlock: CodeBlock?): PropertySpecBuilder = invoke { initializer(codeBlock) } + fun delegate(format: String, vararg args: Any?): PropertySpecBuilder = invoke { delegate(format, *args) } + fun delegate(codeBlock: CodeBlock): PropertySpecBuilder = invoke { delegate(codeBlock) } + fun getter(getter: FunSpec?): PropertySpecBuilder = invoke { getter(getter) } + fun setter(setter: FunSpec?): PropertySpecBuilder = invoke { setter(setter) } + fun receiver(receiverType: TypeName?): PropertySpecBuilder = invoke { receiver(receiverType) } + fun receiver(receiverType: KClass<*>): PropertySpecBuilder = invoke { receiver(receiverType) } + override fun invoke(block: PropertySpecBuilderReceiver): PropertySpecBuilder = apply { builder.block() } @@ -44,4 +79,5 @@ class PropertySpecBuilder( override fun build(): PropertySpec = builder.build() } +interface PropertySpecSupplier : PoetSpecSupplier typealias PropertySpecBuilderReceiver = PropertySpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt index 6e66d82..a9a51e7 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt @@ -1,13 +1,13 @@ package io.toolisticon.kotlin.generation.poet -import com.squareup.kotlinpoet.TypeAliasSpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asTypeName +import com.squareup.kotlinpoet.* import kotlin.reflect.KClass class TypeAliasSpecBuilder( override val builder: TypeAliasSpec.Builder -) : PoetSpecBuilder { +) : PoetSpecBuilder, + AnnotatableBuilder, + DocumentableBuilder { companion object { fun TypeAliasSpec.Builder.wrap() = TypeAliasSpecBuilder(builder = this) @@ -18,11 +18,23 @@ class TypeAliasSpecBuilder( fun builder(name: String, type: KClass<*>): TypeAliasSpecBuilder = builder(name, type.asTypeName()) } - override fun invoke(block: TypeAliasSpecBuilderReceiver): TypeAliasSpecBuilder = apply { - builder.block() - } + // AnnotatableBuilder + override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + + // DocumentableBuilder + override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + + fun addModifiers(vararg modifiers: KModifier): TypeAliasSpecBuilder = invoke { addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): TypeAliasSpecBuilder = invoke { addModifiers(modifiers) } + fun addTypeVariables(typeVariables: Iterable): TypeAliasSpecBuilder = invoke { addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName): TypeAliasSpecBuilder = invoke { addTypeVariable(typeVariable) } + + override fun invoke(block: TypeAliasSpecBuilderReceiver): TypeAliasSpecBuilder = apply { builder.block() } override fun build(): TypeAliasSpec = builder.build() } +interface TypeAliasSpecSupplier : PoetSpecSupplier typealias TypeAliasSpecBuilderReceiver = TypeAliasSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt index 1586d02..96c0d73 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt @@ -1,11 +1,31 @@ package io.toolisticon.kotlin.generation.poet -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec - +import com.squareup.kotlinpoet.* +import javax.lang.model.element.Element +import kotlin.reflect.KClass + +/** + * TypeSpec includes: + * + * * AnnotationClassSpec + * * AnonymousClassSpec + * * ClassSpec + * * CompanionObjectSpec + * * DataClassSpec + * * EnumClassSpec + * * InterfaceSpec + * * ObjectSpec + * * ValueClassSpec + */ class TypeSpecBuilder( override val builder: TypeSpec.Builder -) : PoetSpecBuilder { +) : PoetSpecBuilder, + AnnotatableBuilder, + ContextReceivableBuilder, + DocumentableBuilder, + MemberSpecHolderBuilder, + OriginatingElementsHolderBuilder, + TypeSpecHolderBuilder { companion object { fun TypeSpec.Builder.wrap() = TypeSpecBuilder(builder = this) @@ -54,6 +74,57 @@ class TypeSpecBuilder( } + // AnnotatableBuilder + override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + + // DocumentableBuilder + override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + + // ContextReceiverBuilder + @ExperimentalKotlinPoetApi + override fun contextReceivers(receiverTypes: Iterable) = invoke { contextReceivers(receiverTypes) } + + @ExperimentalKotlinPoetApi + override fun contextReceivers(vararg receiverTypes: TypeName) = invoke { contextReceivers(*receiverTypes) } + + // MemberSpecHolderBuilder + override fun addFunction(funSpec: FunSpec) = invoke { addFunction(funSpec) } + override fun addFunctions(funSpecs: Iterable) = invoke { addFunctions(funSpecs) } + override fun addProperty(propertySpec: PropertySpec) = invoke { addProperty(propertySpec) } + override fun addProperties(propertySpecs: Iterable) = invoke { addProperties(propertySpecs) } + + // OriginatingElementBuilder + override fun addOriginatingElement(originatingElement: Element) = invoke { addOriginatingElement(originatingElement) } + + // TypeSpecHolderBuilder + override fun addType(typeSpec: TypeSpec) = invoke { addType(typeSpec) } + override fun addTypes(typeSpecs: Iterable) = invoke { addTypes(typeSpecs) } + + + fun addModifiers(vararg modifiers: KModifier): TypeSpecBuilder = invoke { addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): TypeSpecBuilder = invoke { addModifiers(modifiers) } + fun addTypeVariables(typeVariables: Iterable): TypeSpecBuilder = invoke { addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName): TypeSpecBuilder = invoke { addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpec?): TypeSpecBuilder = invoke { primaryConstructor(primaryConstructor) } + fun superclass(superclass: TypeName): TypeSpecBuilder = invoke { superclass(superclass) } + fun superclass(superclass: KClass<*>): TypeSpecBuilder = invoke { superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any): TypeSpecBuilder = invoke { addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock): TypeSpecBuilder = invoke { addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable): TypeSpecBuilder = invoke { addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName): TypeSpecBuilder = invoke { addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock): TypeSpecBuilder = invoke { addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>): TypeSpecBuilder = invoke { addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock): TypeSpecBuilder = invoke { addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String): TypeSpecBuilder = invoke { addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String): TypeSpecBuilder = invoke { addSuperinterface(superinterface, constructorParameter) } + + fun addEnumConstant(name: String, typeSpec: TypeSpec = TypeSpec.anonymousClassBuilder().build()): TypeSpecBuilder = invoke { addEnumConstant(name, typeSpec) } + fun addInitializerBlock(block: CodeBlock): TypeSpecBuilder = invoke { addInitializerBlock(block) } + override fun invoke(block: TypeSpecBuilderReceiver): TypeSpecBuilder = apply { builder.block() } @@ -61,4 +132,5 @@ class TypeSpecBuilder( override fun build(): TypeSpec = builder.build() } +interface TypeSpecSupplier : PoetSpecSupplier typealias TypeSpecBuilderReceiver = TypeSpec.Builder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/poet/_types.kt b/kotlin-code-generation/src/main/kotlin/poet/_types.kt index 48bfd9b..fe6119e 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/_types.kt @@ -3,6 +3,8 @@ package io.toolisticon.kotlin.generation.poet import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.Builder import java.util.function.Supplier +import javax.lang.model.element.Element +import kotlin.reflect.KClass /** * Unfortunately, kotlin-poet specs do not share a common interface, this alias simulates that. @@ -14,35 +16,64 @@ typealias PoetSpec = Any * exposes this by implementing this interface. */ interface PoetSpecSupplier : Supplier -interface AnnotationSpecSupplier : PoetSpecSupplier -interface FileSpecSupplier : PoetSpecSupplier -interface FunSpecSupplier : PoetSpecSupplier -interface ParameterSpecSupplier : PoetSpecSupplier -interface PropertySpecSupplier : PoetSpecSupplier -interface TypeAliasSpecSupplier : PoetSpecSupplier -/** - * TypeSpec includes: - * - * * AnnotationClassSpec - * * AnonymousClassSpec - * * ClassSpec - * * CompanionObjectSpec - * * DataClassSpec - * * EnumClassSpec - * * InterfaceSpec - * * ObjectSpec - * * ValueClassSpec - */ -interface TypeSpecSupplier : PoetSpecSupplier /** * Unfortunately, kotlin-poet spec-builders do not share a common interface, this interface simulates that. */ -sealed interface PoetSpecBuilder, BUILDER, SPEC : PoetSpec, SUPPLIER:PoetSpecSupplier> : Builder, PoetSpecSupplier { +sealed interface PoetSpecBuilder, BUILDER, SPEC : PoetSpec, SUPPLIER : PoetSpecSupplier> : Builder, PoetSpecSupplier { val builder: BUILDER operator fun invoke(block: BUILDER.() -> Unit): SELF override fun get(): SPEC = build() } + +sealed interface AnnotatableBuilder { + + fun addAnnotation(annotationSpec: AnnotationSpec): SELF + + fun addAnnotations(annotationSpecs: Iterable): SELF + + fun addAnnotation(annotation: ClassName): SELF = addAnnotation(AnnotationSpec.builder(annotation).build()) + + fun addAnnotation(annotation: KClass<*>): SELF = addAnnotation(annotation.asClassName()) + +} + +sealed interface TypeSpecHolderBuilder { + fun addType(typeSpec: TypeSpec): SELF + + fun addTypes(typeSpecs: Iterable): SELF +} + +sealed interface MemberSpecHolderBuilder { + fun addFunction(funSpec: FunSpec): SELF + fun addFunctions(funSpecs: Iterable): SELF + + fun addProperties(propertySpecs: Iterable): SELF + fun addProperty(propertySpec: PropertySpec): SELF + + fun addProperty(name: String, type: TypeName, vararg modifiers: KModifier) = addProperty(PropertySpec.builder(name, type, *modifiers).build()) + fun addProperty(name: String, type: KClass<*>, vararg modifiers: KModifier) = addProperty(name, type.asTypeName(), *modifiers) + fun addProperty(name: String, type: TypeName, modifiers: Iterable) = addProperty(PropertySpec.builder(name, type, modifiers).build()) + fun addProperty(name: String, type: KClass<*>, modifiers: Iterable) = addProperty(name, type.asTypeName(), modifiers) +} + +sealed interface OriginatingElementsHolderBuilder { + fun addOriginatingElement(originatingElement: Element): SELF +} + +sealed interface ContextReceivableBuilder { + + @ExperimentalKotlinPoetApi + fun contextReceivers(receiverTypes: Iterable): SELF + + @ExperimentalKotlinPoetApi + fun contextReceivers(vararg receiverTypes: TypeName): SELF +} + +sealed interface DocumentableBuilder { + fun addKdoc(format: String, vararg args: Any): SELF + fun addKdoc(block: CodeBlock): SELF +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt new file mode 100644 index 0000000..a1583cd --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinAnnotationClassTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt new file mode 100644 index 0000000..11ce986 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinAnnotationTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnonymousClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinAnonymousClassTest.kt new file mode 100644 index 0000000..5a4543e --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinAnonymousClassTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinAnonymousClassTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinClassTest.kt new file mode 100644 index 0000000..6ba95b4 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinClassTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinClassTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinCompanionObjectTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinCompanionObjectTest.kt new file mode 100644 index 0000000..4e80eec --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinCompanionObjectTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinCompanionObjectTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt new file mode 100644 index 0000000..487f955 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinConstructorPropertyTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt new file mode 100644 index 0000000..06c2db6 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinDataClassTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinEnumClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinEnumClassTest.kt new file mode 100644 index 0000000..b45cc54 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinEnumClassTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinEnumClassTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinFileTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinFileTest.kt new file mode 100644 index 0000000..56ceb3f --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinFileTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinFileTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinFunTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinFunTest.kt new file mode 100644 index 0000000..c74a27b --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinFunTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinFunTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinInterfaceTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinInterfaceTest.kt new file mode 100644 index 0000000..14b3c1b --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinInterfaceTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinInterfaceTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinObjectTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinObjectTest.kt new file mode 100644 index 0000000..2358c1a --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinObjectTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinObjectTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinParameterTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinParameterTest.kt new file mode 100644 index 0000000..511b6af --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinParameterTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinParameterTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinPropertyTest.kt new file mode 100644 index 0000000..0fea7e7 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinPropertyTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinPropertyTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinTypeAliasTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinTypeAliasTest.kt new file mode 100644 index 0000000..26aec08 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinTypeAliasTest.kt @@ -0,0 +1,10 @@ +package io.toolisticon.kotlin.generation + +import org.junit.jupiter.api.Test + +internal class KotlinTypeAliasTest { + @Test + fun name() { + TODO("Not yet implemented") + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt new file mode 100644 index 0000000..47a6f63 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt @@ -0,0 +1,47 @@ +package io.toolisticon.kotlin.generation + +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.asTypeName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildValueClass +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.toFileSpec +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +internal class KotlinValueClassTest { + + @Test + fun `build foo with string value`() { + val className = ClassName("test", "Foo") + val valueClass = buildValueClass(className = className) { + primaryConstructor(buildConstructorProperty("bar", String::class.asTypeName()) { + makePrivate() + addAnnotation(TestFixtures.myAnnotationSpec) + }) + } + //val builder = valueClassBuilder_BAK("test","Foo") +// .primaryConstructor( +// constructorPropertyBuilder("bar", String::class.asClassName()) +// .addAnnotation(TestFixtures.myAnnotationSpec) +// ) + + print(toFileSpec(valueClass).get().toString()) + + + //val spec = builder.build() + + assertThat(toFileSpec(valueClass).get().toString().trim()).isEqualTo( + """package test + +import io.toolisticon.kotlin.generation.TestFixtures +import kotlin.String +import kotlin.jvm.JvmInline + +@JvmInline +public value class Foo( + @TestFixtures.MyAnnotation + private val bar: String, +)""" + ) + } +} diff --git a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt index 60afbb7..7ce0b8e 100644 --- a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt +++ b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt @@ -1,10 +1,12 @@ package io.toolisticon.kotlin.generation +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation + object TestFixtures { @Target(AnnotationTarget.VALUE_PARAMETER) annotation class MyAnnotation() -// val myAnnotationSpec = buildAnnotation(MyAnnotation::class.asClassName()) {} + val myAnnotationSpec = buildAnnotation(MyAnnotation::class) } From 358bc03254eadb1837d20da403854888de5048df Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Fri, 21 Jun 2024 07:38:05 +0200 Subject: [PATCH 12/19] replace invoke --- kotlin-code-generation/src/_BAK/_builder.kt | 110 ------------------ kotlin-code-generation/src/_BAK/_facet.kt | 26 ----- kotlin-code-generation/src/_BAK/_spec.kt | 33 ------ .../src/_BAK/bak/AnnotatableSpecBuilder.kt | 9 -- .../src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt | 39 ------- .../_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt | 29 ----- .../bak/KotlinPoetNamedTypeSpecBuilder.kt | 14 --- .../src/_BAK/bak/SpecBuilder.kt | 8 -- .../src/_BAK/bak/ToKotlinPoetSpecBuilder.kt | 6 - .../_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt | 10 -- .../src/_BAK/poet/AnnotatableBuilder.kt | 12 -- .../src/_BAK/poet/ContextReceivableBuilder.kt | 12 -- .../src/_BAK/poet/DocumentableBuilder.kt | 12 -- .../src/_BAK/poet/KModifierHolderBuilder.kt | 19 --- .../src/_BAK/poet/MemberSpecHolderBuilder.kt | 20 ---- .../poet/OriginatingElementsHolderBuilder.kt | 10 -- .../builder/KotlinAnnotationSpecBuilder.kt | 10 +- .../builder/KotlinDataClassSpecBuilder.kt | 20 ++-- .../builder/KotlinEnumClassSpecBuilder.kt | 4 +- .../kotlin/builder/KotlinFileSpecBuilder.kt | 6 +- .../kotlin/builder/KotlinFunSpecBuilder.kt | 3 +- .../kotlin/builder/KotlinObjectSpecBuilder.kt | 2 +- .../builder/KotlinParameterSpecBuilder.kt | 3 +- .../builder/KotlinPropertySpecBuilder.kt | 2 +- .../builder/KotlinTypeAliasSpecBuilder.kt | 2 +- .../builder/KotlinValueClassSpecBuilder.kt | 10 +- .../main/kotlin/poet/AnnotationSpecBuilder.kt | 11 +- .../src/main/kotlin/poet/CodeBlockBuilder.kt | 24 ++-- .../src/main/kotlin/poet/FileSpecBuilder.kt | 81 ++++++------- .../src/main/kotlin/poet/FunSpecBuilder.kt | 92 +++++++-------- .../main/kotlin/poet/ParameterSpecBuilder.kt | 20 ++-- .../main/kotlin/poet/PropertySpecBuilder.kt | 47 ++++---- .../main/kotlin/poet/TypeAliasSpecBuilder.kt | 17 ++- .../src/main/kotlin/poet/TypeSpecBuilder.kt | 77 ++++++------ .../src/main/kotlin/poet/_types.kt | 3 - .../kotlin/spec/KotlinAnnotationClassSpec.kt | 1 + .../main/kotlin/spec/KotlinAnnotationSpec.kt | 3 +- .../src/main/kotlin/spec/_types.kt | 3 +- .../src/test/kotlin/KotlinAnnotationTest.kt | 62 +++++++++- .../src/test/kotlin/KotlinValueClassTest.kt | 12 +- .../src/test/kotlin/TestFixtures.kt | 6 +- 41 files changed, 272 insertions(+), 618 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/_builder.kt delete mode 100644 kotlin-code-generation/src/_BAK/_facet.kt delete mode 100644 kotlin-code-generation/src/_BAK/_spec.kt delete mode 100644 kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt diff --git a/kotlin-code-generation/src/_BAK/_builder.kt b/kotlin-code-generation/src/_BAK/_builder.kt deleted file mode 100644 index 4ba9f11..0000000 --- a/kotlin-code-generation/src/_BAK/_builder.kt +++ /dev/null @@ -1,110 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.* -import io.toolisticon.kotlin.generation._BAK.* -import kotlin.reflect.KClass - -fun interface Builder { - fun build(): T -} - -/** - * Self-Type implementation of the root Spec builder. This is needed, because: a) we want implementing builders - * to return an instance of themselves, so we can type-safe and fluently build products. - * And b) because unfortunately kotlin-poet does not provide common super-types for specs and builders. - * - * @param SELF concrete instance of this builder to return in implementing classes. - * @param PRODUCT the [KotlinPoetSpec] type returned by this builder. - * @param SPEC the kotlin poet spec the [PRODUCT] refers to. - * @param SPEC_BUILDER the specific kotlin poet builder used to modify [PRODUCT]. - * @param delegate provide an instance of the specific builder - */ -sealed class KotlinPoetSpecBuilder< - SELF : KotlinPoetSpecBuilder, - PRODUCT : KotlinPoetSpec, - SPEC : Any, - SPEC_BUILDER : Any - >( - protected val delegate: SPEC_BUILDER -) : Builder { - - @Suppress("UNCHECKED_CAST") - protected fun applySelf(block: SELF.() -> Unit): SELF = (this as SELF).apply { - block() - } - - /** - * Directly invoke underlying builder to support all build-in features. - */ - operator fun invoke(block: SPEC_BUILDER.() -> Unit): SELF = applySelf { - delegate.block() - } - - abstract override fun build(): PRODUCT -} - -sealed class KotlinPoetTypeSpecBuilder( - delegate: TypeSpec.Builder -) : KotlinPoetSpecBuilder, T, TypeSpec, TypeSpec.Builder>( - delegate = delegate -), TypeSpecSupplier, KotlinAnnotatableBuilder, T, TypeSpec, TypeSpec.Builder>> { - - override fun addAnnotation(annotationSpec: AnnotationSpec) = applySelf { - delegate.addAnnotation(annotationSpec) - } - - override fun get(): TypeSpec = build().get() -} - - -sealed class KotlinPoetNamedTypeSpecBuilder( - protected val className: ClassName, - delegate: TypeSpec.Builder -) : KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier - -typealias AnnotationSpecBuilderReceiver = AnnotationSpec.Builder.() -> Unit -typealias CodeBlockBuilderReceiver = CodeBlock.Builder.() -> Unit -typealias FileSpecBuilderReceiver = FileSpec.Builder.() -> Unit -typealias FunSpecBuilderReceiver = FunSpec.Builder.() -> Unit -typealias ParameterSpecBuilderReceiver = ParameterSpec.Builder.() -> Unit -typealias PropertySpecBuilderReceiver = PropertySpec.Builder.() -> Unit -typealias TypeAliasSpecBuilderReceiver = TypeAliasSpec.Builder.() -> Unit -typealias TypeSpecBuilderReceiver = TypeSpec.Builder.() -> Unit - -interface ToKotlinPoetSpecBuilder { - operator fun invoke(spec: SPEC): BUILDER -} - -interface ToKotlinPoetTypeSpecBuilder { - - operator fun invoke(spec: SPEC, kind: TypeSpec.Kind = spec.get().kind, name: String? = spec.get().name): BUILDER -} - -interface KotlinAnnotatableBuilder { - - fun addAnnotation(annotationSpec: AnnotationSpec): SELF - - fun addAnnotation(annotationSpec: AnnotationSpecSupplier): SELF = addAnnotation(annotationSpec.get()) - - fun addAnnotation(annotation: ClassName): SELF = addAnnotation(AnnotationSpec.builder(annotation).build()) - - fun addAnnotation(annotation: KClass): SELF = addAnnotation(annotation.asClassName()) - - //fun removeAnnotation(annotation: KClass<*>): SELF - -// fun TypeSpec.Builder.removeAnnotation(annotation: KClass) = apply { -// this.annotations.removeIf { -// it.typeName == annotation.asClassName() -// } -// } -// -// fun ParameterSpec.Builder.removeAnnotation(annotation: KClass) = apply { -// this.annotations.removeIf { -// it.typeName == annotation.asClassName() -// } -// } - -} - diff --git a/kotlin-code-generation/src/_BAK/_facet.kt b/kotlin-code-generation/src/_BAK/_facet.kt deleted file mode 100644 index 0259e0b..0000000 --- a/kotlin-code-generation/src/_BAK/_facet.kt +++ /dev/null @@ -1,26 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeName - -interface WithAnnotationSpecs { - val annotations: List -} - -interface WithClassName : WithTypeName { - val className: ClassName - - override val typeName: TypeName get() = className -} - -interface WithName { - val name: String -} - -interface WithType { - val type: TypeName -} - -interface WithTypeName { - val typeName: TypeName -} diff --git a/kotlin-code-generation/src/_BAK/_spec.kt b/kotlin-code-generation/src/_BAK/_spec.kt deleted file mode 100644 index e51b583..0000000 --- a/kotlin-code-generation/src/_BAK/_spec.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.* -import java.util.function.Supplier - -sealed interface KotlinPoetSpec : SpecSupplier { - val code: String get() = get().toString() -} - -sealed interface KotlinPoetTypeSpec : KotlinPoetSpec, TypeSpecSupplier, WithAnnotationSpecs, Documentable { - override fun get(): TypeSpec - - override val annotations: List get() = KotlinAnnotationSpec.of(get().annotations) -} - -sealed interface KotlinPoetNamedTypeSpec : KotlinPoetTypeSpec, WithClassName - -interface SpecSupplier : Supplier -interface AnnotationSpecSupplier : SpecSupplier -interface FileSpecSupplier : SpecSupplier -interface FunSpecSupplier : SpecSupplier -interface ParameterSpecSupplier : SpecSupplier -interface PropertySpecSupplier : SpecSupplier -interface TypeAliasSpecSupplier : SpecSupplier -interface TypeSpecSupplier : SpecSupplier -interface DataClassSpecSupplier : SpecSupplier, TypeSpecSupplier -interface ConstructorPropertySupplier : SpecSupplier, WithName - - -interface KotlinPoetSpecToBuilder { - fun toBuilder(): BUILDER -} - diff --git a/kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt deleted file mode 100644 index 953a1d6..0000000 --- a/kotlin-code-generation/src/_BAK/bak/AnnotatableSpecBuilder.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.bak - -import com.squareup.kotlinpoet.Annotatable -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.SpecSupplier - -@Deprecated("remove") -interface AnnotatableSpecBuilder, SPEC : Annotatable, SPEC_BUILDER : Annotatable.Builder> : - Builder diff --git a/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt deleted file mode 100644 index 3cea41d..0000000 --- a/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetSpecBuilder.kt +++ /dev/null @@ -1,39 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.bak - -import io.toolisticon.kotlin.generation._BAK.KotlinPoetSpec - -/** - * Self-Type implementation of the root Spec builder. This is needed, because: a) we want implementing builders - * to return an instance of themselves, so we can type-safe and fluently build products. - * And b) because unfortunately kotlin-poet does not provide common super-types for specs and builders. - * - * @param SELF concrete instance of this builder to return in implementing classes. - * @param PRODUCT the [KotlinPoetSpec] type returned by this builder. - * @param SPEC the kotlin poet spec the [PRODUCT] refers to. - * @param SPEC_BUILDER the specific kotlin poet builder used to modify [PRODUCT]. - * @param delegate provide an instance of the specific builder - */ -@Deprecated("remove") -sealed class BAK_KotlinPoetSpecBuilder< - SELF : BAK_KotlinPoetSpecBuilder, - PRODUCT : KotlinPoetSpec, - SPEC : Any, - SPEC_BUILDER : Any - >( - protected val delegate: SPEC_BUILDER -) : SpecBuilder { - - @Suppress("UNCHECKED_CAST") - protected fun applySelf(block: SELF.() -> Unit): SELF = (this as SELF).apply { - block() - } - - /** - * Directly invoke underlying builder to support all build-in features. - */ - operator fun invoke(block: SPEC_BUILDER.() -> Unit): SELF = applySelf { - delegate.block() - } - - abstract override fun build(): PRODUCT -} diff --git a/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt deleted file mode 100644 index 9d4e598..0000000 --- a/kotlin-code-generation/src/_BAK/bak/BAK_KotlinPoetTypeSpecBuilder.kt +++ /dev/null @@ -1,29 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.bak - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation._BAK.KotlinPoetTypeSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - -@Deprecated("remove") -sealed class BAK_KotlinPoetTypeSpecBuilder( - delegate: TypeSpec.Builder -) : BAK_KotlinPoetSpecBuilder, T, TypeSpec, TypeSpec.Builder>( - delegate = delegate -), TypeSpecSupplier -// AnnotatableSpecBuilder, T, TypeSpec, TypeSpec.Builder>, T, TypeSpec, TypeSpec.Builder>, -//, DocumentableSpecBuilder, T, TypeSpec, TypeSpec.Builder>, T, TypeSpec, TypeSpec.Builder> -{ - - - fun addAnnotation(annotationSpec: AnnotationSpec) = applySelf { - delegate.addAnnotation(annotationSpec) - } - - fun addKdoc(block: CodeBlock) = applySelf { - delegate.addKdoc(block) - } - - override fun get(): TypeSpec = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt deleted file mode 100644 index 2258358..0000000 --- a/kotlin-code-generation/src/_BAK/bak/KotlinPoetNamedTypeSpecBuilder.kt +++ /dev/null @@ -1,14 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.bak - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation._BAK.KotlinPoetNamedTypeSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - -@Deprecated("remove") -sealed class KotlinPoetNamedTypeSpecBuilder( - protected val className: ClassName, - delegate: TypeSpec.Builder -) : BAK_KotlinPoetTypeSpecBuilder( - delegate = delegate -), TypeSpecSupplier diff --git a/kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt deleted file mode 100644 index 7daa197..0000000 --- a/kotlin-code-generation/src/_BAK/bak/SpecBuilder.kt +++ /dev/null @@ -1,8 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.bak - -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.SpecSupplier - -@Deprecated("remove") -sealed interface SpecBuilder, PRODUCT : SpecSupplier, SPEC, SPEC_BUILDER> : - Builder diff --git a/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt deleted file mode 100644 index dc04100..0000000 --- a/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetSpecBuilder.kt +++ /dev/null @@ -1,6 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.bak - -@Deprecated("remove") -interface ToKotlinPoetSpecBuilder { - operator fun invoke(spec: SPEC): BUILDER -} diff --git a/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt deleted file mode 100644 index 83a0a10..0000000 --- a/kotlin-code-generation/src/_BAK/bak/ToKotlinPoetTypeSpecBuilder.kt +++ /dev/null @@ -1,10 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.bak - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation._BAK.KotlinPoetTypeSpec - -@Deprecated("remove") -interface ToKotlinPoetTypeSpecBuilder { - - operator fun invoke(spec: SPEC, kind: TypeSpec.Kind = spec.get().kind, name: String? = spec.get().name): BUILDER -} diff --git a/kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt deleted file mode 100644 index ac4c158..0000000 --- a/kotlin-code-generation/src/_BAK/poet/AnnotatableBuilder.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.Annotatable -import com.squareup.kotlinpoet.AnnotationSpec -import io.toolisticon.kotlin.generation.BuilderSupplier - -sealed interface AnnotatableBuilder, S : Annotatable, B : Annotatable.Builder> - : BuilderSupplier, Annotatable.Builder { - override val annotations: MutableList get() = get().annotations - - fun addAnnotation(builder: AnnotationSpecBuilder): SELF = addAnnotation(builder.build()) -} diff --git a/kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt deleted file mode 100644 index 44a03b6..0000000 --- a/kotlin-code-generation/src/_BAK/poet/ContextReceivableBuilder.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.ContextReceivable -import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi -import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.BuilderSupplier - -@ExperimentalKotlinPoetApi -sealed interface ContextReceivableBuilder, S : ContextReceivable, B : ContextReceivable.Builder> - : BuilderSupplier, ContextReceivable.Builder { - override val contextReceiverTypes: MutableList get() = get().contextReceiverTypes -} diff --git a/kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt deleted file mode 100644 index 525e00d..0000000 --- a/kotlin-code-generation/src/_BAK/poet/DocumentableBuilder.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.Documentable -import io.toolisticon.kotlin.generation.BuilderSupplier - -sealed interface DocumentableBuilder, S : Documentable, B : Documentable.Builder> - : BuilderSupplier, Documentable.Builder { - override val kdoc: CodeBlock.Builder get() = get().kdoc - - fun addKdoc(builder: CodeBlockBuilder): SELF = addKdoc(builder.build()) -} diff --git a/kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt deleted file mode 100644 index c903c18..0000000 --- a/kotlin-code-generation/src/_BAK/poet/KModifierHolderBuilder.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.KModifier -import io.toolisticon.kotlin.generation.BuilderSupplier - -@Suppress("UNCHECKED_CAST") -sealed interface KModifierHolderBuilder, S : Any, B : Any> - : BuilderSupplier { - val modifiers: MutableList - - fun addModifiers(vararg modifiers: KModifier): SELF = apply { - this.modifiers += modifiers - } as SELF - - public fun addModifiers(modifiers: Iterable): SELF = apply { - this.modifiers += modifiers - } as SELF - -} diff --git a/kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt deleted file mode 100644 index 3376d63..0000000 --- a/kotlin-code-generation/src/_BAK/poet/MemberSpecHolderBuilder.kt +++ /dev/null @@ -1,20 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi -import com.squareup.kotlinpoet.FunSpec -import com.squareup.kotlinpoet.MemberSpecHolder -import com.squareup.kotlinpoet.PropertySpec -import io.toolisticon.kotlin.generation.BuilderSupplier - -sealed interface MemberSpecHolderBuilder, S : MemberSpecHolder, B : MemberSpecHolder.Builder> - : BuilderSupplier, MemberSpecHolder.Builder { - override fun addProperty(propertySpec: PropertySpec): SELF - - @OptIn(ExperimentalKotlinPoetApi::class) - fun addProperty(builder: PropertySpecBuilder): SELF = addProperty(builder.build()) - - override fun addFunction(funSpec: FunSpec): SELF - - @OptIn(ExperimentalKotlinPoetApi::class) - fun addFunction(builder: FunSpecBuilder): SELF = addFunction(builder.build()) -} diff --git a/kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt deleted file mode 100644 index dfc5c01..0000000 --- a/kotlin-code-generation/src/_BAK/poet/OriginatingElementsHolderBuilder.kt +++ /dev/null @@ -1,10 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.OriginatingElementsHolder -import io.toolisticon.kotlin.generation.BuilderSupplier -import javax.lang.model.element.Element - -sealed interface OriginatingElementsHolderBuilder, S : OriginatingElementsHolder, B : OriginatingElementsHolder.Builder> - : BuilderSupplier, OriginatingElementsHolder.Builder { - override val originatingElements: MutableList get() = get().originatingElements -} diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt index 7f4a893..e37d0df 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt @@ -3,8 +3,8 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilder +import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilderReceiver -import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpec import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import kotlin.reflect.KClass @@ -31,14 +31,18 @@ class KotlinAnnotationSpecBuilder internal constructor( fun builder( type: KClass ): KotlinAnnotationSpecBuilder = builder(type.asClassName()) + + fun from(spec: KotlinAnnotationSpecSupplier) = KotlinAnnotationSpecBuilder( + delegate = spec.get().toBuilder().wrap() + ) } fun addMember(format: String, vararg args: Any): KotlinAnnotationSpecBuilder = apply { - TODO() //delegate.addMember(format, *args) + delegate.addMember(format, *args) } fun addMember(codeBlock: CodeBlock): KotlinAnnotationSpecBuilder = apply { - TODO() //delegate.addMember(codeBlock) + delegate.addMember(codeBlock) } fun addKClassMember(name: String, klass: KClass<*>) = addMember("$name = %T::class", klass) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index 55c44f3..2cabb16 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -2,10 +2,12 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpecSupplier import mu.KLogging @@ -32,9 +34,11 @@ class KotlinDataClassSpecBuilder internal constructor( ) init { - delegate { addModifiers(KModifier.DATA) } + delegate.addModifiers(KModifier.DATA) } + private val constructorProperties = LinkedHashMap() + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } @@ -43,18 +47,20 @@ class KotlinDataClassSpecBuilder internal constructor( return KotlinDataClassSpec(className = className, spec = delegate.build()) } + override fun spec(): KotlinDataClassSpec = build() override fun get(): TypeSpec = build().get() -// operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = + // operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = // _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( // className = spec.className, // delegate = spec.get().toBuilder() // ) //} // -//private val constructorProperties = LinkedHashMap() -// + + + // //operator fun invoke(block: TypeSpecBuilder.() -> Unit): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { // delegate.block() // override fun addKdoc(kdoc: CodeBlock) = apply { @@ -65,9 +71,9 @@ class KotlinDataClassSpecBuilder internal constructor( // delegate.addType(typeSpecSupplier.get()) // } // -// fun addConstructorProperty(name: String, type: TypeName, block: _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinConstructorPropertyBuilder.() -> Unit = {}) = apply { -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[name] = buildConstructorProperty(name, type, block) -// } + fun addConstructorProperty(name: String, type: TypeName, spec: KotlinConstructorPropertySpecSupplier) = apply { + this.constructorProperties[name] = spec + } // // fun addConstructorProperty(constructorProperty: ConstructorPropertySupplier) = apply { // _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[constructorProperty.name] = constructorProperty diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt index 086ffb3..9b407f8 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -43,9 +43,7 @@ class KotlinEnumClassSpecBuilder internal constructor( } fun addEnumConstant(name: String) = apply { - delegate { - addEnumConstant(name) - } + delegate.addEnumConstant(name) } override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt index c2578f5..3332bf7 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -54,13 +54,11 @@ class KotlinFileSpecBuilder internal constructor( } override fun builder(block: FileSpecBuilderReceiver) = apply { - delegate { block() } + delegate.builder.block() } fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { - delegate { - addType(typeSpecSupplier.get()) - } + delegate.addType(typeSpecSupplier.get()) } fun addAnnotation(annotationSpec: AnnotationSpec): KotlinFileSpecBuilder = builder { diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index 33eafe4..0b65b7a 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -8,7 +8,6 @@ import io.toolisticon.kotlin.generation.poet.FunSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.FunSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinFunSpec import io.toolisticon.kotlin.generation.spec.KotlinFunSpecSupplier -import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier class KotlinFunSpecBuilder internal constructor( @@ -62,7 +61,7 @@ class KotlinFunSpecBuilder internal constructor( } override fun builder(block: FunSpecBuilderReceiver): KotlinFunSpecBuilder = apply { - delegate { block() } + delegate.builder.block() } override fun build(): KotlinFunSpec = KotlinFunSpec(spec = delegate.build()) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt index 456a0db..e139f1b 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt @@ -39,7 +39,7 @@ class KotlinObjectSpecBuilder internal constructor( // typeSpecSupplier.forEach(::addType) // } override fun builder(block: TypeSpecBuilderReceiver): KotlinObjectSpecBuilder = apply { - delegate { block() } + delegate.builder.block() } override fun build(): KotlinObjectSpec = KotlinObjectSpec(spec = delegate.build()) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt index ef37761..62c1c2d 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -82,10 +82,9 @@ class KotlinParameterSpecBuilder internal constructor( } override fun builder(block: ParameterSpecBuilderReceiver) = apply { - delegate { block() } + delegate.builder.block() } - fun addAnnotation(annotationSpec: KotlinAnnotationSpecSupplier): KotlinParameterSpecBuilder = builder { addAnnotation(annotationSpec.get()) } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index 3d7aae1..13e990e 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -77,7 +77,7 @@ class KotlinPropertySpecBuilder internal constructor( override fun builder(block: PropertySpecBuilderReceiver) = apply { - delegate { block() } + delegate.builder.block() } override fun build(): KotlinPropertySpec { diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt index fb5b889..f0091f7 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt @@ -33,7 +33,7 @@ class KotlinTypeAliasSpecBuilder internal constructor( } override fun builder(block: TypeAliasSpecBuilderReceiver) = apply { - delegate { block() } + delegate.builder.block() } override fun build() = KotlinTypeAliasSpec(spec = delegate.build()) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt index c481661..8613d2e 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -38,10 +38,8 @@ class KotlinValueClassSpecBuilder internal constructor( ) init { - delegate { - addModifiers(KModifier.VALUE) - jvmInline() - } + delegate.addModifiers(KModifier.VALUE) + delegate.builder.jvmInline() } fun primaryConstructor(constructorPropertySupplier: KotlinConstructorPropertySpecSupplier) = apply { @@ -51,9 +49,7 @@ class KotlinValueClassSpecBuilder internal constructor( .addParameter(this.constructorProperty.parameter) .build() - delegate { - addProperty(constructorProperty.property.get()) - } + delegate.addProperty(constructorProperty.property.get()) delegate.builder.primaryConstructor(constructor.get()) } diff --git a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt index c545342..4b1611e 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt @@ -22,16 +22,13 @@ class AnnotationSpecBuilder( } // Taggable - fun tag(type: KClass<*>, tag: Any?) = invoke { tag(type, tag) } + fun tag(type: KClass<*>, tag: Any?) = apply { builder.tag(type, tag) } // Annotatable - fun addMember(format: String, vararg args: Any) = invoke { addMember(CodeBlock.of(format, *args)) } - fun addMember(codeBlock: CodeBlock) = invoke { addMember(codeBlock) } - fun useSiteTarget(useSiteTarget: UseSiteTarget?) = invoke { useSiteTarget(useSiteTarget) } + fun addMember(format: String, vararg args: Any) = apply { builder.addMember(CodeBlock.of(format, *args)) } + fun addMember(codeBlock: CodeBlock) = apply { builder. addMember(codeBlock) } + fun useSiteTarget(useSiteTarget: UseSiteTarget?) = apply { builder. useSiteTarget(useSiteTarget) } - override fun invoke(block: AnnotationSpecBuilderReceiver): AnnotationSpecBuilder = apply { - builder.block() - } override fun build(): AnnotationSpec = builder.build() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt index 9a89060..7f587d9 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt @@ -13,23 +13,19 @@ class CodeBlockBuilder( fun builder(): CodeBlockBuilder = CodeBlock.builder().wrap() } - fun add(format: String, vararg args: Any?): CodeBlockBuilder = invoke { add(format, *args) } - fun add(codeBlock: CodeBlock): CodeBlockBuilder = invoke { add(codeBlock) } + fun add(format: String, vararg args: Any?): CodeBlockBuilder = apply { builder.add(format, *args) } + fun add(codeBlock: CodeBlock): CodeBlockBuilder = apply { builder.add(codeBlock) } fun add(builder: CodeBlockBuilder): CodeBlockBuilder = add(builder.build()) - fun addNamed(format: String, arguments: Map): CodeBlockBuilder = invoke { addNamed(format, arguments) } - fun addStatement(format: String, vararg args: Any?): CodeBlockBuilder = invoke { addStatement(format, *args) } - fun beginControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = invoke { beginControlFlow(controlFlow, *args) } - fun clear(): CodeBlockBuilder = invoke { clear() } - fun endControlFlow(): CodeBlockBuilder = invoke { endControlFlow() } - fun indent(): CodeBlockBuilder = invoke { indent() } + fun addNamed(format: String, arguments: Map): CodeBlockBuilder = apply { builder.addNamed(format, arguments) } + fun addStatement(format: String, vararg args: Any?): CodeBlockBuilder = apply { builder.addStatement(format, *args) } + fun beginControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = apply { builder.beginControlFlow(controlFlow, *args) } + fun clear(): CodeBlockBuilder = apply { builder.clear() } + fun endControlFlow(): CodeBlockBuilder = apply { builder.endControlFlow() } + fun indent(): CodeBlockBuilder = apply { builder.indent() } fun isEmpty(): Boolean = builder.isEmpty() fun isNotEmpty(): Boolean = builder.isNotEmpty() - fun nextControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = invoke { nextControlFlow(controlFlow, *args) } - fun unindent(): CodeBlockBuilder = invoke { unindent() } - - override fun invoke(block: Builder.() -> Unit): CodeBlockBuilder = apply { - builder.block() - } + fun nextControlFlow(controlFlow: String, vararg args: Any?): CodeBlockBuilder = apply { builder.nextControlFlow(controlFlow, *args) } + fun unindent(): CodeBlockBuilder = apply { builder.unindent() } override fun build(): CodeBlock = builder.build() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt index cb6eb5b..d853b7c 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt @@ -29,55 +29,50 @@ class FileSpecBuilder( } // AnnotatableBuilder - override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } - override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + override fun addAnnotation(annotationSpec: AnnotationSpec) = apply { builder.addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // MemberSpecHolderBuilder - override fun addFunction(funSpec: FunSpec) = invoke { addFunction(funSpec) } - override fun addFunctions(funSpecs: Iterable) = invoke { addFunctions(funSpecs) } - override fun addProperty(propertySpec: PropertySpec) = invoke { addProperty(propertySpec) } - override fun addProperties(propertySpecs: Iterable) = invoke { addProperties(propertySpecs) } + override fun addFunction(funSpec: FunSpec) = apply { builder.addFunction(funSpec) } + override fun addFunctions(funSpecs: Iterable) = apply { builder.addFunctions(funSpecs) } + override fun addProperty(propertySpec: PropertySpec) = apply { builder.addProperty(propertySpec) } + override fun addProperties(propertySpecs: Iterable) = apply { builder.addProperties(propertySpecs) } // TypeSpecHolderBuilder - override fun addType(typeSpec: TypeSpec) = invoke { addType(typeSpec) } - override fun addTypes(typeSpecs: Iterable) = invoke { addTypes(typeSpecs) } - - - fun addFileComment(format: String, vararg args: Any) = invoke { addFileComment(format, *args) } - fun clearComment(): FileSpecBuilder = invoke { clearComment() } - fun addTypeAlias(typeAliasSpec: TypeAliasSpec): FileSpecBuilder = invoke { addTypeAlias(typeAliasSpec) } - fun addImport(constant: Enum<*>): FileSpecBuilder = invoke { addImport(constant) } - fun addImport(kclass: KClass<*>, vararg names: String): FileSpecBuilder = invoke { addImport(kclass, *names) } - fun addImport(className: ClassName, vararg names: String): FileSpecBuilder = invoke { addImport(className, *names) } - fun addImport(kclass: KClass<*>, names: Iterable): FileSpecBuilder = invoke { addImport(kclass, names) } - fun addImport(className: ClassName, names: Iterable): FileSpecBuilder = invoke { addImport(className, names) } - fun addImport(packageName: String, vararg names: String): FileSpecBuilder = invoke { addImport(packageName, *names) } - fun addImport(packageName: String, names: Iterable): FileSpecBuilder = invoke { addImport(packageName, names) } - fun addImport(import: Import): FileSpecBuilder = invoke { addImport(import) } - fun clearImports(): FileSpecBuilder = invoke { clearImports() } - fun addAliasedImport(kclass: KClass<*>, alias: String): FileSpecBuilder = invoke { addAliasedImport(kclass, alias) } - fun addAliasedImport(className: ClassName, alias: String): FileSpecBuilder = invoke { addAliasedImport(className, alias) } - fun addAliasedImport(className: ClassName, memberName: String, alias: String): FileSpecBuilder = invoke { addAliasedImport(className, memberName, alias) } - fun addAliasedImport(memberName: MemberName, alias: String): FileSpecBuilder = invoke { addAliasedImport(memberName, alias) } - fun addDefaultPackageImport(packageName: String): FileSpecBuilder = invoke { addDefaultPackageImport(packageName) } - fun addKotlinDefaultImports(includeJvm: Boolean = true, includeJs: Boolean = true): FileSpecBuilder = invoke { addKotlinDefaultImports(includeJvm, includeJs) } - fun indent(indent: String): FileSpecBuilder = invoke { indent(indent) } - fun addCode(format: String, vararg args: Any?): FileSpecBuilder = invoke { addCode(format, *args) } - fun addNamedCode(format: String, args: Map): FileSpecBuilder = invoke { addNamedCode(format, args) } - fun addCode(codeBlock: CodeBlock): FileSpecBuilder = invoke { addCode(codeBlock) } - fun addBodyComment(format: String, vararg args: Any): FileSpecBuilder = invoke { addBodyComment(format, *args) } - fun beginControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = invoke { beginControlFlow(controlFlow, *args) } - fun nextControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = invoke { nextControlFlow(controlFlow, *args) } - fun endControlFlow(): FileSpecBuilder = invoke { endControlFlow() } - fun addStatement(format: String, vararg args: Any): FileSpecBuilder = invoke { addStatement(format, *args) } - fun clearBody(): FileSpecBuilder = invoke { clearBody() } - - override fun invoke(block: FileSpecBuilderReceiver): FileSpecBuilder = apply { - builder.block() - } + override fun addType(typeSpec: TypeSpec) = apply { builder.addType(typeSpec) } + override fun addTypes(typeSpecs: Iterable) = apply { builder.addTypes(typeSpecs) } + + + fun addFileComment(format: String, vararg args: Any) = apply { builder.addFileComment(format, *args) } + fun clearComment(): FileSpecBuilder = apply { builder.clearComment() } + fun addTypeAlias(typeAliasSpec: TypeAliasSpec): FileSpecBuilder = apply { builder.addTypeAlias(typeAliasSpec) } + fun addImport(constant: Enum<*>): FileSpecBuilder = apply { builder.addImport(constant) } + fun addImport(kclass: KClass<*>, vararg names: String): FileSpecBuilder = apply { builder.addImport(kclass, *names) } + fun addImport(className: ClassName, vararg names: String): FileSpecBuilder = apply { builder.addImport(className, *names) } + fun addImport(kclass: KClass<*>, names: Iterable): FileSpecBuilder = apply { builder.addImport(kclass, names) } + fun addImport(className: ClassName, names: Iterable): FileSpecBuilder = apply { builder.addImport(className, names) } + fun addImport(packageName: String, vararg names: String): FileSpecBuilder = apply { builder.addImport(packageName, *names) } + fun addImport(packageName: String, names: Iterable): FileSpecBuilder = apply { builder.addImport(packageName, names) } + fun addImport(import: Import): FileSpecBuilder = apply { builder.addImport(import) } + fun clearImports(): FileSpecBuilder = apply { builder.clearImports() } + fun addAliasedImport(kclass: KClass<*>, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(kclass, alias) } + fun addAliasedImport(className: ClassName, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(className, alias) } + fun addAliasedImport(className: ClassName, memberName: String, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(className, memberName, alias) } + fun addAliasedImport(memberName: MemberName, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(memberName, alias) } + fun addDefaultPackageImport(packageName: String): FileSpecBuilder = apply { builder.addDefaultPackageImport(packageName) } + fun addKotlinDefaultImports(includeJvm: Boolean = true, includeJs: Boolean = true): FileSpecBuilder = apply { builder.addKotlinDefaultImports(includeJvm, includeJs) } + fun indent(indent: String): FileSpecBuilder = apply { builder.indent(indent) } + fun addCode(format: String, vararg args: Any?): FileSpecBuilder = apply { builder.addCode(format, *args) } + fun addNamedCode(format: String, args: Map): FileSpecBuilder = apply { builder.addNamedCode(format, args) } + fun addCode(codeBlock: CodeBlock): FileSpecBuilder = apply { builder.addCode(codeBlock) } + fun addBodyComment(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addBodyComment(format, *args) } + fun beginControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = apply { builder.beginControlFlow(controlFlow, *args) } + fun nextControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = apply { builder.nextControlFlow(controlFlow, *args) } + fun endControlFlow(): FileSpecBuilder = apply { builder.endControlFlow() } + fun addStatement(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addStatement(format, *args) } + fun clearBody(): FileSpecBuilder = apply { builder.clearBody() } override fun build(): FileSpec = builder.build() - } interface FileSpecSupplier : PoetSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt index 5b495fa..e5fc031 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt @@ -33,80 +33,76 @@ class FunSpecBuilder( } // AnnotatableBuilder - override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } - override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + override fun addAnnotation(annotationSpec: AnnotationSpec) = apply { builder.addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // ContextReceiverBuilder @ExperimentalKotlinPoetApi - override fun contextReceivers(receiverTypes: Iterable) = invoke { contextReceivers(receiverTypes) } + override fun contextReceivers(receiverTypes: Iterable) = apply { builder.contextReceivers(receiverTypes) } @ExperimentalKotlinPoetApi - override fun contextReceivers(vararg receiverTypes: TypeName) = invoke { contextReceivers(*receiverTypes) } + override fun contextReceivers(vararg receiverTypes: TypeName) = apply { builder.contextReceivers(*receiverTypes) } // DocumentableBuilder - override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } - override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + override fun addKdoc(format: String, vararg args: Any) = apply { builder.addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = apply { builder.addKdoc(block) } // OriginatingElementBuilder - override fun addOriginatingElement(originatingElement: Element) = invoke { addOriginatingElement(originatingElement) } + override fun addOriginatingElement(originatingElement: Element) = apply { builder.addOriginatingElement(originatingElement) } // FunSpecBuilder - fun addModifiers(vararg modifiers: KModifier): FunSpecBuilder = invoke { addModifiers(*modifiers) } - fun addModifiers(modifiers: Iterable): FunSpecBuilder = invoke { addModifiers(modifiers) } + fun addModifiers(vararg modifiers: KModifier): FunSpecBuilder = apply { builder.addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): FunSpecBuilder = apply { builder.addModifiers(modifiers) } fun jvmModifiers(modifiers: Iterable) = builder.jvmModifiers(modifiers) - fun addTypeVariables(typeVariables: Iterable): FunSpecBuilder = invoke { addTypeVariables(typeVariables) } + fun addTypeVariables(typeVariables: Iterable): FunSpecBuilder = apply { builder.addTypeVariables(typeVariables) } - fun addTypeVariable(typeVariable: TypeVariableName): FunSpecBuilder = invoke { addTypeVariable(typeVariable) } + fun addTypeVariable(typeVariable: TypeVariableName): FunSpecBuilder = apply { builder.addTypeVariable(typeVariable) } - fun receiver(receiverType: TypeName): FunSpecBuilder = invoke { receiver(receiverType) } - fun receiver(receiverType: TypeName, kdoc: CodeBlock): FunSpecBuilder = invoke { receiver(receiverType, kdoc) } + fun receiver(receiverType: TypeName): FunSpecBuilder = apply { builder.receiver(receiverType) } + fun receiver(receiverType: TypeName, kdoc: CodeBlock): FunSpecBuilder = apply { builder.receiver(receiverType, kdoc) } - fun receiver(receiverType: KClass<*>): FunSpecBuilder = invoke { receiver(receiverType) } - fun receiver(receiverType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = invoke { receiver(receiverType, kdoc) } + fun receiver(receiverType: KClass<*>): FunSpecBuilder = apply { builder.receiver(receiverType) } + fun receiver(receiverType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = apply { builder.receiver(receiverType, kdoc) } - fun receiver(receiverType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = invoke { receiver(receiverType, kdoc, *args) } + fun receiver(receiverType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = apply { builder.receiver(receiverType, kdoc, *args) } - fun returns(returnType: TypeName): FunSpecBuilder = invoke { returns(returnType) } - fun returns(returnType: TypeName, kdoc: CodeBlock): FunSpecBuilder = invoke { returns(returnType, kdoc) } + fun returns(returnType: TypeName): FunSpecBuilder = apply { builder.returns(returnType) } + fun returns(returnType: TypeName, kdoc: CodeBlock): FunSpecBuilder = apply { builder.returns(returnType, kdoc) } - fun returns(returnType: KClass<*>): FunSpecBuilder = invoke { returns(returnType) } - fun returns(returnType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = invoke { returns(returnType, kdoc) } + fun returns(returnType: KClass<*>): FunSpecBuilder = apply { builder.returns(returnType) } + fun returns(returnType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = apply { builder.returns(returnType, kdoc) } - fun returns(returnType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = invoke { returns(returnType, kdoc, *args) } + fun returns(returnType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = apply { builder.returns(returnType, kdoc, *args) } - fun addParameters(parameterSpecs: Iterable): FunSpecBuilder = invoke { addParameters(parameterSpecs) } - fun addParameter(parameterSpec: ParameterSpec): FunSpecBuilder = invoke { addParameter(parameterSpec) } - fun callThisConstructor(args: List): FunSpecBuilder = invoke { callThisConstructor(args) } + fun addParameters(parameterSpecs: Iterable): FunSpecBuilder = apply { builder.addParameters(parameterSpecs) } + fun addParameter(parameterSpec: ParameterSpec): FunSpecBuilder = apply { builder.addParameter(parameterSpec) } + fun callThisConstructor(args: List): FunSpecBuilder = apply { builder.callThisConstructor(args) } - fun callThisConstructor(args: Iterable): FunSpecBuilder = invoke { callThisConstructor(args) } - fun callThisConstructor(vararg args: String): FunSpecBuilder = invoke { callThisConstructor(*args) } - fun callThisConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = invoke { callThisConstructor(*args) } - fun callSuperConstructor(args: Iterable): FunSpecBuilder = invoke { callSuperConstructor(args) } - fun callSuperConstructor(args: List): FunSpecBuilder = invoke { callSuperConstructor(args) } - fun callSuperConstructor(vararg args: String): FunSpecBuilder = invoke { callSuperConstructor(*args) } - fun callSuperConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = invoke { callSuperConstructor(*args) } - fun addParameter(name: String, type: TypeName, vararg modifiers: KModifier): FunSpecBuilder = invoke { addParameter(name, type, *modifiers) } - fun addParameter(name: String, type: KClass<*>, vararg modifiers: KModifier): FunSpecBuilder = invoke { addParameter(name, type, *modifiers) } - fun addParameter(name: String, type: TypeName, modifiers: Iterable): FunSpecBuilder = invoke { addParameter(name, type, modifiers) } - fun addParameter(name: String, type: KClass<*>, modifiers: Iterable): FunSpecBuilder = invoke { addParameter(name, type, modifiers) } - fun addCode(format: String, vararg args: Any?): FunSpecBuilder = invoke { addCode(format, *args) } - fun addNamedCode(format: String, args: Map): FunSpecBuilder = invoke { addNamedCode(format, args) } - fun addCode(codeBlock: CodeBlock): FunSpecBuilder = invoke { addCode(codeBlock) } - fun addComment(format: String, vararg args: Any): FunSpecBuilder = invoke { addComment(format, *args) } + fun callThisConstructor(args: Iterable): FunSpecBuilder = apply { builder.callThisConstructor(args) } + fun callThisConstructor(vararg args: String): FunSpecBuilder = apply { builder.callThisConstructor(*args) } + fun callThisConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = apply { builder.callThisConstructor(*args) } + fun callSuperConstructor(args: Iterable): FunSpecBuilder = apply { builder.callSuperConstructor(args) } + fun callSuperConstructor(args: List): FunSpecBuilder = apply { builder.callSuperConstructor(args) } + fun callSuperConstructor(vararg args: String): FunSpecBuilder = apply { builder.callSuperConstructor(*args) } + fun callSuperConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = apply { builder.callSuperConstructor(*args) } + fun addParameter(name: String, type: TypeName, vararg modifiers: KModifier): FunSpecBuilder = apply { builder.addParameter(name, type, *modifiers) } + fun addParameter(name: String, type: KClass<*>, vararg modifiers: KModifier): FunSpecBuilder = apply { builder.addParameter(name, type, *modifiers) } + fun addParameter(name: String, type: TypeName, modifiers: Iterable): FunSpecBuilder = apply { builder.addParameter(name, type, modifiers) } + fun addParameter(name: String, type: KClass<*>, modifiers: Iterable): FunSpecBuilder = apply { builder.addParameter(name, type, modifiers) } + fun addCode(format: String, vararg args: Any?): FunSpecBuilder = apply { builder.addCode(format, *args) } + fun addNamedCode(format: String, args: Map): FunSpecBuilder = apply { builder.addNamedCode(format, args) } + fun addCode(codeBlock: CodeBlock): FunSpecBuilder = apply { builder.addCode(codeBlock) } + fun addComment(format: String, vararg args: Any): FunSpecBuilder = apply { builder.addComment(format, *args) } - fun beginControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = invoke { beginControlFlow(controlFlow, *args) } - fun nextControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = invoke { nextControlFlow(controlFlow, *args) } - fun endControlFlow(): FunSpecBuilder = invoke { endControlFlow() } - fun addStatement(format: String, vararg args: Any): FunSpecBuilder = invoke { addStatement(format, *args) } + fun beginControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = apply { builder.beginControlFlow(controlFlow, *args) } + fun nextControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = apply { builder.nextControlFlow(controlFlow, *args) } + fun endControlFlow(): FunSpecBuilder = apply { builder.endControlFlow() } + fun addStatement(format: String, vararg args: Any): FunSpecBuilder = apply { builder.addStatement(format, *args) } - fun clearBody(): FunSpecBuilder = invoke { clearBody() } - - override fun invoke(block: FunSpecBuilderReceiver): FunSpecBuilder = apply { - builder.block() - } + fun clearBody(): FunSpecBuilder = apply { builder.clearBody() } override fun build(): FunSpec = builder.build() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt index 32f28f2..449ec51 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/ParameterSpecBuilder.kt @@ -60,21 +60,17 @@ class ParameterSpecBuilder( // AnnotatableBuilder - override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } - override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + override fun addAnnotation(annotationSpec: AnnotationSpec) = apply { builder.addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // DocumentableBuilder - override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } - override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + override fun addKdoc(format: String, vararg args: Any) = apply { builder.addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = apply { builder.addKdoc(block) } - fun addModifiers(vararg modifiers: KModifier): ParameterSpecBuilder = invoke { addModifiers(*modifiers) } - fun addModifiers(modifiers: Iterable): ParameterSpecBuilder = invoke { addModifiers(modifiers) } - fun defaultValue(format: String, vararg args: Any?): ParameterSpecBuilder = invoke { defaultValue(format, *args) } - fun defaultValue(codeBlock: CodeBlock?): ParameterSpecBuilder = invoke { defaultValue(codeBlock) } - - override fun invoke(block: ParameterSpecBuilderReceiver): ParameterSpecBuilder = apply { - builder.block() - } + fun addModifiers(vararg modifiers: KModifier): ParameterSpecBuilder = apply { builder.addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): ParameterSpecBuilder = apply { builder.addModifiers(modifiers) } + fun defaultValue(format: String, vararg args: Any?): ParameterSpecBuilder = apply { builder.defaultValue(format, *args) } + fun defaultValue(codeBlock: CodeBlock?): ParameterSpecBuilder = apply { builder.defaultValue(codeBlock) } override fun build(): ParameterSpec = builder.build() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt index 1c1ff58..cb734e7 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt @@ -41,40 +41,37 @@ class PropertySpecBuilder( // AnnotatableBuilder - override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } - override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + override fun addAnnotation(annotationSpec: AnnotationSpec) = apply { builder.addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // ContextReceiverBuilder @ExperimentalKotlinPoetApi - override fun contextReceivers(receiverTypes: Iterable) = invoke { contextReceivers(receiverTypes) } + override fun contextReceivers(receiverTypes: Iterable) = apply { builder.contextReceivers(receiverTypes) } @ExperimentalKotlinPoetApi - override fun contextReceivers(vararg receiverTypes: TypeName) = invoke { contextReceivers(*receiverTypes) } + override fun contextReceivers(vararg receiverTypes: TypeName) = apply { builder.contextReceivers(*receiverTypes) } // DocumentableBuilder - override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } - override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + override fun addKdoc(format: String, vararg args: Any) = apply { builder.addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = apply { builder.addKdoc(block) } // OriginatingElementBuilder - override fun addOriginatingElement(originatingElement: Element) = invoke { addOriginatingElement(originatingElement) } - - fun mutable(mutable: Boolean = true): PropertySpecBuilder = invoke { mutable(mutable) } - fun addModifiers(vararg modifiers: KModifier): PropertySpecBuilder = invoke { addModifiers(*modifiers) } - fun addModifiers(modifiers: Iterable): PropertySpecBuilder = invoke { addModifiers(modifiers) } - fun addTypeVariables(typeVariables: Iterable): PropertySpecBuilder = invoke { addTypeVariables(typeVariables) } - fun addTypeVariable(typeVariable: TypeVariableName): PropertySpecBuilder = invoke { addTypeVariable(typeVariable) } - fun initializer(format: String, vararg args: Any?): PropertySpecBuilder = invoke { initializer(format, *args) } - fun initializer(codeBlock: CodeBlock?): PropertySpecBuilder = invoke { initializer(codeBlock) } - fun delegate(format: String, vararg args: Any?): PropertySpecBuilder = invoke { delegate(format, *args) } - fun delegate(codeBlock: CodeBlock): PropertySpecBuilder = invoke { delegate(codeBlock) } - fun getter(getter: FunSpec?): PropertySpecBuilder = invoke { getter(getter) } - fun setter(setter: FunSpec?): PropertySpecBuilder = invoke { setter(setter) } - fun receiver(receiverType: TypeName?): PropertySpecBuilder = invoke { receiver(receiverType) } - fun receiver(receiverType: KClass<*>): PropertySpecBuilder = invoke { receiver(receiverType) } - - override fun invoke(block: PropertySpecBuilderReceiver): PropertySpecBuilder = apply { - builder.block() - } + override fun addOriginatingElement(originatingElement: Element) = apply { builder.addOriginatingElement(originatingElement) } + + fun mutable(mutable: Boolean = true): PropertySpecBuilder = apply { builder.mutable(mutable) } + fun addModifiers(vararg modifiers: KModifier): PropertySpecBuilder = apply { builder.addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): PropertySpecBuilder = apply { builder.addModifiers(modifiers) } + fun addTypeVariables(typeVariables: Iterable): PropertySpecBuilder = apply { builder.addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName): PropertySpecBuilder = apply { builder.addTypeVariable(typeVariable) } + fun initializer(format: String, vararg args: Any?): PropertySpecBuilder = apply { builder.initializer(format, *args) } + fun initializer(codeBlock: CodeBlock?): PropertySpecBuilder = apply { builder.initializer(codeBlock) } + fun delegate(format: String, vararg args: Any?): PropertySpecBuilder = apply { builder.delegate(format, *args) } + fun delegate(codeBlock: CodeBlock): PropertySpecBuilder = apply { builder.delegate(codeBlock) } + fun getter(getter: FunSpec?): PropertySpecBuilder = apply { builder.getter(getter) } + fun setter(setter: FunSpec?): PropertySpecBuilder = apply { builder.setter(setter) } + fun receiver(receiverType: TypeName?): PropertySpecBuilder = apply { builder.receiver(receiverType) } + fun receiver(receiverType: KClass<*>): PropertySpecBuilder = apply { builder.receiver(receiverType) } + override fun build(): PropertySpec = builder.build() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt index a9a51e7..10c9b2d 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeAliasSpecBuilder.kt @@ -20,19 +20,18 @@ class TypeAliasSpecBuilder( // AnnotatableBuilder - override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } - override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + override fun addAnnotation(annotationSpec: AnnotationSpec) = apply { builder.addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // DocumentableBuilder - override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } - override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + override fun addKdoc(format: String, vararg args: Any) = apply { builder.addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = apply { builder.addKdoc(block) } - fun addModifiers(vararg modifiers: KModifier): TypeAliasSpecBuilder = invoke { addModifiers(*modifiers) } - fun addModifiers(modifiers: Iterable): TypeAliasSpecBuilder = invoke { addModifiers(modifiers) } - fun addTypeVariables(typeVariables: Iterable): TypeAliasSpecBuilder = invoke { addTypeVariables(typeVariables) } - fun addTypeVariable(typeVariable: TypeVariableName): TypeAliasSpecBuilder = invoke { addTypeVariable(typeVariable) } + fun addModifiers(vararg modifiers: KModifier): TypeAliasSpecBuilder = apply { builder.addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): TypeAliasSpecBuilder = apply { builder.addModifiers(modifiers) } + fun addTypeVariables(typeVariables: Iterable): TypeAliasSpecBuilder = apply { builder.addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName): TypeAliasSpecBuilder = apply { builder.addTypeVariable(typeVariable) } - override fun invoke(block: TypeAliasSpecBuilderReceiver): TypeAliasSpecBuilder = apply { builder.block() } override fun build(): TypeAliasSpec = builder.build() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt index 96c0d73..c2841c3 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt @@ -26,6 +26,7 @@ class TypeSpecBuilder( MemberSpecHolderBuilder, OriginatingElementsHolderBuilder, TypeSpecHolderBuilder { + companion object { fun TypeSpec.Builder.wrap() = TypeSpecBuilder(builder = this) @@ -75,59 +76,55 @@ class TypeSpecBuilder( // AnnotatableBuilder - override fun addAnnotation(annotationSpec: AnnotationSpec) = invoke { addAnnotation(annotationSpec) } - override fun addAnnotations(annotationSpecs: Iterable) = invoke { addAnnotations(annotationSpecs) } + override fun addAnnotation(annotationSpec: AnnotationSpec) = apply { builder.addAnnotation(annotationSpec) } + override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // DocumentableBuilder - override fun addKdoc(format: String, vararg args: Any) = invoke { addKdoc(format, *args) } - override fun addKdoc(block: CodeBlock) = invoke { addKdoc(block) } + override fun addKdoc(format: String, vararg args: Any) = apply { builder.addKdoc(format, *args) } + override fun addKdoc(block: CodeBlock) = apply { builder.addKdoc(block) } // ContextReceiverBuilder @ExperimentalKotlinPoetApi - override fun contextReceivers(receiverTypes: Iterable) = invoke { contextReceivers(receiverTypes) } + override fun contextReceivers(receiverTypes: Iterable) = apply { builder.contextReceivers(receiverTypes) } @ExperimentalKotlinPoetApi - override fun contextReceivers(vararg receiverTypes: TypeName) = invoke { contextReceivers(*receiverTypes) } + override fun contextReceivers(vararg receiverTypes: TypeName) = apply { builder.contextReceivers(*receiverTypes) } // MemberSpecHolderBuilder - override fun addFunction(funSpec: FunSpec) = invoke { addFunction(funSpec) } - override fun addFunctions(funSpecs: Iterable) = invoke { addFunctions(funSpecs) } - override fun addProperty(propertySpec: PropertySpec) = invoke { addProperty(propertySpec) } - override fun addProperties(propertySpecs: Iterable) = invoke { addProperties(propertySpecs) } + override fun addFunction(funSpec: FunSpec) = apply { builder.addFunction(funSpec) } + override fun addFunctions(funSpecs: Iterable) = apply { builder.addFunctions(funSpecs) } + override fun addProperty(propertySpec: PropertySpec) = apply { builder.addProperty(propertySpec) } + override fun addProperties(propertySpecs: Iterable) = apply { builder.addProperties(propertySpecs) } // OriginatingElementBuilder - override fun addOriginatingElement(originatingElement: Element) = invoke { addOriginatingElement(originatingElement) } + override fun addOriginatingElement(originatingElement: Element) = apply { builder.addOriginatingElement(originatingElement) } // TypeSpecHolderBuilder - override fun addType(typeSpec: TypeSpec) = invoke { addType(typeSpec) } - override fun addTypes(typeSpecs: Iterable) = invoke { addTypes(typeSpecs) } - - - fun addModifiers(vararg modifiers: KModifier): TypeSpecBuilder = invoke { addModifiers(*modifiers) } - fun addModifiers(modifiers: Iterable): TypeSpecBuilder = invoke { addModifiers(modifiers) } - fun addTypeVariables(typeVariables: Iterable): TypeSpecBuilder = invoke { addTypeVariables(typeVariables) } - fun addTypeVariable(typeVariable: TypeVariableName): TypeSpecBuilder = invoke { addTypeVariable(typeVariable) } - fun primaryConstructor(primaryConstructor: FunSpec?): TypeSpecBuilder = invoke { primaryConstructor(primaryConstructor) } - fun superclass(superclass: TypeName): TypeSpecBuilder = invoke { superclass(superclass) } - fun superclass(superclass: KClass<*>): TypeSpecBuilder = invoke { superclass(superclass) } - - fun addSuperclassConstructorParameter(format: String, vararg args: Any): TypeSpecBuilder = invoke { addSuperclassConstructorParameter(format, *args) } - fun addSuperclassConstructorParameter(codeBlock: CodeBlock): TypeSpecBuilder = invoke { addSuperclassConstructorParameter(codeBlock) } - - fun addSuperinterfaces(superinterfaces: Iterable): TypeSpecBuilder = invoke { addSuperinterfaces(superinterfaces) } - fun addSuperinterface(superinterface: TypeName): TypeSpecBuilder = invoke { addSuperinterface(superinterface) } - fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock): TypeSpecBuilder = invoke { addSuperinterface(superinterface, delegate) } - fun addSuperinterface(superinterface: KClass<*>): TypeSpecBuilder = invoke { addSuperinterface(superinterface) } - fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock): TypeSpecBuilder = invoke { addSuperinterface(superinterface, delegate) } - fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String): TypeSpecBuilder = invoke { addSuperinterface(superinterface, constructorParameterName) } - fun addSuperinterface(superinterface: TypeName, constructorParameter: String): TypeSpecBuilder = invoke { addSuperinterface(superinterface, constructorParameter) } - - fun addEnumConstant(name: String, typeSpec: TypeSpec = TypeSpec.anonymousClassBuilder().build()): TypeSpecBuilder = invoke { addEnumConstant(name, typeSpec) } - fun addInitializerBlock(block: CodeBlock): TypeSpecBuilder = invoke { addInitializerBlock(block) } - - override fun invoke(block: TypeSpecBuilderReceiver): TypeSpecBuilder = apply { - builder.block() - } + override fun addType(typeSpec: TypeSpec) = apply { builder.addType(typeSpec) } + override fun addTypes(typeSpecs: Iterable) = apply { builder.addTypes(typeSpecs) } + + + fun addModifiers(vararg modifiers: KModifier): TypeSpecBuilder = apply { builder.addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable): TypeSpecBuilder = apply { builder.addModifiers(modifiers) } + fun addTypeVariables(typeVariables: Iterable): TypeSpecBuilder = apply { builder.addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName): TypeSpecBuilder = apply { builder.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpec?): TypeSpecBuilder = apply { builder.primaryConstructor(primaryConstructor) } + fun superclass(superclass: TypeName): TypeSpecBuilder = apply { builder.superclass(superclass) } + fun superclass(superclass: KClass<*>): TypeSpecBuilder = apply { builder.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any): TypeSpecBuilder = apply { builder.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock): TypeSpecBuilder = apply { builder.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable): TypeSpecBuilder = apply { builder.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, constructorParameter) } + + fun addEnumConstant(name: String, typeSpec: TypeSpec = TypeSpec.anonymousClassBuilder().build()): TypeSpecBuilder = apply { builder.addEnumConstant(name, typeSpec) } + fun addInitializerBlock(block: CodeBlock): TypeSpecBuilder = apply { builder.addInitializerBlock(block) } override fun build(): TypeSpec = builder.build() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/_types.kt b/kotlin-code-generation/src/main/kotlin/poet/_types.kt index fe6119e..59545a8 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/_types.kt @@ -17,15 +17,12 @@ typealias PoetSpec = Any */ interface PoetSpecSupplier : Supplier - /** * Unfortunately, kotlin-poet spec-builders do not share a common interface, this interface simulates that. */ sealed interface PoetSpecBuilder, BUILDER, SPEC : PoetSpec, SUPPLIER : PoetSpecSupplier> : Builder, PoetSpecSupplier { val builder: BUILDER - operator fun invoke(block: BUILDER.() -> Unit): SELF - override fun get(): SPEC = build() } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt index e79c0b9..24978f4 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt @@ -11,4 +11,5 @@ data class KotlinAnnotationClassSpec( override fun spec(): KotlinAnnotationClassSpec = this override fun get(): TypeSpec = spec + } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt index b2f1ac9..3e55d8e 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt @@ -3,6 +3,7 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.builder.KotlinAnnotationSpecBuilder import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier data class KotlinAnnotationSpec( @@ -25,4 +26,4 @@ data class KotlinAnnotationSpec( } -// TODO fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationSpecBuilder.from(spec = this) +fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationSpecBuilder.from(spec = this) diff --git a/kotlin-code-generation/src/main/kotlin/spec/_types.kt b/kotlin-code-generation/src/main/kotlin/spec/_types.kt index 61dfdf2..b926703 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/_types.kt @@ -7,10 +7,9 @@ interface KotlinGeneratorSpecSupplier { fun spec() : GENERATOR_SPEC } - - interface KotlinGeneratorSpec, SPEC : PoetSpec, SUPPLIER : PoetSpecSupplier> : PoetSpecSupplier, KotlinGeneratorSpecSupplier { override fun spec(): SELF + val code : String get() = get().toString() } interface KotlinGeneratorTypeSpec> : KotlinGeneratorSpec { diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt index 11ce986..8cc5e93 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt +++ b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt @@ -1,10 +1,68 @@ package io.toolisticon.kotlin.generation +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation +import io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation +import io.toolisticon.kotlin.generation.builder.KotlinAnnotationSpecBuilder +import io.toolisticon.kotlin.generation.spec.toBuilder +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test +import kotlin.reflect.KClass internal class KotlinAnnotationTest { + + annotation class Foo( + val bar: String, + val x: String = "", + val type: KClass<*> = String::class + ) + + + + @Test + fun buildMyAnnotation() { + val annotation = buildAnnotation(MyAnnotation::class) { + addStringMember("name", "foo") + addKClassMember("type", String::class) + } + + assertThat(annotation.code).isEqualTo("""@io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation(name = "foo", type = kotlin.String::class)"""); + } + + @Test - fun name() { - TODO("Not yet implemented") + fun `create Foo annotation`() { + val spec = KotlinAnnotationSpecBuilder.builder(Foo::class) + .addMember("bar = %S", "hello world") + .addStringMember("x", "foo") + .addKClassMember("type", Long::class) + .build() + + assertThat(spec.code).isEqualTo("""@io.toolisticon.kotlin.generation.KotlinAnnotationTest.Foo(bar = "hello world", x = "foo", type = kotlin.Long::class)""") + assertThat(spec.members).hasSize(3) + + assertThat(spec).hasToString( + "KotlinAnnotationSpec(" + + "typeName=io.toolisticon.kotlin.generation.KotlinAnnotationTest.Foo, " + + "members=[" + + "bar = \"hello world\", " + + "x = \"foo\", " + + "type = kotlin.Long::class]" + + ")" + ) + } + + @Test + fun `use toBuilder to add members`() { + var spec = KotlinAnnotationSpecBuilder.builder(Foo::class) + .addMember("bar", "hello") + .build() + + assertThat(spec.members).hasSize(1) + + spec = spec.toBuilder() + .addMember("type", Int::class) + .build() + + assertThat(spec.members).hasSize(2) } } diff --git a/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt index 47a6f63..b05ec51 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt @@ -19,18 +19,8 @@ internal class KotlinValueClassTest { addAnnotation(TestFixtures.myAnnotationSpec) }) } - //val builder = valueClassBuilder_BAK("test","Foo") -// .primaryConstructor( -// constructorPropertyBuilder("bar", String::class.asClassName()) -// .addAnnotation(TestFixtures.myAnnotationSpec) -// ) - print(toFileSpec(valueClass).get().toString()) - - - //val spec = builder.build() - - assertThat(toFileSpec(valueClass).get().toString().trim()).isEqualTo( + assertThat(toFileSpec(valueClass).code.trim()).isEqualTo( """package test import io.toolisticon.kotlin.generation.TestFixtures diff --git a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt index 7ce0b8e..814406c 100644 --- a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt +++ b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt @@ -1,11 +1,15 @@ package io.toolisticon.kotlin.generation import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation +import kotlin.reflect.KClass object TestFixtures { @Target(AnnotationTarget.VALUE_PARAMETER) - annotation class MyAnnotation() + annotation class MyAnnotation( + val name: String, + val type: KClass<*> + ) val myAnnotationSpec = buildAnnotation(MyAnnotation::class) From f3d751d8cece78721f6d3d870270450d33bc35a2 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Fri, 21 Jun 2024 16:07:36 +0200 Subject: [PATCH 13/19] chore: wip --- .../src/main/kotlin/_builder.kt | 18 --------------- .../src/main/kotlin/_types.kt | 2 ++ .../KotlinAnnotationClassSpecBuilder.kt | 5 +++++ .../builder/KotlinEnumClassSpecBuilder.kt | 5 +++++ .../builder/{_type-aliases.kt => _types.kt} | 0 .../kotlin/spec/KotlinAnnotationClassSpec.kt | 1 + .../main/kotlin/spec/KotlinAnnotationSpec.kt | 2 ++ .../kotlin/spec/KotlinAnonymousClassSpec.kt | 1 + .../src/main/kotlin/spec/KotlinClassSpec.kt | 1 + .../kotlin/spec/KotlinCompanionObjectSpec.kt | 1 + .../spec/KotlinConstructorPropertySpec.kt | 2 ++ .../main/kotlin/spec/KotlinDataClassSpec.kt | 1 + .../main/kotlin/spec/KotlinEnumClassSpec.kt | 1 + .../src/main/kotlin/spec/KotlinFileSpec.kt | 2 ++ .../src/main/kotlin/spec/KotlinFunSpec.kt | 1 + .../main/kotlin/spec/KotlinInterfaceSpec.kt | 1 + .../src/main/kotlin/spec/KotlinObjectSpec.kt | 1 + .../main/kotlin/spec/KotlinParameterSpec.kt | 1 + .../main/kotlin/spec/KotlinPropertySpec.kt | 1 + .../main/kotlin/spec/KotlinTypeAliasSpec.kt | 1 + .../main/kotlin/spec/KotlinValueClassSpec.kt | 1 + .../src/main/kotlin/spec/_types.kt | 22 ++++--------------- 22 files changed, 35 insertions(+), 36 deletions(-) delete mode 100644 kotlin-code-generation/src/main/kotlin/_builder.kt rename kotlin-code-generation/src/main/kotlin/builder/{_type-aliases.kt => _types.kt} (100%) diff --git a/kotlin-code-generation/src/main/kotlin/_builder.kt b/kotlin-code-generation/src/main/kotlin/_builder.kt deleted file mode 100644 index ac4d91b..0000000 --- a/kotlin-code-generation/src/main/kotlin/_builder.kt +++ /dev/null @@ -1,18 +0,0 @@ -package io.toolisticon.kotlin.generation - -import com.squareup.kotlinpoet.* -import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec -import java.util.function.Supplier - -interface BuilderSupplier

: Builder

, Supplier - -interface SpecSupplier : Supplier -interface AnnotationSpecSupplier1 : SpecSupplier -interface ConstructorPropertySupplier1 : SpecSupplier -interface FileSpecSupplier1 : SpecSupplier -interface FunSpecSupplier1 : SpecSupplier -interface ParameterSpecSupplier1 : SpecSupplier -interface PropertySpecSupplier1 : SpecSupplier -interface TypeAliasSpecSupplier1 : SpecSupplier -interface TypeSpecSupplier1 : SpecSupplier - diff --git a/kotlin-code-generation/src/main/kotlin/_types.kt b/kotlin-code-generation/src/main/kotlin/_types.kt index 16c13f9..9883925 100644 --- a/kotlin-code-generation/src/main/kotlin/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/_types.kt @@ -2,6 +2,7 @@ package io.toolisticon.kotlin.generation import io.toolisticon.kotlin.generation.poet.PoetSpecSupplier import io.toolisticon.kotlin.generation.spec.* +import java.util.function.Supplier /** @@ -11,4 +12,5 @@ fun interface Builder { fun build(): PRODUCT } +interface BuilderSupplier

: Builder

, Supplier diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt index ac79677..80c6a6f 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder @@ -25,6 +26,10 @@ class KotlinAnnotationClassSpecBuilder internal constructor( ) } + init { + delegate.addModifiers(KModifier.ANNOTATION) + } + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt index 9b407f8..4cc0dfb 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder @@ -24,6 +25,10 @@ class KotlinEnumClassSpecBuilder internal constructor( } + init { + delegate.addModifiers(KModifier.ENUM) + } + // companion object :KLogging() { // fun builder(className: ClassName) = KotlinEnumClassSpecBuilder( // delegate = TypeSpecBuilder.enumBuilder(className) diff --git a/kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt b/kotlin-code-generation/src/main/kotlin/builder/_types.kt similarity index 100% rename from kotlin-code-generation/src/main/kotlin/builder/_type-aliases.kt rename to kotlin-code-generation/src/main/kotlin/builder/_types.kt diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt index 24978f4..4f1ab8b 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt @@ -13,3 +13,4 @@ data class KotlinAnnotationClassSpec( override fun get(): TypeSpec = spec } +interface KotlinAnnotationClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt index 3e55d8e..1d3cc87 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt @@ -26,4 +26,6 @@ data class KotlinAnnotationSpec( } +interface KotlinAnnotationSpecSupplier : KotlinGeneratorSpecSupplier, AnnotationSpecSupplier + fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationSpecBuilder.from(spec = this) diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt index 4ab506d..c2eac76 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt @@ -9,3 +9,4 @@ data class KotlinAnonymousClassSpec( override fun spec(): KotlinAnonymousClassSpec = this override fun get(): TypeSpec = spec } +interface KotlinAnonymousClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt index b81b7e0..0a30d77 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt @@ -21,3 +21,4 @@ data class KotlinClassSpec( //fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() // TODO fun KotlinDataClassSpec.toBuilder() = KotlinDataClassBuilder.from(spec = this) // TODO fun KotlinDataClassSpec.toFileSpec() = KotlinFileSpecBuilder.builder(this).build() +interface KotlinClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt index d38a8f8..d2c3238 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt @@ -9,3 +9,4 @@ data class KotlinCompanionObjectSpec( override fun spec(): KotlinCompanionObjectSpec = this override fun get(): TypeSpec = spec } +interface KotlinCompanionObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt index e1723db..60fb520 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt @@ -11,3 +11,5 @@ data class KotlinConstructorPropertySpec( val type: TypeName = property.type override fun spec(): KotlinConstructorPropertySpec = this } + +interface KotlinConstructorPropertySpecSupplier : KotlinGeneratorSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt index fafba0a..76325c0 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt @@ -22,3 +22,4 @@ data class KotlinDataClassSpec( //fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() // TODO fun KotlinDataClassSpec.toBuilder() = KotlinDataClassBuilder.from(spec = this) // TODO fun KotlinDataClassSpec.toFileSpec() = KotlinFileSpecBuilder.builder(this).build() +interface KotlinDataClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt index 542850b..7f78d18 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt @@ -14,3 +14,4 @@ data class KotlinEnumClassSpec( override fun spec(): KotlinEnumClassSpec = this override fun get(): TypeSpec = spec } +interface KotlinEnumClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt index bb1c345..c59863d 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt @@ -17,3 +17,5 @@ data class KotlinFileSpec( override fun spec(): KotlinFileSpec = this override fun get(): FileSpec = spec } + +interface KotlinFileSpecSupplier : KotlinGeneratorSpecSupplier, FileSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt index db724a4..7dc5611 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt @@ -9,3 +9,4 @@ data class KotlinFunSpec( override fun spec(): KotlinFunSpec = this override fun get(): FunSpec = spec } +interface KotlinFunSpecSupplier : KotlinGeneratorSpecSupplier, FunSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt index 559511c..059ce99 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt @@ -9,3 +9,4 @@ data class KotlinInterfaceSpec( override fun spec(): KotlinInterfaceSpec = this override fun get(): TypeSpec = spec } +interface KotlinInterfaceSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt index 8394de2..51a602e 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt @@ -10,3 +10,4 @@ data class KotlinObjectSpec( override fun spec(): KotlinObjectSpec = this override fun get(): TypeSpec = spec } +interface KotlinObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt index c90b1b3..34e33a6 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt @@ -16,3 +16,4 @@ data class KotlinParameterSpec( override fun get(): ParameterSpec = this.spec } +interface KotlinParameterSpecSupplier : KotlinGeneratorSpecSupplier, ParameterSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt index 726db4b..b8ed17d 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt @@ -28,3 +28,4 @@ data class KotlinPropertySpec( } // TODO fun KotlinPropertySpec.toBuilder() = KotlinPropertyBuilder.builder(spec = this) +interface KotlinPropertySpecSupplier : KotlinGeneratorSpecSupplier, PropertySpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt index 64a4fdb..0943345 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt @@ -9,3 +9,4 @@ data class KotlinTypeAliasSpec( override fun spec(): KotlinTypeAliasSpec = this override fun get(): TypeAliasSpec = spec } +interface KotlinTypeAliasSpecSupplier: KotlinGeneratorSpecSupplier, TypeAliasSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt index 0804ca5..6708656 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt @@ -19,3 +19,4 @@ data class KotlinValueClassSpec( } // fun KotlinValueClassSpec.toBuilder() = KotlinValueClassBuilder.builder(spec = this) +interface KotlinValueClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier diff --git a/kotlin-code-generation/src/main/kotlin/spec/_types.kt b/kotlin-code-generation/src/main/kotlin/spec/_types.kt index b926703..3c63c85 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/_types.kt @@ -16,21 +16,7 @@ interface KotlinGeneratorTypeSpec> : Kotlin override fun spec(): SELF } -interface KotlinAnnotationSpecSupplier : KotlinGeneratorSpecSupplier, AnnotationSpecSupplier -interface KotlinFileSpecSupplier : KotlinGeneratorSpecSupplier, FileSpecSupplier -interface KotlinFunSpecSupplier : KotlinGeneratorSpecSupplier, FunSpecSupplier -interface KotlinParameterSpecSupplier : KotlinGeneratorSpecSupplier, ParameterSpecSupplier -interface KotlinPropertySpecSupplier : KotlinGeneratorSpecSupplier, PropertySpecSupplier -interface KotlinTypeAliasSpecSupplier: KotlinGeneratorSpecSupplier, TypeAliasSpecSupplier - -interface KotlinAnnotationClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinAnonymousClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinCompanionObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinDataClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinEnumClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinInterfaceSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier -interface KotlinValueClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier - -interface KotlinConstructorPropertySpecSupplier : KotlinGeneratorSpecSupplier + + + + From 5dbd9f7110ec0b36f0842d33bed3e706eef568ba Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Fri, 28 Jun 2024 15:42:23 +0200 Subject: [PATCH 14/19] chore: wip --- _mvn/parent/pom.xml | 51 ++++++++++++++++++++ {_bom => kotlin-code-generation-bom}/pom.xml | 0 kotlin-code-generation/pom.xml | 3 +- pom.xml | 23 ++------- 4 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 _mvn/parent/pom.xml rename {_bom => kotlin-code-generation-bom}/pom.xml (100%) diff --git a/_mvn/parent/pom.xml b/_mvn/parent/pom.xml new file mode 100644 index 0000000..5c8b17b --- /dev/null +++ b/_mvn/parent/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + + + io.toolisticon.kotlin.generation._ + kotlin-code-generation-root + 0.0.1-SNAPSHOT + + + kotlin-code-generation-parent + pom: ${project.artifactId} + Common parent pom for all modules. + pom + + + 1.17.0 + 0.5.0-alpha08 + + + + + + com.squareup + kotlinpoet-jvm + ${kotlin-poet.version} + + + + dev.zacsweers.kctfork + core + test + ${kotlin-compile-testing.version} + + + + org.assertj + assertj-core + 3.26.0 + test + + + ch.qos.logback + logback-classic + 1.5.6 + test + + + + + diff --git a/_bom/pom.xml b/kotlin-code-generation-bom/pom.xml similarity index 100% rename from _bom/pom.xml rename to kotlin-code-generation-bom/pom.xml diff --git a/kotlin-code-generation/pom.xml b/kotlin-code-generation/pom.xml index 197c1e8..02d56f4 100644 --- a/kotlin-code-generation/pom.xml +++ b/kotlin-code-generation/pom.xml @@ -4,8 +4,9 @@ io.toolisticon.kotlin.generation._ - kotlin-code-generation-root + kotlin-code-generation-parent 0.0.1-SNAPSHOT + ../_mvn/parent/pom.xml io.toolisticon.kotlin.generation diff --git a/pom.xml b/pom.xml index ecb8d7f..a704994 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ io.toolisticon.maven.parent maven-parent-kotlin-base - 2024.5.2 + 2024.6.1 @@ -19,30 +19,15 @@ pom - _bom - + kotlin-code-generation-bom + _mvn/parent kotlin-code-generation - - - - org.assertj - assertj-core - 3.26.0 - test - - - ch.qos.logback - logback-classic - 1.5.6 - test - - - + From 15117ee014340fd31a832090e02521a2fbebf2e3 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Tue, 2 Jul 2024 20:21:36 +0200 Subject: [PATCH 15/19] chore: wip --- .../src/_BAK/KotlinCompanionObjectBuilder.kt | 24 ---- .../src/_BAK/KotlinFileBuilder.kt | 58 ---------- .../src/_BAK/KotlinPropertySpecBuilder.kt | 43 ------- .../src/_BAK/poet/AnnotationSpecBuilder.kt | 33 ------ .../src/_BAK/poet/FileSpecBuilder.kt | 65 ----------- .../src/_BAK/poet/FunSpecBuilder.kt | 75 ------------ .../src/_BAK/poet/ParameterSpecBuilder.kt | 37 ------ .../src/_BAK/poet/PropertySpecBuilder.kt | 46 -------- .../src/_BAK/poet/TaggableBuilder.kt | 10 -- .../src/_BAK/poet/TypeAliasSpecBuilder.kt | 28 ----- .../src/_BAK/poet/TypeSpecBuilder.kt | 70 ----------- .../src/_BAK/poet/TypeSpecHolderBuilder.kt | 12 -- .../_BAK/poet/TypeVariableHolderBuilder.kt | 19 --- .../src/_TEST/KotlinAnnotationSpecTest.kt | 53 --------- .../src/_TEST/KotlinDataClassSpecTest.kt | 32 ----- .../builder/KotlinValueClassBuilderTest.kt | 30 ----- .../_TEST/poet/AnnotationSpecBuilderTest.kt | 16 --- .../src/main/kotlin/KotlinCodeGeneration.kt | 66 ++++++++--- .../src/main/kotlin/_lang.kt | 5 + .../src/main/kotlin/_types.kt | 2 - .../KotlinAnnotationClassSpecBuilder.kt | 36 ++++-- .../KotlinCompanionObjectSpecBuilder.kt | 109 ------------------ .../KotlinConstructorPropertySpecBuilder.kt | 15 ++- .../builder/KotlinDataClassSpecBuilder.kt | 77 +++++-------- .../kotlin/builder/KotlinFileSpecBuilder.kt | 8 +- .../builder/KotlinPropertySpecBuilder.kt | 6 +- .../builder/KotlinValueClassSpecBuilder.kt | 11 ++ .../src/main/kotlin/builder/_types.kt | 19 +++ .../src/main/kotlin/poet/TypeSpecBuilder.kt | 12 +- .../kotlin/spec/KotlinAnnotationClassSpec.kt | 4 +- .../main/kotlin/spec/KotlinAnnotationSpec.kt | 4 +- .../kotlin/spec/KotlinAnonymousClassSpec.kt | 4 +- .../src/main/kotlin/spec/KotlinClassSpec.kt | 4 +- .../kotlin/spec/KotlinCompanionObjectSpec.kt | 5 +- .../spec/KotlinConstructorPropertySpec.kt | 11 +- .../main/kotlin/spec/KotlinDataClassSpec.kt | 4 +- .../main/kotlin/spec/KotlinEnumClassSpec.kt | 4 +- .../src/main/kotlin/spec/KotlinFileSpec.kt | 4 +- .../src/main/kotlin/spec/KotlinFunSpec.kt | 5 +- .../main/kotlin/spec/KotlinInterfaceSpec.kt | 5 +- .../src/main/kotlin/spec/KotlinObjectSpec.kt | 5 +- .../main/kotlin/spec/KotlinParameterSpec.kt | 4 +- .../main/kotlin/spec/KotlinPropertySpec.kt | 5 +- .../main/kotlin/spec/KotlinTypeAliasSpec.kt | 5 +- .../main/kotlin/spec/KotlinValueClassSpec.kt | 4 +- .../test/kotlin/KotlinAnnotationClassTest.kt | 12 +- .../kotlin/KotlinConstructorPropertyTest.kt | 6 + .../src/test/kotlin/KotlinDataClassTest.kt | 40 ++++++- .../src/test/kotlin/KotlinValueClassTest.kt | 30 ++++- .../src/test/kotlin/TestFixtures.kt | 4 + .../kotlin}/poet/TypeSpecBuilderTest.kt | 18 ++- 51 files changed, 326 insertions(+), 878 deletions(-) delete mode 100644 kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinFileBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt delete mode 100644 kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt delete mode 100644 kotlin-code-generation/src/_TEST/KotlinAnnotationSpecTest.kt delete mode 100644 kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt delete mode 100644 kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt delete mode 100644 kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt create mode 100644 kotlin-code-generation/src/main/kotlin/_lang.kt delete mode 100644 kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt rename kotlin-code-generation/src/{_TEST => test/kotlin}/poet/TypeSpecBuilderTest.kt (52%) diff --git a/kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt deleted file mode 100644 index 3fa6ba0..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinCompanionObjectBuilder.kt +++ /dev/null @@ -1,24 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinCompanionObjectSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - -class KotlinCompanionObjectBuilder internal constructor( - private val delegate: TypeSpecBuilder -) : Builder, TypeSpecSupplier { - - companion object { - fun builder(name: String? = null) = KotlinCompanionObjectBuilder( - delegate = TypeSpecBuilder.companionObjectBuilder(name) - ) - } - operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinCompanionObjectBuilder = apply { - delegate.block() - } - - override fun build(): KotlinCompanionObjectSpec = KotlinCompanionObjectSpec(spec = delegate.build()) - override fun get(): TypeSpec = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/KotlinFileBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinFileBuilder.kt deleted file mode 100644 index 150aff5..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinFileBuilder.kt +++ /dev/null @@ -1,58 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.FileSpec -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME -import io.toolisticon.kotlin.generation._BAK.FileSpecSupplier -import io.toolisticon.kotlin.generation._BAK.KotlinDataClassSpec -import io.toolisticon.kotlin.generation._BAK.KotlinFileSpec -import io.toolisticon.kotlin.generation._BAK.TypeSpecSupplier - - -class KotlinFileBuilder internal constructor(delegate: FileSpec.Builder) : KotlinPoetSpecBuilder( - delegate = delegate -), FileSpecSupplier, KotlinAnnotatableBuilder { - - @Suppress(CLASS_NAME) - object builder : ToKotlinPoetSpecBuilder { - operator fun invoke(className: ClassName, block: FileSpecBuilderReceiver = {}) = invoke( - other = FileSpec.builder(className), - block = block - ) - - - operator fun invoke(packageName: String, fileName: String, block: FileSpecBuilderReceiver = {}) = invoke( - className = ClassName(packageName, fileName), - block = block - ) - - operator fun invoke(other: FileSpec.Builder, block: FileSpecBuilderReceiver = {}) = KotlinFileBuilder( - delegate = other - ).invoke(block) - - operator fun invoke(dataClass: KotlinDataClassSpec) = invoke( - className = dataClass.className, - block = { - this.addType(dataClass.get()) - } - ) - - operator fun invoke(dataClassBuilder: KotlinDataClassSpecBuilder) = invoke( - dataClass = dataClassBuilder.build() - ) - - override fun invoke(spec: KotlinFileSpec) = KotlinFileBuilder(delegate = spec.get().toBuilder()) - } - - fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { - delegate.addType(typeSpecSupplier.get()) - } - - override fun build(): KotlinFileSpec = KotlinFileSpec(delegate.build()) - override fun get(): FileSpec = build().get() - - override fun addAnnotation(annotationSpec: AnnotationSpec): KotlinFileBuilder = invoke { - addAnnotation(annotationSpec) - } -} diff --git a/kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt deleted file mode 100644 index d790385..0000000 --- a/kotlin-code-generation/src/_BAK/KotlinPropertySpecBuilder.kt +++ /dev/null @@ -1,43 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.PropertySpec -import com.squareup.kotlinpoet.TypeName -import io.toolisticon.kotlin.generation.Builder -import io.toolisticon.kotlin.generation._BAK.poet.PropertySpecBuilder -import io.toolisticon.kotlin.generation._BAK.KotlinPropertySpec -import io.toolisticon.kotlin.generation._BAK.PropertySpecSupplier - -class KotlinPropertySpecBuilder( - private val name: String, - private val type: TypeName, - private val delegate: PropertySpecBuilder -) : Builder, PropertySpecSupplier { - companion object { - fun builder(name: String, type: TypeName, vararg modifiers: KModifier): KotlinPropertySpecBuilder = KotlinPropertySpecBuilder( - name = name, - type = type, - delegate = PropertySpecBuilder.builder(name, type, *modifiers) - ) - } - - operator fun invoke(block: PropertySpecBuilder.() -> Unit): KotlinPropertySpecBuilder = apply { - delegate.block() - } - - fun addAnnotation(annotationSpec: AnnotationSpec): KotlinPropertySpecBuilder = invoke { - addAnnotation(annotationSpec) - } - - fun makePrivate() = invoke { - addModifiers(KModifier.PRIVATE) - } - - fun makeFinal() = invoke { - addModifiers(KModifier.PRIVATE) - } - - override fun build(): KotlinPropertySpec = KotlinPropertySpec(spec = delegate.build()) - override fun get(): PropertySpec = build().get() -} diff --git a/kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt deleted file mode 100644 index d95b6a4..0000000 --- a/kotlin-code-generation/src/_BAK/poet/AnnotationSpecBuilder.kt +++ /dev/null @@ -1,33 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.AnnotationSpec.Builder -import com.squareup.kotlinpoet.AnnotationSpec.UseSiteTarget -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.ParameterizedTypeName -import io.toolisticon.kotlin.generation.BuilderSupplier -import kotlin.reflect.KClass - -typealias AnnotationSpecBuilderReceiver = AnnotationSpecBuilder.() -> Unit - -@JvmInline -value class AnnotationSpecBuilder(val builder: Builder) : BuilderSupplier, - TaggableBuilder { - companion object { - internal fun Builder.wrap() = AnnotationSpecBuilder(this) - fun builder(type: ClassName): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() - fun builder(type: ParameterizedTypeName): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() - fun builder(type: KClass): AnnotationSpecBuilder = AnnotationSpec.builder(type).wrap() - } - - val members: MutableList get() = get().members - - fun addMember(format: String, vararg args: Any): AnnotationSpecBuilder = apply { builder.addMember(format, *args) } - fun addMember(codeBlock: CodeBlock): AnnotationSpecBuilder = apply { builder.addMember(codeBlock) } - fun addMember(builder: CodeBlockBuilder): AnnotationSpecBuilder = addMember(builder.build()) - fun useSiteTarget(useSiteTarget: UseSiteTarget): AnnotationSpecBuilder = apply { builder.useSiteTarget(useSiteTarget) } - - override fun build(): AnnotationSpec = builder.build() - override fun get(): Builder = builder -} diff --git a/kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt deleted file mode 100644 index 2267aa7..0000000 --- a/kotlin-code-generation/src/_BAK/poet/FileSpecBuilder.kt +++ /dev/null @@ -1,65 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.* -import com.squareup.kotlinpoet.FileSpec.Builder -import io.toolisticon.kotlin.generation.BuilderSupplier -import kotlin.reflect.KClass - -typealias FileSpecBuilderReceiver = FileSpecBuilder.() -> Unit - -@JvmInline -value class FileSpecBuilder(private val builder: Builder) : BuilderSupplier, - AnnotatableBuilder, - MemberSpecHolderBuilder, - TaggableBuilder, - TypeSpecHolderBuilder { - companion object { - private fun Builder.wrap() = FileSpecBuilder(this) - fun get(packageName: String, typeSpec: TypeSpec): FileSpec = FileSpec.get(packageName, typeSpec) - fun builder(className: ClassName): FileSpecBuilder = FileSpec.builder(className).wrap() - fun builder(memberName: MemberName): FileSpecBuilder = FileSpec.builder(memberName).wrap() - fun builder(packageName: String, fileName: String): FileSpecBuilder = FileSpec.builder(packageName, fileName).wrap() - fun scriptBuilder(fileName: String, packageName: String = ""): FileSpecBuilder = FileSpec.scriptBuilder(fileName, packageName).wrap() - } - - val defaultImports: MutableSet get() = builder.defaultImports - val imports: List get() = builder.imports - val members: MutableList get() = builder.members - - fun addAliasedImport(type: KClass<*>, alias: String): FileSpecBuilder = addAliasedImport(type.asClassName(), alias) - fun addAliasedImport(className: ClassName, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(className, alias) } - fun addAliasedImport(className: ClassName, memberName: String, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(className, memberName, alias) } - fun addAliasedImport(memberName: MemberName, alias: String): FileSpecBuilder = apply { builder.addAliasedImport(memberName, alias) } - fun addBodyComment(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addBodyComment(format, *args) } - fun addCode(format: String, vararg args: Any?): FileSpecBuilder = apply { builder.addCode(format, *args) } - fun addCode(codeBlock: CodeBlock): FileSpecBuilder = apply { builder.addCode(codeBlock) } - fun addCode(builder: CodeBlockBuilder): FileSpecBuilder = addCode(builder.build()) - fun addDefaultPackageImport(packageName: String): FileSpecBuilder = apply { builder.addDefaultPackageImport(packageName) } - fun addFileComment(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addFileComment(format, *args) } - override fun addFunction(funSpec: FunSpec): FileSpecBuilder = apply { builder.addFunction(funSpec) } - fun addImport(constant: Enum<*>): FileSpecBuilder = apply { builder.addImport(constant) } - fun addImport(type: KClass<*>, vararg names: String): FileSpecBuilder = apply { builder.addImport(type, *names) } - fun addImport(className: ClassName, vararg names: String): FileSpecBuilder = apply { builder.addImport(className, *names) } - fun addImport(type: KClass<*>, names: Iterable): FileSpecBuilder = addImport(type.asClassName(), names) - fun addImport(className: ClassName, names: Iterable): FileSpecBuilder = apply { builder.addImport(className, names) } - fun addImport(packageName: String, vararg names: String): FileSpecBuilder = apply { builder.addImport(packageName, *names) } - fun addImport(import: Import): FileSpecBuilder = apply { builder.addImport(import) } - fun addImport(packageName: String, names: Iterable): FileSpecBuilder = apply { builder.addImport(packageName, names) } - fun addKotlinDefaultImports(includeJvm: Boolean = true, includeJs: Boolean = true): FileSpecBuilder = apply { builder.addKotlinDefaultImports(includeJvm, includeJs) } - fun addNamedCode(format: String, args: Map): FileSpecBuilder = apply { builder.addNamedCode(format, args) } - override fun addProperty(propertySpec: PropertySpec): FileSpecBuilder = apply { builder.addProperty(propertySpec) } - fun addStatement(format: String, vararg args: Any): FileSpecBuilder = apply { builder.addStatement(format, *args) } - override fun addType(typeSpec: TypeSpec): FileSpecBuilder = apply { builder.addType(typeSpec) } - fun addTypeAlias(typeAliasSpec: TypeAliasSpec): FileSpecBuilder = apply { builder.addTypeAlias(typeAliasSpec) } - fun addTypeAlias(builder: TypeAliasSpecBuilder): FileSpecBuilder = addTypeAlias(builder.build()) - fun beginControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = apply { builder.beginControlFlow(controlFlow, *args) } - fun clearBody(): FileSpecBuilder = apply { builder.clearBody() } - fun clearComment(): FileSpecBuilder = apply { builder.clearComment() } - fun clearImports(): FileSpecBuilder = apply { builder.clearImports() } - fun endControlFlow(): FileSpecBuilder = apply { builder.endControlFlow() } - fun indent(indent: String): FileSpecBuilder = apply { builder.indent(indent) } - fun nextControlFlow(controlFlow: String, vararg args: Any): FileSpecBuilder = apply { builder.nextControlFlow(controlFlow, *args) } - - override fun build(): FileSpec = builder.build() - override fun get(): Builder = builder -} diff --git a/kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt deleted file mode 100644 index f0e5736..0000000 --- a/kotlin-code-generation/src/_BAK/poet/FunSpecBuilder.kt +++ /dev/null @@ -1,75 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.* -import com.squareup.kotlinpoet.FunSpec.Builder -import io.toolisticon.kotlin.generation.BuilderSupplier -import java.lang.reflect.Type -import javax.lang.model.element.Modifier -import kotlin.reflect.KClass - -typealias FunSpecBuilderReceiver = FunSpecBuilder.() -> Unit - -@OptIn(ExperimentalKotlinPoetApi::class) -@JvmInline -value class FunSpecBuilder(private val builder: Builder) : BuilderSupplier, - AnnotatableBuilder, - ContextReceivableBuilder, - DocumentableBuilder, - KModifierHolderBuilder, - OriginatingElementsHolderBuilder, - TaggableBuilder, - TypeVariableHolderBuilder { - companion object { - private fun Builder.wrap() = FunSpecBuilder(this) - fun builder(name: String): FunSpecBuilder = FunSpec.builder(name).wrap() - fun builder(memberName: MemberName): FunSpecBuilder = FunSpec.builder(memberName).wrap() - - fun constructorBuilder(): FunSpecBuilder = FunSpec.constructorBuilder().wrap() - fun getterBuilder(): FunSpecBuilder = FunSpec.getterBuilder().wrap() - fun setterBuilder(): FunSpecBuilder = FunSpec.setterBuilder().wrap() - } - - override val modifiers: MutableList get() = builder.modifiers - override val typeVariables: MutableList get() = builder.typeVariables - val parameters: MutableList get() = builder.parameters - - fun addCode(codeBlock: CodeBlock): FunSpecBuilder = apply { builder.addCode(codeBlock) } - fun addCode(format: String, vararg args: Any?): FunSpecBuilder = apply { builder.addCode(format, *args) } - fun addComment(format: String, vararg args: Any): FunSpecBuilder = apply { builder.addComment("//·${format.replace(' ', '·')}\n", *args) } - fun addNamedCode(format: String, args: Map): FunSpecBuilder = apply { builder.addNamedCode(format, args) } - fun addParameter(parameterSpec: ParameterSpec): FunSpecBuilder = apply { builder.addParameter(parameterSpec) } - fun addParameter(name: String, type: TypeName, vararg modifiers: KModifier): FunSpecBuilder = addParameter(ParameterSpec.builder(name, type, *modifiers).build()) - fun addParameter(name: String, type: Type, vararg modifiers: KModifier): FunSpecBuilder = addParameter(name, type.asTypeName(), *modifiers) - fun addParameter(name: String, type: KClass<*>, vararg modifiers: KModifier): FunSpecBuilder = addParameter(name, type.asTypeName(), *modifiers) - fun addParameter(name: String, type: TypeName, modifiers: Iterable): FunSpecBuilder = addParameter(ParameterSpec.builder(name, type, modifiers).build()) - fun addParameter(name: String, type: Type, modifiers: Iterable): FunSpecBuilder = addParameter(name, type.asTypeName(), modifiers) - fun addParameter(name: String, type: KClass<*>, modifiers: Iterable): FunSpecBuilder = addParameter(name, type.asTypeName(), modifiers) - fun addParameters(parameterSpecs: Iterable): FunSpecBuilder = apply { builder.addParameters(parameterSpecs) } - fun addStatement(format: String, vararg args: Any): FunSpecBuilder = apply { builder.addStatement(format, *args) } - fun beginControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = apply { builder.beginControlFlow(controlFlow, *args) } - fun callSuperConstructor(args: Iterable): FunSpecBuilder = apply { builder.callSuperConstructor(args.toList()) } - fun callSuperConstructor(args: List): FunSpecBuilder = apply { builder.callSuperConstructor(args) } - fun callSuperConstructor(vararg args: String): FunSpecBuilder = apply { builder.callSuperConstructor(args.map { CodeBlock.of(it) }) } - fun callSuperConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = apply { builder.callSuperConstructor(args.toList()) } - fun callThisConstructor(args: List): FunSpecBuilder = apply { builder.callThisConstructor(args) } - fun callThisConstructor(args: Iterable): FunSpecBuilder = apply { builder.callThisConstructor(args.toList()) } - fun callThisConstructor(vararg args: String): FunSpecBuilder = apply { builder.callThisConstructor(args.map { CodeBlock.of(it) }) } - fun callThisConstructor(vararg args: CodeBlock = emptyArray()): FunSpecBuilder = apply { builder.callThisConstructor(args.toList()) } - fun clearBody(): FunSpecBuilder = apply { builder.clearBody() } - fun endControlFlow(): FunSpecBuilder = apply { builder.endControlFlow() } - fun jvmModifiers(modifiers: Iterable): FunSpecBuilder = apply { builder.jvmModifiers(modifiers) } - fun nextControlFlow(controlFlow: String, vararg args: Any): FunSpecBuilder = apply { builder.nextControlFlow(controlFlow, *args) } - fun receiver(receiverType: TypeName, kdoc: CodeBlock): FunSpecBuilder = apply { builder.receiver(receiverType, kdoc) } - fun receiver(receiverType: Type, kdoc: CodeBlock): FunSpecBuilder = receiver(receiverType.asTypeName(), kdoc) - fun receiver(receiverType: Type, kdoc: String, vararg args: Any): FunSpecBuilder = receiver(receiverType, CodeBlock.of(kdoc, args)) - fun receiver(receiverType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = receiver(receiverType.asTypeName(), kdoc) - fun receiver(receiverType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = receiver(receiverType, CodeBlock.of(kdoc, args)) - fun returns(returnType: TypeName, kdoc: CodeBlock): FunSpecBuilder = apply { builder.returns(returnType, kdoc) } - fun returns(returnType: Type, kdoc: CodeBlock): FunSpecBuilder = returns(returnType.asTypeName(), kdoc) - fun returns(returnType: Type, kdoc: String, vararg args: Any): FunSpecBuilder = returns(returnType.asTypeName(), CodeBlock.of(kdoc, args)) - fun returns(returnType: KClass<*>, kdoc: CodeBlock): FunSpecBuilder = returns(returnType.asTypeName(), kdoc) - fun returns(returnType: KClass<*>, kdoc: String, vararg args: Any): FunSpecBuilder = returns(returnType.asTypeName(), CodeBlock.of(kdoc, args)) - - override fun build(): FunSpec = builder.build() - override fun get(): Builder = builder -} diff --git a/kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt deleted file mode 100644 index 896a808..0000000 --- a/kotlin-code-generation/src/_BAK/poet/ParameterSpecBuilder.kt +++ /dev/null @@ -1,37 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.* -import com.squareup.kotlinpoet.ParameterSpec.Builder -import io.toolisticon.kotlin.generation.BuilderSupplier -import java.lang.reflect.Type -import kotlin.reflect.KClass - -typealias ParameterSpecBuilderReceiver = ParameterSpecBuilder.() -> Unit - -@JvmInline -value class ParameterSpecBuilder(private val builder: Builder) : BuilderSupplier, - AnnotatableBuilder, - DocumentableBuilder, - KModifierHolderBuilder, - TaggableBuilder { - companion object { - private fun Builder.wrap() = ParameterSpecBuilder(this) - fun builder(name: String, type: TypeName, vararg modifiers: KModifier): ParameterSpecBuilder = ParameterSpec.builder(name, type, *modifiers).wrap() - fun builder(name: String, type: Type, vararg modifiers: KModifier): ParameterSpecBuilder = builder(name, type.asTypeName(), *modifiers) - fun builder(name: String, type: KClass<*>, vararg modifiers: KModifier): ParameterSpecBuilder = builder(name, type.asTypeName(), *modifiers) - fun builder(name: String, type: TypeName, modifiers: Iterable): ParameterSpecBuilder = ParameterSpec.builder(name, type, modifiers).wrap() - fun builder(name: String, type: Type, modifiers: Iterable): ParameterSpecBuilder = ParameterSpec.builder(name, type.asTypeName(), modifiers).wrap() - fun builder(name: String, type: KClass<*>, modifiers: Iterable): ParameterSpecBuilder = builder(name, type.asTypeName(), modifiers) - fun unnamed(type: KClass<*>): ParameterSpec = unnamed(type.asTypeName()) - fun unnamed(type: Type): ParameterSpec = unnamed(type.asTypeName()) - fun unnamed(type: TypeName): ParameterSpec = ParameterSpec.unnamed(type) - } - - override val modifiers: MutableList get() = builder.modifiers - - fun defaultValue(format: String, vararg args: Any?): ParameterSpecBuilder = defaultValue(CodeBlock.of(format, *args)) - fun defaultValue(codeBlock: CodeBlock?): ParameterSpecBuilder = apply { builder.defaultValue(codeBlock) } - - override fun build(): ParameterSpec = builder.build() - override fun get(): Builder = builder -} diff --git a/kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt deleted file mode 100644 index bce67fb..0000000 --- a/kotlin-code-generation/src/_BAK/poet/PropertySpecBuilder.kt +++ /dev/null @@ -1,46 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.* -import com.squareup.kotlinpoet.PropertySpec.Builder -import io.toolisticon.kotlin.generation.BuilderSupplier -import java.lang.reflect.Type -import kotlin.reflect.KClass - -typealias PropertySpecBuilderReceiver = PropertySpecBuilder.() -> Unit - -@OptIn(ExperimentalKotlinPoetApi::class) -@JvmInline -value class PropertySpecBuilder(private val builder: Builder) : BuilderSupplier, - AnnotatableBuilder, - ContextReceivableBuilder, - DocumentableBuilder, - KModifierHolderBuilder, - TaggableBuilder, - TypeVariableHolderBuilder, - OriginatingElementsHolderBuilder { - companion object { - private fun Builder.wrap() = PropertySpecBuilder(this) - fun builder(name: String, type: TypeName, vararg modifiers: KModifier): PropertySpecBuilder = PropertySpec.builder(name, type, *modifiers).wrap() - fun builder(name: String, type: Type, vararg modifiers: KModifier): PropertySpecBuilder = builder(name, type.asTypeName(), *modifiers) - fun builder(name: String, type: KClass<*>, vararg modifiers: KModifier): PropertySpecBuilder = builder(name, type.asTypeName(), *modifiers) - fun builder(name: String, type: TypeName, modifiers: Iterable): PropertySpecBuilder = PropertySpec.builder(name, type, modifiers).wrap() - fun builder(name: String, type: KClass<*>, modifiers: Iterable): PropertySpecBuilder = builder(name, type.asTypeName(), modifiers) - } - - override val modifiers: MutableList get() = builder.modifiers - override val typeVariables: MutableList get() = builder.typeVariables - - fun delegate(codeBlock: CodeBlock): PropertySpecBuilder = apply { builder.delegate(codeBlock) } - fun delegate(format: String, vararg args: Any?): PropertySpecBuilder = delegate(CodeBlock.of(format, *args)) - fun getter(getter: FunSpec?): PropertySpecBuilder = apply { builder.getter(getter) } - fun initializer(format: String, vararg args: Any?): PropertySpecBuilder = initializer(CodeBlock.of(format, *args)) - fun initializer(codeBlock: CodeBlock?): PropertySpecBuilder = apply { builder.initializer(codeBlock) } - fun mutable(mutable: Boolean = true): PropertySpecBuilder = apply { builder.mutable(mutable) } - fun receiver(receiverType: TypeName?): PropertySpecBuilder = apply { builder.receiver(receiverType) } - fun receiver(receiverType: KClass<*>): PropertySpecBuilder = receiver(receiverType.asTypeName()) - fun setter(setter: FunSpec?): PropertySpecBuilder = apply { builder.setter(setter) } - - override fun build(): PropertySpec = builder.build() - override fun get(): Builder = builder -} - diff --git a/kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt deleted file mode 100644 index b306bee..0000000 --- a/kotlin-code-generation/src/_BAK/poet/TaggableBuilder.kt +++ /dev/null @@ -1,10 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.Taggable -import io.toolisticon.kotlin.generation.BuilderSupplier -import kotlin.reflect.KClass - -sealed interface TaggableBuilder, S : Taggable, B : Taggable.Builder> - : BuilderSupplier, Taggable.Builder { - override val tags: MutableMap, Any> get() = get().tags -} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt deleted file mode 100644 index e556e7e..0000000 --- a/kotlin-code-generation/src/_BAK/poet/TypeAliasSpecBuilder.kt +++ /dev/null @@ -1,28 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.* -import com.squareup.kotlinpoet.TypeAliasSpec.Builder -import io.toolisticon.kotlin.generation.BuilderSupplier -import kotlin.reflect.KClass - -typealias TypeAliasSpecBuilderReceiver = TypeAliasSpecBuilder.() -> Unit - -@JvmInline -value class TypeAliasSpecBuilder(private val builder: Builder) : BuilderSupplier, - AnnotatableBuilder, - DocumentableBuilder, - KModifierHolderBuilder, - TaggableBuilder, - TypeVariableHolderBuilder { - companion object { - private fun Builder.wrap() = TypeAliasSpecBuilder(this) - fun builder(name: String, type: TypeName): TypeAliasSpecBuilder = TypeAliasSpec.builder(name, type).wrap() - fun builder(name: String, type: KClass<*>): TypeAliasSpecBuilder = builder(name, type.asTypeName()) - } - - override val modifiers: MutableList get() = builder.modifiers.toMutableList() - override val typeVariables: MutableList get() = builder.typeVariables.toMutableList() - - override fun build(): TypeAliasSpec = builder.build() - override fun get(): Builder = builder -} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt deleted file mode 100644 index 54d91eb..0000000 --- a/kotlin-code-generation/src/_BAK/poet/TypeSpecBuilder.kt +++ /dev/null @@ -1,70 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.* -import com.squareup.kotlinpoet.TypeSpec.Builder -import io.toolisticon.kotlin.generation.BuilderSupplier -import kotlin.reflect.KClass - -typealias TypeSpecBuilderReceiver = TypeSpecBuilder.() -> Unit - -@JvmInline -@OptIn(ExperimentalKotlinPoetApi::class) -value class TypeSpecBuilder(private val builder: Builder) : BuilderSupplier, - AnnotatableBuilder, - ContextReceivableBuilder, - DocumentableBuilder, - KModifierHolderBuilder, - MemberSpecHolderBuilder, - OriginatingElementsHolderBuilder, - TaggableBuilder, - TypeSpecHolderBuilder, - TypeVariableHolderBuilder { - - companion object { - private fun Builder.wrap() = TypeSpecBuilder(this) - fun annotationBuilder(name: String): TypeSpecBuilder = TypeSpec.annotationBuilder(name).wrap() - fun annotationBuilder(className: ClassName): TypeSpecBuilder = annotationBuilder(className.simpleName) - fun anonymousClassBuilder(): TypeSpecBuilder = TypeSpec.anonymousClassBuilder().wrap() - fun classBuilder(name: String): TypeSpecBuilder = TypeSpec.classBuilder(name).wrap() - fun classBuilder(className: ClassName): TypeSpecBuilder = classBuilder(className.simpleName) - fun companionObjectBuilder(name: String? = null): TypeSpecBuilder = TypeSpec.companionObjectBuilder(name).wrap() - fun enumBuilder(name: String): TypeSpecBuilder = TypeSpec.enumBuilder(name).wrap() - fun enumBuilder(className: ClassName): TypeSpecBuilder = TypeSpec.enumBuilder(className).wrap() - fun funInterfaceBuilder(name: String): TypeSpecBuilder = TypeSpec.funInterfaceBuilder(name).wrap() - fun funInterfaceBuilder(className: ClassName): TypeSpecBuilder = TypeSpec.funInterfaceBuilder(className).wrap() - fun interfaceBuilder(name: String): TypeSpecBuilder = TypeSpec.interfaceBuilder(name).wrap() - fun interfaceBuilder(className: ClassName): TypeSpecBuilder = TypeSpec.interfaceBuilder(className).wrap() - fun objectBuilder(name: String): TypeSpecBuilder = TypeSpec.objectBuilder(name).wrap() - fun objectBuilder(className: ClassName): TypeSpecBuilder = objectBuilder(className.simpleName) - } - - val enumConstants: MutableMap get() = builder.enumConstants - val funSpecs: MutableList get() = builder.funSpecs - override val modifiers: MutableList get() = builder.modifiers.toMutableList() - val propertySpecs: MutableList get() = builder.propertySpecs - val superclassConstructorParameters: MutableList get() = builder.superclassConstructorParameters - val superinterfaces: MutableMap get() = builder.superinterfaces - val typeSpecs: MutableList get() = builder.typeSpecs - override val typeVariables: MutableList get() = builder.typeVariables - - fun addEnumConstant(name: String, typeSpec: TypeSpec = anonymousClassBuilder().build()): TypeSpecBuilder = apply { builder.addEnumConstant(name, typeSpec) } - override fun addFunction(funSpec: FunSpec): TypeSpecBuilder = apply { builder.addFunction(funSpec) } - fun addInitializerBlock(block: CodeBlock): TypeSpecBuilder = apply { builder.addInitializerBlock(block) } - fun addInitializerBlock(builder: CodeBlockBuilder): TypeSpecBuilder = addInitializerBlock(builder.build()) - override fun addProperty(propertySpec: PropertySpec): TypeSpecBuilder = apply { builder.addProperty(propertySpec) } - fun addSuperclassConstructorParameter(format: String, vararg args: Any): TypeSpecBuilder = apply { builder.addSuperclassConstructorParameter(format, *args) } - fun addSuperclassConstructorParameter(codeBlock: CodeBlock): TypeSpecBuilder = apply { builder.addSuperclassConstructorParameter(codeBlock) } - fun addSuperclassConstructorParameter(builder: CodeBlockBuilder): TypeSpecBuilder = addSuperclassConstructorParameter(builder.build()) - fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock): TypeSpecBuilder = addSuperinterface(superinterface.asTypeName(), delegate) - fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String): TypeSpecBuilder = addSuperinterface(superinterface.asTypeName(), constructorParameterName) - fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, delegate) } - fun addSuperinterface(superinterface: TypeName, constructorParameter: String): TypeSpecBuilder = apply { builder.addSuperinterface(superinterface, constructorParameter) } - fun addSuperinterfaces(superinterfaces: Iterable): TypeSpecBuilder = apply { builder.addSuperinterfaces(superinterfaces) } - override fun addType(typeSpec: TypeSpec): TypeSpecBuilder = apply { builder.addType(typeSpec) } - fun primaryConstructor(primaryConstructor: FunSpec): TypeSpecBuilder = apply { builder.primaryConstructor(primaryConstructor) } - fun superclass(superclass: TypeName): TypeSpecBuilder = apply { builder.superclass(superclass) } - fun superclass(superclass: KClass<*>): TypeSpecBuilder = superclass(superclass.asTypeName()) - - override fun build(): TypeSpec = builder.build() - override fun get(): Builder = builder -} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt deleted file mode 100644 index ceb792c..0000000 --- a/kotlin-code-generation/src/_BAK/poet/TypeSpecHolderBuilder.kt +++ /dev/null @@ -1,12 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.* -import io.toolisticon.kotlin.generation.BuilderSupplier - -sealed interface TypeSpecHolderBuilder, S : TypeSpecHolder, B : TypeSpecHolder.Builder> - : BuilderSupplier, TypeSpecHolder.Builder { - override fun addType(typeSpec: TypeSpec): SELF - - @OptIn(ExperimentalKotlinPoetApi::class) - fun addType(builder: TypeSpecBuilder): SELF = addType(builder.build()) -} diff --git a/kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt b/kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt deleted file mode 100644 index 6d0108d..0000000 --- a/kotlin-code-generation/src/_BAK/poet/TypeVariableHolderBuilder.kt +++ /dev/null @@ -1,19 +0,0 @@ -package io.toolisticon.kotlin.generation._BAK.poet - -import com.squareup.kotlinpoet.TypeVariableName -import io.toolisticon.kotlin.generation.BuilderSupplier - -@Suppress("UNCHECKED_CAST") -sealed interface TypeVariableHolderBuilder, S : Any, B : Any> - : BuilderSupplier { - val typeVariables: MutableList - - fun addTypeVariables(typeVariables: Iterable): SELF = apply { - this.typeVariables += typeVariables - } as SELF - - fun addTypeVariable(typeVariable: TypeVariableName): SELF = apply { - typeVariables += typeVariable - } as SELF - -} diff --git a/kotlin-code-generation/src/_TEST/KotlinAnnotationSpecTest.kt b/kotlin-code-generation/src/_TEST/KotlinAnnotationSpecTest.kt deleted file mode 100644 index 49459ba..0000000 --- a/kotlin-code-generation/src/_TEST/KotlinAnnotationSpecTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -package io.toolisticon.kotlin.generation - -import io.toolisticon.kotlin.generation.builder.KotlinAnnotationSpecBuilder -import io.toolisticon.kotlin.generation._BAK.toBuilder -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import kotlin.reflect.KClass - -class KotlinAnnotationSpecTest { - - annotation class Foo( - val bar: String, - val x: String = "", - val type: KClass<*> = String::class - ) - - @Test - fun `create Foo annotation`() { - val spec = KotlinAnnotationSpecBuilder.builder(Foo::class) - .addMember("bar = %S", "hello world") - .addStringMember("x", "foo") - .addKClassMember("type", Long::class) - .build() - - assertThat(spec.code).isEqualTo("""@io.toolisticon.kotlin.generation.KotlinAnnotationSpecTest.Foo(bar = "hello world", x = "foo", type = kotlin.Long::class)""") - assertThat(spec.members).hasSize(3) - - assertThat(spec).hasToString( - "KotlinAnnotationSpec(" + - "typeName=io.toolisticon.kotlin.generation.KotlinAnnotationSpecTest.Foo, " + - "members=[" + - "bar = \"hello world\", " + - "x = \"foo\", " + - "type = kotlin.Long::class]" + - ")" - ) - } - - @Test - fun `use toBuilder to add members`() { - var spec = KotlinAnnotationSpecBuilder.builder(Foo::class) - .addMember("bar", "hello") - .build() - - assertThat(spec.members).hasSize(1) - - spec = spec.toBuilder() - .addMember("type", Int::class) - .build() - - assertThat(spec.members).hasSize(2) - } -} diff --git a/kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt b/kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt deleted file mode 100644 index 82f5c33..0000000 --- a/kotlin-code-generation/src/_TEST/KotlinDataClassSpecTest.kt +++ /dev/null @@ -1,32 +0,0 @@ -package io.toolisticon.kotlin.generation - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.asTypeName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class KotlinDataClassSpecTest { - - @Test - fun `create foo`() { - val className = ClassName("test", "Foo") - - val spec = buildDataClass(className) { - addConstructorProperty("x", Int::class.asTypeName()) - addConstructorProperty(buildConstructorProperty("y", Long::class.asTypeName()) { - makePrivate() - }) - } - - assertThat(spec.code.trim()).isEqualTo( - """ - public data class Foo( - public val x: kotlin.Int, - private val y: kotlin.Long, - ) - """.trimIndent() - ) - } -} diff --git a/kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt b/kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt deleted file mode 100644 index 5beb317..0000000 --- a/kotlin-code-generation/src/_TEST/builder/KotlinValueClassBuilderTest.kt +++ /dev/null @@ -1,30 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.asTypeName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildValueClass -import io.toolisticon.kotlin.generation.TestFixtures -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -internal class KotlinValueClassBuilderTest { - - @Test - fun `create foo value class`() { - val className = ClassName("io.acme","Foo") - - val spec = buildValueClass(className) { - primaryConstructor(KotlinConstructorPropertyBuilder.builder("bar", String::class.asTypeName()) - .addAnnotation(TestFixtures.myAnnotationSpec.get()) - .build()) - } - - assertThat(spec.code.trim()).isEqualTo(""" - @kotlin.jvm.JvmInline - public value class Foo( - @io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation - public val bar: kotlin.String, - ) - """.trimIndent()) - } -} diff --git a/kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt b/kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt deleted file mode 100644 index d48698f..0000000 --- a/kotlin-code-generation/src/_TEST/poet/AnnotationSpecBuilderTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package io.toolisticon.kotlin.generation.poet - -import com.squareup.kotlinpoet.AnnotationSpec -import io.toolisticon.kotlin.generation._BAK.poet.AnnotationSpecBuilder -import org.junit.jupiter.api.Test - -internal class AnnotationSpecBuilderTest { - - @Test - fun name() { - val b = AnnotationSpec.builder(Deprecated::class) - val a = AnnotationSpecBuilder(b) - - - } -} diff --git a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt index 3871804..160e549 100644 --- a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt +++ b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt @@ -1,33 +1,35 @@ package io.toolisticon.kotlin.generation import com.squareup.kotlinpoet.* -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.Supressions.CLASS_NAME +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.annotationBuilder +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.annotationClassBuilder +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.constructorPropertyBuilder +import io.toolisticon.kotlin.generation.Supressions.CLASS_NAME import io.toolisticon.kotlin.generation.builder.* -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpec -import io.toolisticon.kotlin.generation.spec.KotlinFileSpec -import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpecSupplier +import io.toolisticon.kotlin.generation.spec.* +import jakarta.annotation.Generated +import java.time.Instant import kotlin.reflect.KClass object KotlinCodeGeneration { @JvmStatic - fun annotationBuilder(type: ClassName) = KotlinAnnotationSpecBuilder.builder(type) + fun buildAnnotation(kclass: KClass<*>, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = buildAnnotation(kclass.asClassName(), block) @JvmStatic - fun constructorPropertyBuilder(name: String, type: TypeName) = KotlinConstructorPropertySpecBuilder.builder(name, type) + fun buildAnnotation(className: ClassName, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = annotationBuilder(className).also(block).build() @JvmStatic - fun valueClassBuilder(className: ClassName) = KotlinValueClassSpecBuilder.builder(className) + fun buildAnnotationClass(className: ClassName, block: KotlinAnnotationClassSpecBuilderReceiver = {}): KotlinAnnotationClassSpec = annotationClassBuilder(className).also(block).build() @JvmStatic - fun buildAnnotation(kclass: KClass<*>, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = buildAnnotation(kclass.asClassName(), block) + fun buildConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = constructorPropertyBuilder(name, type).also(block).build() @JvmStatic - fun buildAnnotation(className: ClassName, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = annotationBuilder(className).also(block).build() + fun buildConstructorProperty(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = KotlinCodeGeneration.buildConstructorProperty(name, type.asTypeName(), block) @JvmStatic - fun buildConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = constructorPropertyBuilder(name, type).also(block).build() + fun buildDataClass(className: ClassName, block: KotlinDataClassSpecBuilderReceiver = {}): KotlinDataClassSpec = KotlinDataClassSpecBuilder.builder(className).also(block).build() @JvmStatic fun buildValueClass(className: ClassName, block: KotlinValueClassSpecBuilderReceiver): KotlinValueClassSpec = KotlinValueClassSpecBuilder.builder(className).also(block).build() @@ -49,16 +51,44 @@ object KotlinCodeGeneration { // inline fun buildConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertyBuilder.() -> Unit) = KotlinConstructorPropertyBuilder.builder(name, type).also(block).build() // inline fun buildValueClass(className: ClassName, block: KotlinValueClassBuilder.() -> Unit) = KotlinValueClassBuilder.builder(className).also(block).build() - internal object Supressions { - const val CLASS_NAME = "ClassName" - } + @Suppress(CLASS_NAME) + object builder { + @JvmStatic + fun annotationBuilder(type: ClassName) = KotlinAnnotationSpecBuilder.builder(type) + + @JvmStatic + fun annotationClassBuilder(className: ClassName) = KotlinAnnotationClassSpecBuilder.builder(className) - object Annotation { + @JvmStatic + fun constructorPropertyBuilder(name: String, type: TypeName) = KotlinConstructorPropertySpecBuilder.builder(name, type) + @JvmStatic + fun valueClassBuilder(className: ClassName) = KotlinValueClassSpecBuilder.builder(className) -// fun serializableAnnotation(serializerClass: Avro4kSerializerKClass) = AnnotationSpec.builder(Serializable::class) -// .addMember("with = %T::class", serializerClass) -// .build() + } + + @Suppress(CLASS_NAME) + object annotation { + + data class GeneratedAnnotation( + val value: String = KotlinCodeGeneration::class.asTypeName().toString(), + val date: String = Instant.now().toString(), + val comments: List = emptyList() + ) : KotlinAnnotationSpecSupplier { + + fun generator(type: KClass<*>) = copy(value = type.asTypeName().toString()) + fun date(instant: Instant) = copy(date = instant.toString()) + fun comment(comment: Pair) = copy(comments = this.comments + "${comment.first} = ${comment.second}") + + override fun spec(): KotlinAnnotationSpec = buildAnnotation(Generated::class) { + addStringMember("value", value) + addStringMember("date", date) + + if (comments.isNotEmpty()) { + addStringMember("comments", comments.joinToString(separator = ", ")) + } + } + } } diff --git a/kotlin-code-generation/src/main/kotlin/_lang.kt b/kotlin-code-generation/src/main/kotlin/_lang.kt new file mode 100644 index 0000000..0bd8d22 --- /dev/null +++ b/kotlin-code-generation/src/main/kotlin/_lang.kt @@ -0,0 +1,5 @@ +package io.toolisticon.kotlin.generation + +internal object Supressions { + const val CLASS_NAME = "ClassName" +} diff --git a/kotlin-code-generation/src/main/kotlin/_types.kt b/kotlin-code-generation/src/main/kotlin/_types.kt index 9883925..40dcf53 100644 --- a/kotlin-code-generation/src/main/kotlin/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/_types.kt @@ -1,7 +1,5 @@ package io.toolisticon.kotlin.generation -import io.toolisticon.kotlin.generation.poet.PoetSpecSupplier -import io.toolisticon.kotlin.generation.spec.* import java.util.function.Supplier diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt index 80c6a6f..207a527 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt @@ -4,23 +4,30 @@ import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.KotlinCodeGeneration +import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertySpecBuilder.Companion.primaryConstructorWithProperties import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier +import io.toolisticon.kotlin.generation.spec.toList class KotlinAnnotationClassSpecBuilder internal constructor( val className: ClassName, - private val delegate: TypeSpecBuilder -) : BuilderSupplier, KotlinAnnotationClassSpecSupplier, DelegatingBuilder { + private val delegate: TypeSpecBuilder, + private val constructorProperties: LinkedHashMap = LinkedHashMap() +) : BuilderSupplier, KotlinAnnotationClassSpecSupplier, + ConstructorPropertySupport, + DelegatingBuilder { companion object { @JvmStatic - fun annotationBuilder(name: String): KotlinAnnotationClassSpecBuilder = annotationBuilder(ClassName("", name)) + fun builder(name: String): KotlinAnnotationClassSpecBuilder = builder(ClassName("", name)) @JvmStatic - fun annotationBuilder(className: ClassName): KotlinAnnotationClassSpecBuilder = KotlinAnnotationClassSpecBuilder( + fun builder(className: ClassName): KotlinAnnotationClassSpecBuilder = KotlinAnnotationClassSpecBuilder( className = className, delegate = TypeSpecBuilder.annotationBuilder(className.simpleName) ) @@ -30,16 +37,29 @@ class KotlinAnnotationClassSpecBuilder internal constructor( delegate.addModifiers(KModifier.ANNOTATION) } + override fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) = apply { + constructorProperties[spec.name] = spec + } + + fun mustBeDocumented() = apply { + delegate.addAnnotation(KotlinCodeGeneration.buildAnnotation(MustBeDocumented::class).get()) + } + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } - override fun build(): KotlinAnnotationClassSpec = KotlinAnnotationClassSpec( - className = className, - spec = delegate.build() - ) + override fun build(): KotlinAnnotationClassSpec { + if (constructorProperties.isNotEmpty()) { + delegate.primaryConstructorWithProperties(toList(constructorProperties.values)) + } + + return KotlinAnnotationClassSpec(className = className, spec = delegate.build()) + } override fun spec(): KotlinAnnotationClassSpec = build() override fun get(): TypeSpec = build().get() } + +typealias KotlinAnnotationClassSpecBuilderReceiver = KotlinAnnotationClassSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt deleted file mode 100644 index e02e26f..0000000 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinCompanionObjectSpecBuilder.kt +++ /dev/null @@ -1,109 +0,0 @@ -package io.toolisticon.kotlin.generation.builder - -import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver -import io.toolisticon.kotlin.generation.spec.KotlinCompanionObjectSpec -import io.toolisticon.kotlin.generation.spec.KotlinCompanionObjectSpecSupplier - - -class KotlinCompanionObjectSpecBuilder internal constructor( - private val delegate: TypeSpecBuilder -) : BuilderSupplier, KotlinCompanionObjectSpecSupplier, DelegatingBuilder { - - companion object { - @JvmStatic - @JvmOverloads - fun companionObjectBuilder(name: String? = null): KotlinCompanionObjectSpecBuilder = KotlinCompanionObjectSpecBuilder( - delegate = TypeSpecBuilder.companionObjectBuilder(name) - ) - } - - override fun builder(block: TypeSpecBuilderReceiver) = apply { - delegate.builder.block() - } - - override fun build(): KotlinCompanionObjectSpec = KotlinCompanionObjectSpec( - spec = delegate.build() - ) - - override fun spec(): KotlinCompanionObjectSpec = build() - override fun get(): TypeSpec = build().get() - -// operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( -// className = spec.className, -// delegate = spec.get().toBuilder() -// ) -//} -// -//private val constructorProperties = LinkedHashMap() -// -//operator fun invoke(block: TypeSpecBuilder.() -> Unit): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { -// delegate.block() -// override fun addKdoc(kdoc: CodeBlock) = apply { -// delegate.addKdoc(kdoc) -// } -// -// fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { -// delegate.addType(typeSpecSupplier.get()) -// } -// -// fun addConstructorProperty(name: String, type: TypeName, block: _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinConstructorPropertyBuilder.() -> Unit = {}) = apply { -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[name] = buildConstructorProperty(name, type, block) -// } -// -// fun addConstructorProperty(constructorProperty: ConstructorPropertySupplier) = apply { -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[constructorProperty.name] = constructorProperty -// } -// -// /** -// * Finalize a data class based on its primary constructor parameters. -// * -// * * adds primary constructor. -// * * backs parameters with properties. -// */ -// override fun build(): KotlinDataClassSpec { -// check(_root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.isNotEmpty()) { "Data class must have at least one property." } -// -// val constructor = FunSpec.constructorBuilder() -// -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.values.map(ConstructorPropertySupplier::get).forEach { -// constructor.addParameter(it.parameter.get()) -// delegate.addProperty(it.property.get()) -// } -// -// delegate.primaryConstructor(constructor.build()) -// -// return KotlinDataClassSpec(className = className, spec = delegate.build()) -// } -// -// override fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = apply { -// fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { -// delegate.addAnnotation(annotation) -// } -// -// override fun get(): TypeSpec = build().get() -// -// } -} - - -// @Suppress("ClassName") -// object builder : -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.ToKotlinPoetSpecBuilder { -// -// fun builder(className: ClassName) = _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder(className = className) -// operator fun invoke(packageName: String, name: String): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.invoke(ClassName(packageName, name)) -// -// fun builder(packageName: String, name: String) = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.builder(ClassName(packageName, name)) -// operator fun invoke(className: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( -// className = className, -// delegate = TypeSpec.classBuilder(className) -// ) -// -// } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt index 962f8be..2d7b290 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinConstructorPropertySpecBuilder.kt @@ -1,14 +1,16 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeName import io.toolisticon.kotlin.generation.Builder +import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier class KotlinConstructorPropertySpecBuilder internal constructor( - val name: String, + override val name: String, private val type: TypeName, private val propertyBuilder: KotlinPropertySpecBuilder, private val parameterBuilder: KotlinParameterSpecBuilder @@ -21,6 +23,17 @@ class KotlinConstructorPropertySpecBuilder internal constructor( propertyBuilder = KotlinPropertySpecBuilder.builder(name = name, type = type), parameterBuilder = KotlinParameterSpecBuilder.builder(name = name, type = type) ) + + internal fun TypeSpecBuilder.primaryConstructorWithProperties(constructorProperties: List) { + val constructor = FunSpec.constructorBuilder() + constructorProperties.forEach { + constructor.addParameter(it.parameter.get()) + this.addProperty(it.property.get()) + } + + this.primaryConstructor(constructor.build()) + } + } fun makePrivate() = apply { diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index 2cabb16..169adaa 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -5,12 +5,13 @@ import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty +import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertySpecBuilder.Companion.primaryConstructorWithProperties import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver -import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier -import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpec -import io.toolisticon.kotlin.generation.spec.KotlinDataClassSpecSupplier +import io.toolisticon.kotlin.generation.spec.* import mu.KLogging +import kotlin.reflect.KClass class KotlinDataClassSpecBuilder internal constructor( private val className: ClassName, @@ -44,6 +45,10 @@ class KotlinDataClassSpecBuilder internal constructor( } override fun build(): KotlinDataClassSpec { + check(constructorProperties.isNotEmpty()) { "Data class must have at least one property." } + + delegate.primaryConstructorWithProperties(toList(constructorProperties.values)) + return KotlinDataClassSpec(className = className, spec = delegate.build()) } @@ -51,63 +56,34 @@ class KotlinDataClassSpecBuilder internal constructor( override fun spec(): KotlinDataClassSpec = build() override fun get(): TypeSpec = build().get() - // operator fun invoke(spec: KotlinDataClassSpec): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( -// className = spec.className, -// delegate = spec.get().toBuilder() -// ) -//} -// - - - // -//operator fun invoke(block: TypeSpecBuilder.() -> Unit): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { -// delegate.block() -// override fun addKdoc(kdoc: CodeBlock) = apply { -// delegate.addKdoc(kdoc) -// } // // fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { // delegate.addType(typeSpecSupplier.get()) // } // - fun addConstructorProperty(name: String, type: TypeName, spec: KotlinConstructorPropertySpecSupplier) = apply { - this.constructorProperties[name] = spec + + fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) = apply { + this.constructorProperties[spec.name] = spec } -// -// fun addConstructorProperty(constructorProperty: ConstructorPropertySupplier) = apply { -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties[constructorProperty.name] = constructorProperty -// } -// -// /** -// * Finalize a data class based on its primary constructor parameters. -// * -// * * adds primary constructor. -// * * backs parameters with properties. -// */ -// override fun build(): KotlinDataClassSpec { -// check(_root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.isNotEmpty()) { "Data class must have at least one property." } -// -// val constructor = FunSpec.constructorBuilder() -// -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.constructorProperties.values.map(ConstructorPropertySupplier::get).forEach { -// constructor.addParameter(it.parameter.get()) -// delegate.addProperty(it.property.get()) -// } -// -// delegate.primaryConstructor(constructor.build()) -// -// return KotlinDataClassSpec(className = className, spec = delegate.build()) -// } -// + + fun addConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = addConstructorProperty( + buildConstructorProperty(name, type, block) + ) + + fun addConstructorProperty(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = addConstructorProperty( + buildConstructorProperty(name, type, block) + ) + + fun addAnnotation(annotation: KotlinAnnotationSpecSupplier) = apply { + delegate.addAnnotation(annotation.get()) + } + + // override fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = apply { // fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { // delegate.addAnnotation(annotation) // } // -// override fun get(): TypeSpec = build().get() -// -// } } @@ -128,3 +104,6 @@ class KotlinDataClassSpecBuilder internal constructor( // ) // // } + + +typealias KotlinDataClassSpecBuilderReceiver = KotlinDataClassSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt index 3332bf7..3891d03 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -53,9 +53,6 @@ class KotlinFileSpecBuilder internal constructor( fun builder(spec: FileSpec) = KotlinFileSpecBuilder(delegate = spec.toBuilder().wrap()) } - override fun builder(block: FileSpecBuilderReceiver) = apply { - delegate.builder.block() - } fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { delegate.addType(typeSpecSupplier.get()) @@ -65,6 +62,11 @@ class KotlinFileSpecBuilder internal constructor( addAnnotation(annotationSpec) } + override fun builder(block: FileSpecBuilderReceiver) = apply { + delegate.builder.block() + } + + override fun build(): KotlinFileSpec { val spec = delegate.build() return KotlinFileSpec(spec = spec) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index 13e990e..1a16caa 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -5,6 +5,7 @@ import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.PropertySpecBuilderReceiver @@ -73,8 +74,9 @@ class KotlinPropertySpecBuilder internal constructor( fun builder(spec: PropertySpec) = KotlinPropertySpecBuilder(delegate = spec.toBuilder().wrap()) } - - + fun addAnnotation(annotationSpec: AnnotationSpecSupplier): KotlinPropertySpecBuilder = apply { + delegate.addAnnotation(annotationSpec.get()) + } override fun builder(block: PropertySpecBuilderReceiver) = apply { delegate.builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt index 8613d2e..0a7809f 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -2,15 +2,18 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.jvm.jvmInline import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.KotlinCodeGeneration import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpecSupplier +import kotlin.reflect.KClass class KotlinValueClassSpecBuilder internal constructor( val className: ClassName, @@ -42,6 +45,14 @@ class KotlinValueClassSpecBuilder internal constructor( delegate.builder.jvmInline() } + fun primaryConstructor(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = primaryConstructor( + KotlinCodeGeneration.buildConstructorProperty(name, type, block) + ) + + fun primaryConstructor(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = primaryConstructor( + KotlinCodeGeneration.buildConstructorProperty(name, type, block) + ) + fun primaryConstructor(constructorPropertySupplier: KotlinConstructorPropertySpecSupplier) = apply { this.constructorProperty = constructorPropertySupplier.spec() diff --git a/kotlin-code-generation/src/main/kotlin/builder/_types.kt b/kotlin-code-generation/src/main/kotlin/builder/_types.kt index c13d43f..698fe50 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/_types.kt @@ -1,6 +1,25 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty +import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier +import kotlin.reflect.KClass + interface DelegatingBuilder { fun builder(block: RECEIVER) : SELF } + +interface ConstructorPropertySupport { + + fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) : SELF + + fun addConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = addConstructorProperty( + buildConstructorProperty(name, type, block) + ) + + fun addConstructorProperty(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = addConstructorProperty( + buildConstructorProperty(name, type, block) + ) +} diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt index c2841c3..cd8f48f 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt @@ -28,7 +28,13 @@ class TypeSpecBuilder( TypeSpecHolderBuilder { companion object { - fun TypeSpec.Builder.wrap() = TypeSpecBuilder(builder = this) + internal fun TypeSpec.Builder.wrap() = TypeSpecBuilder(builder = this) + + @JvmStatic + fun annotationBuilder(name: String): TypeSpecBuilder = TypeSpec.annotationBuilder(name).wrap() + + @JvmStatic + fun annotationBuilder(className: ClassName): TypeSpecBuilder = annotationBuilder(className.simpleName) @JvmStatic fun classBuilder(name: String): TypeSpecBuilder = TypeSpec.classBuilder(name).wrap() @@ -67,11 +73,7 @@ class TypeSpecBuilder( @JvmStatic fun anonymousClassBuilder(): TypeSpecBuilder = TypeSpec.anonymousClassBuilder().wrap() - @JvmStatic - fun annotationBuilder(name: String): TypeSpecBuilder = TypeSpec.annotationBuilder(name).wrap() - @JvmStatic - fun annotationBuilder(className: ClassName): TypeSpecBuilder = annotationBuilder(className.simpleName) } diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt index 4f1ab8b..cbd255a 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationClassSpec.kt @@ -13,4 +13,6 @@ data class KotlinAnnotationClassSpec( override fun get(): TypeSpec = spec } -interface KotlinAnnotationClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinAnnotationClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt index 1d3cc87..0f61a69 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnnotationSpec.kt @@ -26,6 +26,8 @@ data class KotlinAnnotationSpec( } -interface KotlinAnnotationSpecSupplier : KotlinGeneratorSpecSupplier, AnnotationSpecSupplier +interface KotlinAnnotationSpecSupplier : KotlinGeneratorSpecSupplier, AnnotationSpecSupplier { + override fun get(): AnnotationSpec = spec().get() +} fun KotlinAnnotationSpec.toBuilder() = KotlinAnnotationSpecBuilder.from(spec = this) diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt index c2eac76..387c451 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinAnonymousClassSpec.kt @@ -9,4 +9,6 @@ data class KotlinAnonymousClassSpec( override fun spec(): KotlinAnonymousClassSpec = this override fun get(): TypeSpec = spec } -interface KotlinAnonymousClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinAnonymousClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt index 0a30d77..e928f3c 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinClassSpec.kt @@ -21,4 +21,6 @@ data class KotlinClassSpec( //fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() // TODO fun KotlinDataClassSpec.toBuilder() = KotlinDataClassBuilder.from(spec = this) // TODO fun KotlinDataClassSpec.toFileSpec() = KotlinFileSpecBuilder.builder(this).build() -interface KotlinClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt index d2c3238..813bb76 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinCompanionObjectSpec.kt @@ -9,4 +9,7 @@ data class KotlinCompanionObjectSpec( override fun spec(): KotlinCompanionObjectSpec = this override fun get(): TypeSpec = spec } -interface KotlinCompanionObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier + +interface KotlinCompanionObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt index 60fb520..b7636cf 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinConstructorPropertySpec.kt @@ -7,9 +7,16 @@ data class KotlinConstructorPropertySpec( val parameter: KotlinParameterSpec, ) : KotlinConstructorPropertySpecSupplier { - val name: String = property.name + override val name: String = property.name val type: TypeName = property.type override fun spec(): KotlinConstructorPropertySpec = this } -interface KotlinConstructorPropertySpecSupplier : KotlinGeneratorSpecSupplier +interface KotlinConstructorPropertySpecSupplier : KotlinGeneratorSpecSupplier { + /** + * Name of property + */ + val name: String +} + +internal fun toList(constructorProperties: Collection) : List = constructorProperties.map(KotlinConstructorPropertySpecSupplier::spec).toList() diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt index 76325c0..a930f94 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinDataClassSpec.kt @@ -22,4 +22,6 @@ data class KotlinDataClassSpec( //fun KotlinDataClassSpec.toFileSpec() = KotlinFileBuilder.builder(this).build() // TODO fun KotlinDataClassSpec.toBuilder() = KotlinDataClassBuilder.from(spec = this) // TODO fun KotlinDataClassSpec.toFileSpec() = KotlinFileSpecBuilder.builder(this).build() -interface KotlinDataClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinDataClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt index 7f78d18..d80a06d 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinEnumClassSpec.kt @@ -14,4 +14,6 @@ data class KotlinEnumClassSpec( override fun spec(): KotlinEnumClassSpec = this override fun get(): TypeSpec = spec } -interface KotlinEnumClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinEnumClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt index c59863d..401862a 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt @@ -18,4 +18,6 @@ data class KotlinFileSpec( override fun get(): FileSpec = spec } -interface KotlinFileSpecSupplier : KotlinGeneratorSpecSupplier, FileSpecSupplier +interface KotlinFileSpecSupplier : KotlinGeneratorSpecSupplier, FileSpecSupplier { + override fun get(): FileSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt index 7dc5611..ef5faf7 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFunSpec.kt @@ -9,4 +9,7 @@ data class KotlinFunSpec( override fun spec(): KotlinFunSpec = this override fun get(): FunSpec = spec } -interface KotlinFunSpecSupplier : KotlinGeneratorSpecSupplier, FunSpecSupplier + +interface KotlinFunSpecSupplier : KotlinGeneratorSpecSupplier, FunSpecSupplier { + override fun get(): FunSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt index 059ce99..b4ac9d1 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinInterfaceSpec.kt @@ -9,4 +9,7 @@ data class KotlinInterfaceSpec( override fun spec(): KotlinInterfaceSpec = this override fun get(): TypeSpec = spec } -interface KotlinInterfaceSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier + +interface KotlinInterfaceSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt index 51a602e..94b16b4 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinObjectSpec.kt @@ -10,4 +10,7 @@ data class KotlinObjectSpec( override fun spec(): KotlinObjectSpec = this override fun get(): TypeSpec = spec } -interface KotlinObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier + +interface KotlinObjectSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt index 34e33a6..21b2e5d 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinParameterSpec.kt @@ -16,4 +16,6 @@ data class KotlinParameterSpec( override fun get(): ParameterSpec = this.spec } -interface KotlinParameterSpecSupplier : KotlinGeneratorSpecSupplier, ParameterSpecSupplier +interface KotlinParameterSpecSupplier : KotlinGeneratorSpecSupplier, ParameterSpecSupplier { + override fun get(): ParameterSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt index b8ed17d..cdc0b7d 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinPropertySpec.kt @@ -28,4 +28,7 @@ data class KotlinPropertySpec( } // TODO fun KotlinPropertySpec.toBuilder() = KotlinPropertyBuilder.builder(spec = this) -interface KotlinPropertySpecSupplier : KotlinGeneratorSpecSupplier, PropertySpecSupplier + +interface KotlinPropertySpecSupplier : KotlinGeneratorSpecSupplier, PropertySpecSupplier { + override fun get(): PropertySpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt index 0943345..61cacb6 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinTypeAliasSpec.kt @@ -9,4 +9,7 @@ data class KotlinTypeAliasSpec( override fun spec(): KotlinTypeAliasSpec = this override fun get(): TypeAliasSpec = spec } -interface KotlinTypeAliasSpecSupplier: KotlinGeneratorSpecSupplier, TypeAliasSpecSupplier + +interface KotlinTypeAliasSpecSupplier : KotlinGeneratorSpecSupplier, TypeAliasSpecSupplier { + override fun get(): TypeAliasSpec = spec().get() +} diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt index 6708656..04819bd 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinValueClassSpec.kt @@ -19,4 +19,6 @@ data class KotlinValueClassSpec( } // fun KotlinValueClassSpec.toBuilder() = KotlinValueClassBuilder.builder(spec = this) -interface KotlinValueClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier +interface KotlinValueClassSpecSupplier : KotlinGeneratorSpecSupplier, TypeSpecSupplier { + override fun get(): TypeSpec = spec().get() +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt index a1583cd..7d8cbea 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt @@ -1,10 +1,18 @@ package io.toolisticon.kotlin.generation +import com.squareup.kotlinpoet.ClassName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotationClass +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec import org.junit.jupiter.api.Test internal class KotlinAnnotationClassTest { @Test - fun name() { - TODO("Not yet implemented") + fun `build custom annotation class`() { + val annotationClass: KotlinAnnotationClassSpec = buildAnnotationClass(className = ClassName("foo","CustomAnnotation")) { + mustBeDocumented() + addConstructorProperty("value", String::class) + } + + println(annotationClass.get()) } } diff --git a/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt index 487f955..4c02ecb 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt +++ b/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt @@ -1,5 +1,9 @@ package io.toolisticon.kotlin.generation +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.asTypeName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass import org.junit.jupiter.api.Test internal class KotlinConstructorPropertyTest { @@ -7,4 +11,6 @@ internal class KotlinConstructorPropertyTest { fun name() { TODO("Not yet implemented") } + + } diff --git a/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt index 06c2db6..e2d628e 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt @@ -1,10 +1,46 @@ package io.toolisticon.kotlin.generation +import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.asTypeName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.annotation.GeneratedAnnotation +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test internal class KotlinDataClassTest { + @Test - fun name() { - TODO("Not yet implemented") + fun `create foo`() { + val className = ClassName("test", "Foo") + + val c1 = buildConstructorProperty("x", Int::class.asTypeName()) + val c2 = buildConstructorProperty("y", Long::class) { + makePrivate() + } + + val spec = buildDataClass(className) { + addAnnotation(GeneratedAnnotation(date = TestFixtures.NOW.toString()).comment("version" to "1.2")) + addConstructorProperty("x", Int::class.asTypeName()) + addConstructorProperty("y", Long::class) { + makePrivate() + addAnnotation(TestFixtures.myAnnotationSpec) + } + } + + assertThat(spec.code.trim()).isEqualTo( + """ + @jakarta.`annotation`.Generated( + value = "io.toolisticon.kotlin.generation.KotlinCodeGeneration", + date = "2024-07-02T10:01:33.205357100Z", + comments = "version = 1.2", + ) + public data class Foo( + public val x: kotlin.Int, + @io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation + private val y: kotlin.Long, + ) + """.trimIndent() + ) } } diff --git a/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt index b05ec51..5266b0f 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt @@ -2,9 +2,9 @@ package io.toolisticon.kotlin.generation import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.asTypeName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildValueClass import io.toolisticon.kotlin.generation.KotlinCodeGeneration.toFileSpec +import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertySpecBuilder import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -14,10 +14,10 @@ internal class KotlinValueClassTest { fun `build foo with string value`() { val className = ClassName("test", "Foo") val valueClass = buildValueClass(className = className) { - primaryConstructor(buildConstructorProperty("bar", String::class.asTypeName()) { + primaryConstructor("bar", String::class) { makePrivate() addAnnotation(TestFixtures.myAnnotationSpec) - }) + } } assertThat(toFileSpec(valueClass).code.trim()).isEqualTo( @@ -34,4 +34,28 @@ public value class Foo( )""" ) } + + + @Test + fun `create foo value class`() { + val className = ClassName("io.acme", "Foo") + + val spec = buildValueClass(className) { + primaryConstructor( + KotlinConstructorPropertySpecBuilder.builder("bar", String::class.asTypeName()) + .addAnnotation(TestFixtures.myAnnotationSpec) + .build() + ) + } + + assertThat(spec.code.trim()).isEqualTo( + """ + @kotlin.jvm.JvmInline + public value class Foo( + @io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation + public val bar: kotlin.String, + ) + """.trimIndent() + ) + } } diff --git a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt index 814406c..b2b9544 100644 --- a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt +++ b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation +import java.time.Instant import kotlin.reflect.KClass object TestFixtures { + // a fixed instant to be used in test with + val NOW = Instant.parse( "2024-07-02T10:01:33.205357100Z") + @Target(AnnotationTarget.VALUE_PARAMETER) annotation class MyAnnotation( val name: String, diff --git a/kotlin-code-generation/src/_TEST/poet/TypeSpecBuilderTest.kt b/kotlin-code-generation/src/test/kotlin/poet/TypeSpecBuilderTest.kt similarity index 52% rename from kotlin-code-generation/src/_TEST/poet/TypeSpecBuilderTest.kt rename to kotlin-code-generation/src/test/kotlin/poet/TypeSpecBuilderTest.kt index f85952f..81cf857 100644 --- a/kotlin-code-generation/src/_TEST/poet/TypeSpecBuilderTest.kt +++ b/kotlin-code-generation/src/test/kotlin/poet/TypeSpecBuilderTest.kt @@ -1,21 +1,27 @@ package io.toolisticon.kotlin.generation.poet import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi import com.squareup.kotlinpoet.TypeSpec -import io.toolisticon.kotlin.generation._BAK.poet.TypeSpecBuilder import jakarta.annotation.Generated +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test + internal class TypeSpecBuilderTest { - @OptIn(ExperimentalKotlinPoetApi::class) + @Test fun `verify builder`() { - val builder: TypeSpecBuilder = TypeSpecBuilder(TypeSpec.classBuilder(ClassName("foo","Bar"))) + val builder: TypeSpecBuilder = TypeSpecBuilder(TypeSpec.classBuilder(ClassName("foo", "Bar"))) + + builder.addAnnotation(Generated::class) - var x: TypeSpecBuilder = builder.addAnnotation(Generated::class) + assertThat(builder.build()).hasToString( + """ + @jakarta.`annotation`.Generated + public class Bar - println(builder.build().toString()) + """.trimIndent() + ) } } From 3235a875c15c44eecf1d25c22c6aa260e679acb2 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Wed, 3 Jul 2024 00:57:11 +0200 Subject: [PATCH 16/19] wip --- .../src/main/kotlin/KotlinCodeGeneration.kt | 46 ++++++++----------- .../KotlinAnnotationClassSpecBuilder.kt | 43 ++++++++++++----- .../builder/KotlinAnnotationSpecBuilder.kt | 12 +++++ .../KotlinAnonymousClassSpecBuilder.kt | 2 + .../kotlin/builder/KotlinClassSpecBuilder.kt | 2 + .../builder/KotlinDataClassSpecBuilder.kt | 15 ++---- .../builder/KotlinEnumClassSpecBuilder.kt | 2 + .../kotlin/builder/KotlinFunSpecBuilder.kt | 2 + .../builder/KotlinInterfaceSpecBuilder.kt | 2 + .../kotlin/builder/KotlinObjectSpecBuilder.kt | 2 + .../builder/KotlinParameterSpecBuilder.kt | 2 + .../builder/KotlinPropertySpecBuilder.kt | 2 + .../builder/KotlinTypeAliasSpecBuilder.kt | 2 + .../builder/KotlinValueClassSpecBuilder.kt | 41 ++++++----------- .../src/main/kotlin/poet/FileSpecBuilder.kt | 11 +---- .../src/main/kotlin/poet/_types.kt | 1 + .../test/kotlin/KotlinAnnotationClassTest.kt | 18 -------- .../test/kotlin/KotlinCodeGenerationTest.kt | 24 ++++++++++ .../kotlin/KotlinConstructorPropertyTest.kt | 16 ------- .../src/test/kotlin/TestFixtures.kt | 2 +- .../kotlin/spec/KotlinAnnotationClassTest.kt | 34 ++++++++++++++ .../kotlin/{ => spec}/KotlinAnnotationTest.kt | 18 +++++--- .../{ => spec}/KotlinAnonymousClassTest.kt | 2 +- .../test/kotlin/{ => spec}/KotlinClassTest.kt | 2 +- .../{ => spec}/KotlinCompanionObjectTest.kt | 2 +- .../spec/KotlinConstructorPropertyTest.kt | 12 +++++ .../kotlin/{ => spec}/KotlinDataClassTest.kt | 12 ++--- .../kotlin/{ => spec}/KotlinEnumClassTest.kt | 2 +- .../test/kotlin/{ => spec}/KotlinFileTest.kt | 2 +- .../test/kotlin/{ => spec}/KotlinFunTest.kt | 2 +- .../kotlin/{ => spec}/KotlinInterfaceTest.kt | 2 +- .../kotlin/{ => spec}/KotlinObjectTest.kt | 2 +- .../kotlin/{ => spec}/KotlinParameterTest.kt | 2 +- .../kotlin/{ => spec}/KotlinPropertyTest.kt | 2 +- .../kotlin/{ => spec}/KotlinTypeAliasTest.kt | 2 +- .../kotlin/{ => spec}/KotlinValueClassTest.kt | 15 +++--- 36 files changed, 205 insertions(+), 155 deletions(-) delete mode 100644 kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/KotlinCodeGenerationTest.kt delete mode 100644 kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt create mode 100644 kotlin-code-generation/src/test/kotlin/spec/KotlinAnnotationClassTest.kt rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinAnnotationTest.kt (78%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinAnonymousClassTest.kt (75%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinClassTest.kt (73%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinCompanionObjectTest.kt (75%) create mode 100644 kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinDataClassTest.kt (76%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinEnumClassTest.kt (74%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinFileTest.kt (73%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinFunTest.kt (73%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinInterfaceTest.kt (74%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinObjectTest.kt (74%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinParameterTest.kt (74%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinPropertyTest.kt (74%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinTypeAliasTest.kt (74%) rename kotlin-code-generation/src/test/kotlin/{ => spec}/KotlinValueClassTest.kt (75%) diff --git a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt index 160e549..3cff661 100644 --- a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt +++ b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt @@ -1,9 +1,11 @@ package io.toolisticon.kotlin.generation import com.squareup.kotlinpoet.* +import com.squareup.kotlinpoet.MemberName.Companion.member import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.annotationBuilder import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.annotationClassBuilder import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.constructorPropertyBuilder +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.fileBuilder import io.toolisticon.kotlin.generation.Supressions.CLASS_NAME import io.toolisticon.kotlin.generation.builder.* import io.toolisticon.kotlin.generation.spec.* @@ -13,25 +15,15 @@ import kotlin.reflect.KClass object KotlinCodeGeneration { - @JvmStatic - fun buildAnnotation(kclass: KClass<*>, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = buildAnnotation(kclass.asClassName(), block) - - @JvmStatic + fun buildAnnotation(type: KClass<*>, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = buildAnnotation(type.asClassName(), block) fun buildAnnotation(className: ClassName, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = annotationBuilder(className).also(block).build() - - @JvmStatic fun buildAnnotationClass(className: ClassName, block: KotlinAnnotationClassSpecBuilderReceiver = {}): KotlinAnnotationClassSpec = annotationClassBuilder(className).also(block).build() - - @JvmStatic + fun buildCodeBlock(format: String, vararg args: Any?) = CodeBlock.of(format, *args) + inline fun buildCodeBlock(builderAction: CodeBlock.Builder.() -> Unit): CodeBlock = CodeBlock.builder().apply(builderAction).build() fun buildConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = constructorPropertyBuilder(name, type).also(block).build() - - @JvmStatic fun buildConstructorProperty(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = KotlinCodeGeneration.buildConstructorProperty(name, type.asTypeName(), block) - - @JvmStatic fun buildDataClass(className: ClassName, block: KotlinDataClassSpecBuilderReceiver = {}): KotlinDataClassSpec = KotlinDataClassSpecBuilder.builder(className).also(block).build() - - @JvmStatic + fun buildFile(className: ClassName, block: KotlinFileSpecBuilderReceiver = {}): KotlinFileSpec = fileBuilder(className).also(block).build() fun buildValueClass(className: ClassName, block: KotlinValueClassSpecBuilderReceiver): KotlinValueClassSpec = KotlinValueClassSpecBuilder.builder(className).also(block).build() fun toFileSpec(spec: KotlinValueClassSpecSupplier): KotlinFileSpec = spec.spec().let { @@ -53,18 +45,11 @@ object KotlinCodeGeneration { @Suppress(CLASS_NAME) object builder { - @JvmStatic fun annotationBuilder(type: ClassName) = KotlinAnnotationSpecBuilder.builder(type) - - @JvmStatic fun annotationClassBuilder(className: ClassName) = KotlinAnnotationClassSpecBuilder.builder(className) - - @JvmStatic fun constructorPropertyBuilder(name: String, type: TypeName) = KotlinConstructorPropertySpecBuilder.builder(name, type) - - @JvmStatic + fun fileBuilder(className: ClassName) = KotlinFileSpecBuilder.builder(className) fun valueClassBuilder(className: ClassName) = KotlinValueClassSpecBuilder.builder(className) - } @Suppress(CLASS_NAME) @@ -72,20 +57,20 @@ object KotlinCodeGeneration { data class GeneratedAnnotation( val value: String = KotlinCodeGeneration::class.asTypeName().toString(), - val date: String = Instant.now().toString(), + val date: Instant = Instant.now(), val comments: List = emptyList() ) : KotlinAnnotationSpecSupplier { fun generator(type: KClass<*>) = copy(value = type.asTypeName().toString()) - fun date(instant: Instant) = copy(date = instant.toString()) + fun date(instant: Instant) = copy(date = instant) fun comment(comment: Pair) = copy(comments = this.comments + "${comment.first} = ${comment.second}") override fun spec(): KotlinAnnotationSpec = buildAnnotation(Generated::class) { addStringMember("value", value) - addStringMember("date", date) + addStringMember("date", date.toString()) if (comments.isNotEmpty()) { - addStringMember("comments", comments.joinToString(separator = ", ")) + addStringMember("comments", comments.joinToString(separator = "; ")) } } } @@ -102,9 +87,14 @@ object KotlinCodeGeneration { } @Suppress(CLASS_NAME) - object typeName { + object name { + fun MemberName.asCodeBlock(): CodeBlock = buildCodeBlock("%M", this) + + fun Collection.asCodeBlock(): CodeBlock = this.map{it.asCodeBlock()}.joinToCode(prefix = "[", suffix = "]") + + fun Enum<*>.asMemberName(): MemberName = this::class.asClassName().member(this.name) - operator fun ClassName.plus(suffix: String?) = ClassName(this.packageName, this.simpleNames) + operator fun ClassName.plus(suffix: String?): ClassName = ClassName(this.packageName, this.simpleNames) fun TypeName.nullable(nullable: Boolean = true): TypeName = this.copy(nullable = nullable) } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt index 207a527..7e6deed 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt @@ -1,10 +1,9 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.KModifier import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.KotlinCodeGeneration +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertySpecBuilder.Companion.primaryConstructorWithProperties import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver @@ -15,8 +14,7 @@ import io.toolisticon.kotlin.generation.spec.toList class KotlinAnnotationClassSpecBuilder internal constructor( val className: ClassName, - private val delegate: TypeSpecBuilder, - private val constructorProperties: LinkedHashMap = LinkedHashMap() + private val delegate: TypeSpecBuilder ) : BuilderSupplier, KotlinAnnotationClassSpecSupplier, ConstructorPropertySupport, DelegatingBuilder { @@ -33,16 +31,20 @@ class KotlinAnnotationClassSpecBuilder internal constructor( ) } - init { - delegate.addModifiers(KModifier.ANNOTATION) - } + private lateinit var _retention: AnnotationRetention + private val constructorProperties: LinkedHashMap = LinkedHashMap() + private val targets: MutableSet = mutableSetOf() + private var repeatable: Boolean = false + private var mustBeDocumented: Boolean = false - override fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) = apply { - constructorProperties[spec.name] = spec - } + override fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) = apply { constructorProperties[spec.name] = spec } - fun mustBeDocumented() = apply { - delegate.addAnnotation(KotlinCodeGeneration.buildAnnotation(MustBeDocumented::class).get()) + fun mustBeDocumented() = apply { this.mustBeDocumented = true } + fun repeatable() = apply { this.repeatable = true } + fun target(vararg targets: AnnotationTarget) = apply { this.targets.addAll(targets) } + + fun retention(retention: AnnotationRetention) = apply { + this._retention = retention } override fun builder(block: TypeSpecBuilderReceiver) = apply { @@ -53,6 +55,23 @@ class KotlinAnnotationClassSpecBuilder internal constructor( if (constructorProperties.isNotEmpty()) { delegate.primaryConstructorWithProperties(toList(constructorProperties.values)) } + if (targets.isNotEmpty()) { + delegate.addAnnotation(buildAnnotation(Target::class) { + addEnumMembers("allowedTargets", *(targets.sortedBy(AnnotationTarget::name).toTypedArray())) + }) + } + if (this::_retention.isInitialized) { + delegate.addAnnotation(buildAnnotation(Retention::class) { + addEnumMember("value", _retention) + }) + } + + if (repeatable) { + delegate.addAnnotation(Repeatable::class) + } + if (mustBeDocumented) { + delegate.addAnnotation(MustBeDocumented::class) + } return KotlinAnnotationClassSpec(className = className, spec = delegate.build()) } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt index e37d0df..bf83461 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt @@ -2,6 +2,9 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildCodeBlock +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.name.asCodeBlock +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.name.asMemberName import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilder import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilderReceiver @@ -45,10 +48,19 @@ class KotlinAnnotationSpecBuilder internal constructor( delegate.addMember(codeBlock) } + fun addMember(memberName: MemberName): KotlinAnnotationSpecBuilder = addMember("%M", memberName) + fun addKClassMember(name: String, klass: KClass<*>) = addMember("$name = %T::class", klass) fun addStringMember(name: String, value: String) = addMember("$name = %S", value) + fun addEnumMember(name: String, value: Enum<*>): KotlinAnnotationSpecBuilder = addMember("$name = %M", value.asMemberName()) + + fun addEnumMembers(name: String, vararg value: Enum<*>): KotlinAnnotationSpecBuilder { + val members = value.map { it.asMemberName() }.asCodeBlock() + return addMember(buildCodeBlock(format = "$name = %L", args = arrayOf(members))) + } + override fun builder(block: AnnotationSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt index fabe479..4393eb9 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt @@ -27,3 +27,5 @@ class KotlinAnonymousClassSpecBuilder internal constructor( delegate.builder.block() } } + +typealias KotlinAnonymousClassSpecBuilderReceiver = KotlinAnonymousClassSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt index f7d4654..faebfce 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -117,3 +117,5 @@ class KotlinClassSpecBuilder internal constructor( // ) // // } + +typealias KotlinClassSpecBuilderReceiver = KotlinClassSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index 169adaa..a889ae4 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -16,7 +16,10 @@ import kotlin.reflect.KClass class KotlinDataClassSpecBuilder internal constructor( private val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, KotlinDataClassSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, + KotlinDataClassSpecSupplier, + ConstructorPropertySupport, + DelegatingBuilder { companion object : KLogging() { @JvmStatic @@ -62,18 +65,10 @@ class KotlinDataClassSpecBuilder internal constructor( // } // - fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) = apply { + override fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) = apply { this.constructorProperties[spec.name] = spec } - fun addConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = addConstructorProperty( - buildConstructorProperty(name, type, block) - ) - - fun addConstructorProperty(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = addConstructorProperty( - buildConstructorProperty(name, type, block) - ) - fun addAnnotation(annotation: KotlinAnnotationSpecSupplier) = apply { delegate.addAnnotation(annotation.get()) } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt index 4cc0dfb..ac5ae43 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -56,3 +56,5 @@ class KotlinEnumClassSpecBuilder internal constructor( override fun get(): TypeSpec = build().get() } + +typealias KotlinEnumClassSpecBuilderReceiver = KotlinEnumClassSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index 0b65b7a..b3ecc76 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -68,3 +68,5 @@ class KotlinFunSpecBuilder internal constructor( override fun spec(): KotlinFunSpec = build() override fun get(): FunSpec = build().get() } + +typealias KotlinFunSpecBuilderReceiver = KotlinFunSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt index 915b3fd..4adf678 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt @@ -38,3 +38,5 @@ class KotlinInterfaceSpecBuilder internal constructor( override fun spec(): KotlinInterfaceSpec = build() override fun get(): TypeSpec = build().get() } + +typealias KotlinInterfaceSpecBuilderReceiver = KotlinInterfaceSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt index e139f1b..67b8a10 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt @@ -46,3 +46,5 @@ class KotlinObjectSpecBuilder internal constructor( override fun spec(): KotlinObjectSpec = build() override fun get(): TypeSpec = build().get() } + +typealias KotlinObjectSpecBuilderReceiver = KotlinObjectSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt index 62c1c2d..7075a7e 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -93,3 +93,5 @@ class KotlinParameterSpecBuilder internal constructor( override fun spec(): KotlinParameterSpec = build() override fun get(): ParameterSpec = build().get() } + +typealias KotlinParameterSpecBuilderReceiver = KotlinParameterSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index 1a16caa..eea030a 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -90,3 +90,5 @@ class KotlinPropertySpecBuilder internal constructor( override fun spec(): KotlinPropertySpec = build() override fun get(): PropertySpec = build().get() } + +typealias KotlinPropertySpecBuilderReceiver = KotlinPropertySpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt index f0091f7..53ece28 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt @@ -41,3 +41,5 @@ class KotlinTypeAliasSpecBuilder internal constructor( override fun get(): TypeAliasSpec = build().get() } + +typealias KotlinTypeAliasSpecBuilderReceiver = KotlinTypeAliasSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt index 0a7809f..2c3e0f6 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -2,23 +2,22 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.jvm.jvmInline import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.KotlinCodeGeneration import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver -import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpec import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpecSupplier -import kotlin.reflect.KClass class KotlinValueClassSpecBuilder internal constructor( val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, KotlinValueClassSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, + KotlinValueClassSpecSupplier, + ConstructorPropertySupport, + DelegatingBuilder { companion object { @@ -32,8 +31,7 @@ class KotlinValueClassSpecBuilder internal constructor( fun builder(className: ClassName): KotlinValueClassSpecBuilder = KotlinValueClassSpecBuilder(className) } - lateinit var constructorProperty: KotlinConstructorPropertySpec - + lateinit var constructorProperty: KotlinConstructorPropertySpecSupplier internal constructor(className: ClassName) : this( className = className, @@ -45,23 +43,8 @@ class KotlinValueClassSpecBuilder internal constructor( delegate.builder.jvmInline() } - fun primaryConstructor(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = primaryConstructor( - KotlinCodeGeneration.buildConstructorProperty(name, type, block) - ) - - fun primaryConstructor(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = primaryConstructor( - KotlinCodeGeneration.buildConstructorProperty(name, type, block) - ) - - fun primaryConstructor(constructorPropertySupplier: KotlinConstructorPropertySpecSupplier) = apply { - this.constructorProperty = constructorPropertySupplier.spec() - - val constructor = KotlinFunSpecBuilder.constructorBuilder() - .addParameter(this.constructorProperty.parameter) - .build() - - delegate.addProperty(constructorProperty.property.get()) - delegate.builder.primaryConstructor(constructor.get()) + override fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier): KotlinValueClassSpecBuilder = apply { + this.constructorProperty = spec } override fun builder(block: TypeSpecBuilderReceiver) = apply { @@ -71,8 +54,14 @@ class KotlinValueClassSpecBuilder internal constructor( override fun build(): KotlinValueClassSpec { check(::constructorProperty.isInitialized) { "Value class must have exactly one property." } - val spec = delegate.build() - return KotlinValueClassSpec(className = className, spec = spec) + val constructor = KotlinFunSpecBuilder.constructorBuilder() + .addParameter(this.constructorProperty.spec().parameter) + .build() + + delegate.addProperty(constructorProperty.spec().property.get()) + delegate.builder.primaryConstructor(constructor.get()) + + return KotlinValueClassSpec(className = className, spec = delegate.build()) } override fun spec(): KotlinValueClassSpec = build() diff --git a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt index d853b7c..98306c9 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FileSpecBuilder.kt @@ -10,21 +10,12 @@ class FileSpecBuilder( MemberSpecHolderBuilder, TypeSpecHolderBuilder { companion object { - fun FileSpec.Builder.wrap() = FileSpecBuilder(this) + internal fun FileSpec.Builder.wrap() = FileSpecBuilder(this) - @JvmStatic fun get(packageName: String, typeSpec: TypeSpec): FileSpec = FileSpec.get(packageName, typeSpec) - - @JvmStatic fun builder(className: ClassName): FileSpecBuilder = FileSpec.builder(className).wrap() - - @JvmStatic fun builder(memberName: MemberName): FileSpecBuilder = FileSpec.builder(memberName).wrap() - - @JvmStatic fun builder(packageName: String, fileName: String): FileSpecBuilder = FileSpec.builder(packageName, fileName).wrap() - - @JvmStatic fun scriptBuilder(fileName: String, packageName: String = ""): FileSpecBuilder = FileSpec.scriptBuilder(fileName, packageName).wrap() } diff --git a/kotlin-code-generation/src/main/kotlin/poet/_types.kt b/kotlin-code-generation/src/main/kotlin/poet/_types.kt index 59545a8..fa40114 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/_types.kt @@ -36,6 +36,7 @@ sealed interface AnnotatableBuilder { fun addAnnotation(annotation: KClass<*>): SELF = addAnnotation(annotation.asClassName()) + fun addAnnotation(annotationSupplier: AnnotationSpecSupplier): SELF = addAnnotation(annotationSupplier.get()) } sealed interface TypeSpecHolderBuilder { diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt deleted file mode 100644 index 7d8cbea..0000000 --- a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationClassTest.kt +++ /dev/null @@ -1,18 +0,0 @@ -package io.toolisticon.kotlin.generation - -import com.squareup.kotlinpoet.ClassName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotationClass -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec -import org.junit.jupiter.api.Test - -internal class KotlinAnnotationClassTest { - @Test - fun `build custom annotation class`() { - val annotationClass: KotlinAnnotationClassSpec = buildAnnotationClass(className = ClassName("foo","CustomAnnotation")) { - mustBeDocumented() - addConstructorProperty("value", String::class) - } - - println(annotationClass.get()) - } -} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinCodeGenerationTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinCodeGenerationTest.kt new file mode 100644 index 0000000..04afe59 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/KotlinCodeGenerationTest.kt @@ -0,0 +1,24 @@ +package io.toolisticon.kotlin.generation + +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.name.asCodeBlock +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.name.asMemberName +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +internal class KotlinCodeGenerationTest { + + @Nested + inner class Name { + + @Test + fun `join members to array`() { + val m1 = AnnotationTarget.VALUE_PARAMETER.asMemberName() + val m2 = AnnotationTarget.ANNOTATION_CLASS.asMemberName() + val code = listOf(m1,m2).asCodeBlock() + + assertThat(code).hasToString("[kotlin.`annotation`.AnnotationTarget.VALUE_PARAMETER, kotlin.`annotation`.AnnotationTarget.ANNOTATION_CLASS]") + } + } + +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt deleted file mode 100644 index 4c02ecb..0000000 --- a/kotlin-code-generation/src/test/kotlin/KotlinConstructorPropertyTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package io.toolisticon.kotlin.generation - -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.asTypeName -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass -import org.junit.jupiter.api.Test - -internal class KotlinConstructorPropertyTest { - @Test - fun name() { - TODO("Not yet implemented") - } - - -} diff --git a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt index b2b9544..3e5abb4 100644 --- a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt +++ b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt @@ -9,7 +9,7 @@ object TestFixtures { // a fixed instant to be used in test with val NOW = Instant.parse( "2024-07-02T10:01:33.205357100Z") - @Target(AnnotationTarget.VALUE_PARAMETER) + @Target(allowedTargets = [AnnotationTarget.VALUE_PARAMETER]) annotation class MyAnnotation( val name: String, val type: KClass<*> diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinAnnotationClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnnotationClassTest.kt new file mode 100644 index 0000000..e56ec23 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnnotationClassTest.kt @@ -0,0 +1,34 @@ +package io.toolisticon.kotlin.generation.spec + +import com.squareup.kotlinpoet.ClassName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotationClass +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +internal class KotlinAnnotationClassTest { + @Test + fun `build custom annotation class`() { + val className = ClassName("foo", "CustomAnnotation") + + val annotationClass: KotlinAnnotationClassSpec = buildAnnotationClass(className) { + mustBeDocumented() + retention(AnnotationRetention.SOURCE) + target(AnnotationTarget.CLASS, AnnotationTarget.ANNOTATION_CLASS) + target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) + repeatable() + addConstructorProperty("value", String::class) + } + + assertThat(annotationClass.code).isEqualTo(""" + @kotlin.`annotation`.Target(allowedTargets = [kotlin.`annotation`.AnnotationTarget.ANNOTATION_CLASS, kotlin.`annotation`.AnnotationTarget.CLASS, kotlin.`annotation`.AnnotationTarget.FUNCTION]) + @kotlin.`annotation`.Retention(value = kotlin.`annotation`.AnnotationRetention.SOURCE) + @kotlin.`annotation`.Repeatable + @kotlin.`annotation`.MustBeDocumented + public annotation class CustomAnnotation( + public val `value`: kotlin.String, + ) + + """.trimIndent() + ) + } +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnnotationTest.kt similarity index 78% rename from kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinAnnotationTest.kt index 8cc5e93..b00e2a0 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinAnnotationTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnnotationTest.kt @@ -1,9 +1,8 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation import io.toolisticon.kotlin.generation.TestFixtures.MyAnnotation import io.toolisticon.kotlin.generation.builder.KotlinAnnotationSpecBuilder -import io.toolisticon.kotlin.generation.spec.toBuilder import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import kotlin.reflect.KClass @@ -16,8 +15,6 @@ internal class KotlinAnnotationTest { val type: KClass<*> = String::class ) - - @Test fun buildMyAnnotation() { val annotation = buildAnnotation(MyAnnotation::class) { @@ -37,12 +34,12 @@ internal class KotlinAnnotationTest { .addKClassMember("type", Long::class) .build() - assertThat(spec.code).isEqualTo("""@io.toolisticon.kotlin.generation.KotlinAnnotationTest.Foo(bar = "hello world", x = "foo", type = kotlin.Long::class)""") + assertThat(spec.code).isEqualTo("""@io.toolisticon.kotlin.generation.spec.KotlinAnnotationTest.Foo(bar = "hello world", x = "foo", type = kotlin.Long::class)""") assertThat(spec.members).hasSize(3) assertThat(spec).hasToString( "KotlinAnnotationSpec(" + - "typeName=io.toolisticon.kotlin.generation.KotlinAnnotationTest.Foo, " + + "typeName=io.toolisticon.kotlin.generation.spec.KotlinAnnotationTest.Foo, " + "members=[" + "bar = \"hello world\", " + "x = \"foo\", " + @@ -65,4 +62,13 @@ internal class KotlinAnnotationTest { assertThat(spec.members).hasSize(2) } + + @Test + fun `create target annotation`() { + val annotation = buildAnnotation(Target::class) { + addEnumMembers("allowedTargets", AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FILE) + } + + println(annotation.code) + } } diff --git a/kotlin-code-generation/src/test/kotlin/KotlinAnonymousClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnonymousClassTest.kt similarity index 75% rename from kotlin-code-generation/src/test/kotlin/KotlinAnonymousClassTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinAnonymousClassTest.kt index 5a4543e..d24a856 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinAnonymousClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnonymousClassTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinClassTest.kt similarity index 73% rename from kotlin-code-generation/src/test/kotlin/KotlinClassTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinClassTest.kt index 6ba95b4..055039f 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinClassTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinCompanionObjectTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinCompanionObjectTest.kt similarity index 75% rename from kotlin-code-generation/src/test/kotlin/KotlinCompanionObjectTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinCompanionObjectTest.kt index 4e80eec..bf82d91 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinCompanionObjectTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinCompanionObjectTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt new file mode 100644 index 0000000..36845d6 --- /dev/null +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt @@ -0,0 +1,12 @@ +package io.toolisticon.kotlin.generation.spec + +import org.junit.jupiter.api.Test + +internal class KotlinConstructorPropertyTest { + @Test + fun name() { + TODO("Not yet implemented") + } + + +} diff --git a/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinDataClassTest.kt similarity index 76% rename from kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinDataClassTest.kt index e2d628e..9431307 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinDataClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinDataClassTest.kt @@ -1,10 +1,11 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.KotlinCodeGeneration.annotation.GeneratedAnnotation import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass +import io.toolisticon.kotlin.generation.TestFixtures import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -14,14 +15,9 @@ internal class KotlinDataClassTest { fun `create foo`() { val className = ClassName("test", "Foo") - val c1 = buildConstructorProperty("x", Int::class.asTypeName()) - val c2 = buildConstructorProperty("y", Long::class) { - makePrivate() - } - val spec = buildDataClass(className) { - addAnnotation(GeneratedAnnotation(date = TestFixtures.NOW.toString()).comment("version" to "1.2")) - addConstructorProperty("x", Int::class.asTypeName()) + addAnnotation(GeneratedAnnotation(date = TestFixtures.NOW).comment("version" to "1.2")) + addConstructorProperty("x", Int::class) addConstructorProperty("y", Long::class) { makePrivate() addAnnotation(TestFixtures.myAnnotationSpec) diff --git a/kotlin-code-generation/src/test/kotlin/KotlinEnumClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinEnumClassTest.kt similarity index 74% rename from kotlin-code-generation/src/test/kotlin/KotlinEnumClassTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinEnumClassTest.kt index b45cc54..f1840e3 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinEnumClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinEnumClassTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinFileTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinFileTest.kt similarity index 73% rename from kotlin-code-generation/src/test/kotlin/KotlinFileTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinFileTest.kt index 56ceb3f..668982e 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinFileTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinFileTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinFunTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinFunTest.kt similarity index 73% rename from kotlin-code-generation/src/test/kotlin/KotlinFunTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinFunTest.kt index c74a27b..8390586 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinFunTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinFunTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinInterfaceTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinInterfaceTest.kt similarity index 74% rename from kotlin-code-generation/src/test/kotlin/KotlinInterfaceTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinInterfaceTest.kt index 14b3c1b..cf8edd5 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinInterfaceTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinInterfaceTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinObjectTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinObjectTest.kt similarity index 74% rename from kotlin-code-generation/src/test/kotlin/KotlinObjectTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinObjectTest.kt index 2358c1a..a1522ec 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinObjectTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinObjectTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinParameterTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinParameterTest.kt similarity index 74% rename from kotlin-code-generation/src/test/kotlin/KotlinParameterTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinParameterTest.kt index 511b6af..e6fc343 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinParameterTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinParameterTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinPropertyTest.kt similarity index 74% rename from kotlin-code-generation/src/test/kotlin/KotlinPropertyTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinPropertyTest.kt index 0fea7e7..6f4903d 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinPropertyTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinPropertyTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinTypeAliasTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinTypeAliasTest.kt similarity index 74% rename from kotlin-code-generation/src/test/kotlin/KotlinTypeAliasTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinTypeAliasTest.kt index 26aec08..024343c 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinTypeAliasTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinTypeAliasTest.kt @@ -1,4 +1,4 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import org.junit.jupiter.api.Test diff --git a/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinValueClassTest.kt similarity index 75% rename from kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt rename to kotlin-code-generation/src/test/kotlin/spec/KotlinValueClassTest.kt index 5266b0f..c9a059b 100644 --- a/kotlin-code-generation/src/test/kotlin/KotlinValueClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinValueClassTest.kt @@ -1,10 +1,9 @@ -package io.toolisticon.kotlin.generation +package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildValueClass import io.toolisticon.kotlin.generation.KotlinCodeGeneration.toFileSpec -import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertySpecBuilder +import io.toolisticon.kotlin.generation.TestFixtures import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -14,7 +13,7 @@ internal class KotlinValueClassTest { fun `build foo with string value`() { val className = ClassName("test", "Foo") val valueClass = buildValueClass(className = className) { - primaryConstructor("bar", String::class) { + addConstructorProperty("bar", String::class) { makePrivate() addAnnotation(TestFixtures.myAnnotationSpec) } @@ -41,11 +40,9 @@ public value class Foo( val className = ClassName("io.acme", "Foo") val spec = buildValueClass(className) { - primaryConstructor( - KotlinConstructorPropertySpecBuilder.builder("bar", String::class.asTypeName()) - .addAnnotation(TestFixtures.myAnnotationSpec) - .build() - ) + addConstructorProperty("bar", String::class) { + addAnnotation(TestFixtures.myAnnotationSpec) + } } assertThat(spec.code.trim()).isEqualTo( From cd1603253e1965d1bb83f803d4978bd3055f280b Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Wed, 3 Jul 2024 17:41:39 +0200 Subject: [PATCH 17/19] chore: wip --- _itest/pom.xml | 4 +- .../main/kotlin/KotlinCodeGenerationITest.kt | 2 +- .../src/main/kotlin/MyCustomAnnotationSpec.kt | 21 +++++++++ .../src/test/kotlin/HelloWorldExampleTest.kt | 44 ++++++++---------- .../test/kotlin/KotlinDataClassSpecTest.kt | 14 ++---- _itest/src/test/kotlin/KotlinFileSpecTest.kt | 5 +- .../test/kotlin/MyCustomAnnotationSpecTest.kt | 46 +++++++++++++++++++ _mvn/parent/pom.xml | 8 +++- kotlin-code-generation-bom/pom.xml | 13 ------ kotlin-code-generation-test/pom.xml | 15 +----- .../main/kotlin/KotlinCodeGenerationTest.kt | 8 ++-- .../main/kotlin/KotlinCompilationAssert.kt | 2 - .../kotlin/model/KotlinCompilationCommand.kt | 12 +++-- .../kotlin/model/KotlinCompilationResult.kt | 6 +-- .../src/main/kotlin/KotlinCodeGeneration.kt | 16 ++++++- .../kotlin/builder/KotlinClassSpecBuilder.kt | 21 +++++++-- .../kotlin/builder/KotlinFunSpecBuilder.kt | 5 ++ .../src/main/kotlin/builder/_types.kt | 2 + .../src/main/kotlin/poet/FunSpecBuilder.kt | 2 - .../main/kotlin/poet/PropertySpecBuilder.kt | 2 - .../src/main/kotlin/poet/TypeSpecBuilder.kt | 3 -- .../src/main/kotlin/poet/_types.kt | 4 -- .../src/test/kotlin/TestFixtures.kt | 1 + .../kotlin/spec/KotlinAnonymousClassTest.kt | 4 ++ .../src/test/kotlin/spec/KotlinClassTest.kt | 4 ++ .../kotlin/spec/KotlinCompanionObjectTest.kt | 6 +++ .../spec/KotlinConstructorPropertyTest.kt | 5 ++ .../test/kotlin/spec/KotlinEnumClassTest.kt | 4 ++ .../src/test/kotlin/spec/KotlinFileTest.kt | 4 ++ .../src/test/kotlin/spec/KotlinFunTest.kt | 4 ++ .../test/kotlin/spec/KotlinInterfaceTest.kt | 4 ++ .../src/test/kotlin/spec/KotlinObjectTest.kt | 4 ++ .../test/kotlin/spec/KotlinParameterTest.kt | 4 ++ .../test/kotlin/spec/KotlinPropertyTest.kt | 4 ++ .../test/kotlin/spec/KotlinTypeAliasTest.kt | 4 ++ pom.xml | 45 ++++++++++++------ 36 files changed, 241 insertions(+), 111 deletions(-) create mode 100644 _itest/src/main/kotlin/MyCustomAnnotationSpec.kt create mode 100644 _itest/src/test/kotlin/MyCustomAnnotationSpecTest.kt diff --git a/_itest/pom.xml b/_itest/pom.xml index 5605759..e1d6315 100644 --- a/_itest/pom.xml +++ b/_itest/pom.xml @@ -4,10 +4,10 @@ io.toolisticon.kotlin.generation._ - kotlin-code-generation-root + kotlin-code-generation-parent 0.0.1-SNAPSHOT + ../_mvn/parent/pom.xml - io.toolisticon.kotlin.generation.itest kotlin-code-generation-itest test: ${project.artifactId} diff --git a/_itest/src/main/kotlin/KotlinCodeGenerationITest.kt b/_itest/src/main/kotlin/KotlinCodeGenerationITest.kt index 2a0bb33..5d82872 100644 --- a/_itest/src/main/kotlin/KotlinCodeGenerationITest.kt +++ b/_itest/src/main/kotlin/KotlinCodeGenerationITest.kt @@ -1,5 +1,5 @@ package io.toolisticon.kotlin.generation.itest object KotlinCodeGenerationITest { - // empty + const val ROOT_PACKAGE = "io.toolisticon.kotlin.generation.itest.created" } diff --git a/_itest/src/main/kotlin/MyCustomAnnotationSpec.kt b/_itest/src/main/kotlin/MyCustomAnnotationSpec.kt new file mode 100644 index 0000000..974ddff --- /dev/null +++ b/_itest/src/main/kotlin/MyCustomAnnotationSpec.kt @@ -0,0 +1,21 @@ +package io.toolisticon.kotlin.generation.itest + +import com.squareup.kotlinpoet.ClassName +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotationClass +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildFile +import io.toolisticon.kotlin.generation.itest.KotlinCodeGenerationITest.ROOT_PACKAGE + +object MyCustomAnnotationSpec { + val name = ClassName(ROOT_PACKAGE, "MyCustomAnnotation") + + val spec = buildAnnotationClass(name) { + mustBeDocumented() + retention(AnnotationRetention.RUNTIME) + target(AnnotationTarget.CLASS) + addConstructorProperty("value", String::class) + } + + val file = buildFile(name) { + addType(spec) + } +} diff --git a/_itest/src/test/kotlin/HelloWorldExampleTest.kt b/_itest/src/test/kotlin/HelloWorldExampleTest.kt index 362c9e3..8780f55 100644 --- a/_itest/src/test/kotlin/HelloWorldExampleTest.kt +++ b/_itest/src/test/kotlin/HelloWorldExampleTest.kt @@ -1,17 +1,13 @@ -@file:OptIn(ExperimentalCompilerApi::class) - package io.toolisticon.kotlin.generation.itest import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.FunSpec -import com.squareup.kotlinpoet.TypeSpec import com.tschuchort.compiletesting.KotlinCompilation -import io.toolisticon.kotlin.generation.builder.KotlinFileSpecBuilder +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildClass +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildFile +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildFun import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest -import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest.assertThat import io.toolisticon.kotlin.generation.test.model.KotlinCompilationCommand -import org.assertj.core.api.Assertions -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test internal class HelloWorldExampleTest { @@ -20,30 +16,28 @@ internal class HelloWorldExampleTest { fun `hello world from kotlin poet talk`() { val name = ClassName("foo.bar", "HelloWorld") - val type = TypeSpec.classBuilder(name) - .addKdoc("%L", "Simple hello world class") - .addFunction( - FunSpec.builder("helloWorld") - .returns(String::class) - .addCode("return %S", "Hello World!") - .build() - ) - .build() - - val file = KotlinFileSpecBuilder.builder(name).invoke { + val type = buildClass(name) { + addFunction( + buildFun("helloWorld") { + builder { + returns(String::class) + addCode("return %S", "Hello World!") + } + }) + addKdoc("%L", "Simple hello world class") + } + + val file = buildFile(name) { addType(type) - }.build() - + } println(file.code) - Assertions.assertThat(file.packageName).isEqualTo("foo.bar") + assertThat(file.packageName).isEqualTo("foo.bar") val result = KotlinCodeGenerationTest.compile(cmd = KotlinCompilationCommand(fileSpec = file)) println(result) - assertThat(result).hasExitCode(KotlinCompilation.ExitCode.OK) - - + KotlinCodeGenerationTest.assertThat(result).hasExitCode(KotlinCompilation.ExitCode.OK) } } diff --git a/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt b/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt index 2915a08..c713710 100644 --- a/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt +++ b/_itest/src/test/kotlin/KotlinDataClassSpecTest.kt @@ -3,26 +3,22 @@ package io.toolisticon.kotlin.generation.itest import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.asTypeName import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildDataClass -import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertyBuilder -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.constructorPropertyBuilder -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.dataClassBuilder +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.dataClassBuilder import io.toolisticon.kotlin.generation.builder.KotlinDataClassSpecBuilder -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import org.junit.jupiter.api.Test -@OptIn(ExperimentalCompilerApi::class) internal class KotlinDataClassSpecTest { @Test fun `create simple data class`() { val className = ClassName("foo.bar", "Bar") val builder: KotlinDataClassSpecBuilder = dataClassBuilder(className) - .addConstructorProperty(constructorPropertyBuilder("name", String::class)) - .addConstructorProperty(constructorPropertyBuilder("age", Int::class)) + .addConstructorProperty("name", String::class) + .addConstructorProperty("age", Int::class) val spec = buildDataClass(className) { - addConstructorProperty(KotlinConstructorPropertyBuilder.builder("name", String::class.asTypeName())) - addConstructorProperty(KotlinConstructorPropertyBuilder.builder("age", Int::class.asTypeName())) + addConstructorProperty("name", String::class.asTypeName()) + addConstructorProperty("age", Int::class.asTypeName()) } // val file = spec.toFileSpec() diff --git a/_itest/src/test/kotlin/KotlinFileSpecTest.kt b/_itest/src/test/kotlin/KotlinFileSpecTest.kt index a7629ce..ef1eb4d 100644 --- a/_itest/src/test/kotlin/KotlinFileSpecTest.kt +++ b/_itest/src/test/kotlin/KotlinFileSpecTest.kt @@ -23,17 +23,16 @@ internal class KotlinFileSpecTest { @Test fun `build filespec`() { - val builder: KotlinFileSpecBuilder = KotlinFileSpecBuilder.builder(ClassName("foo", "Bar")).invoke { + val builder: KotlinFileSpecBuilder = KotlinFileSpecBuilder.builder(ClassName("foo", "Bar")).builder { addFileComment("%L", "this is a comment.") } - val b = builder { + val b = builder.builder { addAnnotation(Foo::class) } val spec = b.build() println(spec.code) - println(spec) } } diff --git a/_itest/src/test/kotlin/MyCustomAnnotationSpecTest.kt b/_itest/src/test/kotlin/MyCustomAnnotationSpecTest.kt new file mode 100644 index 0000000..597c2b0 --- /dev/null +++ b/_itest/src/test/kotlin/MyCustomAnnotationSpecTest.kt @@ -0,0 +1,46 @@ +package io.toolisticon.kotlin.generation.itest + +import com.squareup.kotlinpoet.ClassName +import com.tschuchort.compiletesting.KotlinCompilation +import io.toolisticon.kotlin.generation.KotlinCodeGeneration +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildFile +import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest +import io.toolisticon.kotlin.generation.test.model.KotlinCompilationCommand +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import kotlin.reflect.KClass +import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest.assertThat as assertThatCompilation + + +internal class MyCustomAnnotationSpecTest { + + @Test + fun `generate class with custom annotation`() { + val name = ClassName(KotlinCodeGenerationITest.ROOT_PACKAGE, "MyClass") + + val customAnnotation = buildAnnotation(MyCustomAnnotationSpec.name) { + addStringMember("value", "hello") + } + + val myClass = KotlinCodeGeneration.buildClass(name) { + addAnnotation(customAnnotation) + } + + val file = buildFile(name) { + addType(myClass) + } + + println(myClass.code) + + val result = KotlinCodeGenerationTest.compile(KotlinCompilationCommand(MyCustomAnnotationSpec.file).plus(file)) + + assertThatCompilation(result).hasExitCode(KotlinCompilation.ExitCode.OK); + + val klass: KClass = result.loadClass(name) + assertThat(klass.annotations).hasSize(1) + val annotation: Annotation = klass.annotations[0] + + //assertThat(annotation::class.) + } +} diff --git a/_mvn/parent/pom.xml b/_mvn/parent/pom.xml index 5c8b17b..fe36a22 100644 --- a/_mvn/parent/pom.xml +++ b/_mvn/parent/pom.xml @@ -16,6 +16,10 @@ 1.17.0 0.5.0-alpha08 + + + 3.26.0 + 1.5.6 @@ -36,13 +40,13 @@ org.assertj assertj-core - 3.26.0 + ${assertj.version} test ch.qos.logback logback-classic - 1.5.6 + ${logback.version} test diff --git a/kotlin-code-generation-bom/pom.xml b/kotlin-code-generation-bom/pom.xml index fd62a7b..b9220bc 100644 --- a/kotlin-code-generation-bom/pom.xml +++ b/kotlin-code-generation-bom/pom.xml @@ -32,19 +32,6 @@ ${project.version} test - - - com.squareup - kotlinpoet-jvm - ${kotlin-poet.version} - - - - dev.zacsweers.kctfork - core - test - ${kotlin-compile-testing.version} - diff --git a/kotlin-code-generation-test/pom.xml b/kotlin-code-generation-test/pom.xml index eb149f0..451b84e 100644 --- a/kotlin-code-generation-test/pom.xml +++ b/kotlin-code-generation-test/pom.xml @@ -4,26 +4,15 @@ io.toolisticon.kotlin.generation._ - kotlin-code-generation-root + kotlin-code-generation-parent 0.0.1-SNAPSHOT + ../_mvn/parent/pom.xml io.toolisticon.kotlin.generation kotlin-code-generation-test Tools for testing generated classes. This lib exposes testing libraries and is supposed to be included with `scope=test` - - - - io.toolisticon.kotlin.generation - kotlin-code-generation-bom - ${project.version} - import - pom - - - - diff --git a/kotlin-code-generation-test/src/main/kotlin/KotlinCodeGenerationTest.kt b/kotlin-code-generation-test/src/main/kotlin/KotlinCodeGenerationTest.kt index 87e56cc..5218926 100644 --- a/kotlin-code-generation-test/src/main/kotlin/KotlinCodeGenerationTest.kt +++ b/kotlin-code-generation-test/src/main/kotlin/KotlinCodeGenerationTest.kt @@ -2,9 +2,10 @@ package io.toolisticon.kotlin.generation.test import com.tschuchort.compiletesting.JvmCompilationResult import com.tschuchort.compiletesting.KotlinCompilation +import com.tschuchort.compiletesting.SourceFile +import io.toolisticon.kotlin.generation.spec.KotlinFileSpec import io.toolisticon.kotlin.generation.test.model.KotlinCompilationCommand import io.toolisticon.kotlin.generation.test.model.KotlinCompilationResult -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import java.io.ByteArrayOutputStream /** @@ -28,7 +29,6 @@ import java.io.ByteArrayOutputStream * }.compile() * ``` */ -@OptIn(ExperimentalCompilerApi::class) object KotlinCodeGenerationTest { @JvmStatic @@ -38,7 +38,7 @@ object KotlinCodeGenerationTest { fun compile(cmd: KotlinCompilationCommand): KotlinCompilationResult { val result: JvmCompilationResult = KotlinCompilation().apply { - sources = listOf(cmd.sourceFile) + sources = cmd.sourceFiles inheritClassPath = true this. @@ -50,5 +50,5 @@ object KotlinCodeGenerationTest { return KotlinCompilationResult(cmd = cmd, result = result) } - + fun KotlinFileSpec.sourceFile() = SourceFile.kotlin(name = this.fileName, contents = this.code) } diff --git a/kotlin-code-generation-test/src/main/kotlin/KotlinCompilationAssert.kt b/kotlin-code-generation-test/src/main/kotlin/KotlinCompilationAssert.kt index 2299f1b..9ba64ad 100644 --- a/kotlin-code-generation-test/src/main/kotlin/KotlinCompilationAssert.kt +++ b/kotlin-code-generation-test/src/main/kotlin/KotlinCompilationAssert.kt @@ -4,9 +4,7 @@ import com.tschuchort.compiletesting.KotlinCompilation import io.toolisticon.kotlin.generation.test.model.KotlinCompilationResult import org.assertj.core.api.AbstractAssert import org.assertj.core.api.Assertions -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi -@ExperimentalCompilerApi class KotlinCompilationAssert( actual: KotlinCompilationResult, ) : AbstractAssert(actual, KotlinCompilationAssert::class.java) { diff --git a/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt b/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt index 07f39e5..428d291 100644 --- a/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt +++ b/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationCommand.kt @@ -1,11 +1,17 @@ package io.toolisticon.kotlin.generation.test.model import com.tschuchort.compiletesting.SourceFile -import io.toolisticon.kotlin.generation._BAK.KotlinFileSpec +import io.toolisticon.kotlin.generation.spec.KotlinFileSpec +import io.toolisticon.kotlin.generation.test.KotlinCodeGenerationTest.sourceFile data class KotlinCompilationCommand( - val fileSpec: KotlinFileSpec + val fileSpecs: List ) { - val sourceFile = SourceFile.kotlin(name = fileSpec.fileName, contents = fileSpec.code) + constructor(fileSpec: KotlinFileSpec) : this(listOf(fileSpec)) + + operator fun plus(fileSpec: KotlinFileSpec) = copy(fileSpecs = fileSpecs + fileSpec) + + + val sourceFiles: List by lazy { fileSpecs.map { it.sourceFile() } } } diff --git a/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationResult.kt b/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationResult.kt index bc6191a..a4ee769 100644 --- a/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationResult.kt +++ b/kotlin-code-generation-test/src/main/kotlin/model/KotlinCompilationResult.kt @@ -1,13 +1,11 @@ package io.toolisticon.kotlin.generation.test.model +import com.squareup.kotlinpoet.ClassName import com.tschuchort.compiletesting.JvmCompilationResult import com.tschuchort.compiletesting.KotlinCompilation import org.assertj.core.api.Assertions.assertThat -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import kotlin.reflect.KClass -import kotlin.reflect.full.declaredMemberExtensionFunctions -@OptIn(ExperimentalCompilerApi::class) data class KotlinCompilationResult( val cmd: KotlinCompilationCommand, val result: JvmCompilationResult @@ -26,7 +24,7 @@ data class KotlinCompilationResult( } } - fun loadClass(): KClass = result.classLoader.loadClass(cmd.fileSpec.fqn).kotlin + fun loadClass(className: ClassName): KClass = result.classLoader.loadClass(className.canonicalName).kotlin fun shouldBeOk() { assertThat(exitCode) diff --git a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt index 3cff661..e6964be 100644 --- a/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt +++ b/kotlin-code-generation/src/main/kotlin/KotlinCodeGeneration.kt @@ -4,8 +4,10 @@ import com.squareup.kotlinpoet.* import com.squareup.kotlinpoet.MemberName.Companion.member import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.annotationBuilder import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.annotationClassBuilder +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.classBuilder import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.constructorPropertyBuilder import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.fileBuilder +import io.toolisticon.kotlin.generation.KotlinCodeGeneration.builder.funBuilder import io.toolisticon.kotlin.generation.Supressions.CLASS_NAME import io.toolisticon.kotlin.generation.builder.* import io.toolisticon.kotlin.generation.spec.* @@ -18,12 +20,21 @@ object KotlinCodeGeneration { fun buildAnnotation(type: KClass<*>, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = buildAnnotation(type.asClassName(), block) fun buildAnnotation(className: ClassName, block: KotlinAnnotationSpecBuilderReceiver = {}): KotlinAnnotationSpec = annotationBuilder(className).also(block).build() fun buildAnnotationClass(className: ClassName, block: KotlinAnnotationClassSpecBuilderReceiver = {}): KotlinAnnotationClassSpec = annotationClassBuilder(className).also(block).build() + + fun buildClass(className: ClassName, block: KotlinClassSpecBuilderReceiver = {}) = classBuilder(className).also(block).build() + fun buildCodeBlock(format: String, vararg args: Any?) = CodeBlock.of(format, *args) inline fun buildCodeBlock(builderAction: CodeBlock.Builder.() -> Unit): CodeBlock = CodeBlock.builder().apply(builderAction).build() + fun buildConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = constructorPropertyBuilder(name, type).also(block).build() fun buildConstructorProperty(name: String, type: KClass<*>, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = KotlinCodeGeneration.buildConstructorProperty(name, type.asTypeName(), block) + fun buildDataClass(className: ClassName, block: KotlinDataClassSpecBuilderReceiver = {}): KotlinDataClassSpec = KotlinDataClassSpecBuilder.builder(className).also(block).build() + fun buildFile(className: ClassName, block: KotlinFileSpecBuilderReceiver = {}): KotlinFileSpec = fileBuilder(className).also(block).build() + + fun buildFun(name: String, block: KotlinFunSpecBuilderReceiver = {}): KotlinFunSpec = funBuilder(name).also(block).build() + fun buildValueClass(className: ClassName, block: KotlinValueClassSpecBuilderReceiver): KotlinValueClassSpec = KotlinValueClassSpecBuilder.builder(className).also(block).build() fun toFileSpec(spec: KotlinValueClassSpecSupplier): KotlinFileSpec = spec.spec().let { @@ -47,8 +58,11 @@ object KotlinCodeGeneration { object builder { fun annotationBuilder(type: ClassName) = KotlinAnnotationSpecBuilder.builder(type) fun annotationClassBuilder(className: ClassName) = KotlinAnnotationClassSpecBuilder.builder(className) + fun classBuilder(className: ClassName) = KotlinClassSpecBuilder.builder(className); fun constructorPropertyBuilder(name: String, type: TypeName) = KotlinConstructorPropertySpecBuilder.builder(name, type) + fun dataClassBuilder(className: ClassName) = KotlinDataClassSpecBuilder.builder(className); fun fileBuilder(className: ClassName) = KotlinFileSpecBuilder.builder(className) + fun funBuilder(name: String) = KotlinFunSpecBuilder.builder(name) fun valueClassBuilder(className: ClassName) = KotlinValueClassSpecBuilder.builder(className) } @@ -90,7 +104,7 @@ object KotlinCodeGeneration { object name { fun MemberName.asCodeBlock(): CodeBlock = buildCodeBlock("%M", this) - fun Collection.asCodeBlock(): CodeBlock = this.map{it.asCodeBlock()}.joinToCode(prefix = "[", suffix = "]") + fun Collection.asCodeBlock(): CodeBlock = this.map { it.asCodeBlock() }.joinToCode(prefix = "[", suffix = "]") fun Enum<*>.asMemberName(): MemberName = this::class.asClassName().member(this.name) diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt index faebfce..1b72fb4 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -1,32 +1,47 @@ package io.toolisticon.kotlin.generation.builder import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinClassSpec import io.toolisticon.kotlin.generation.spec.KotlinClassSpecSupplier +import io.toolisticon.kotlin.generation.spec.KotlinFunSpecSupplier class KotlinClassSpecBuilder internal constructor( private val className: ClassName, private val delegate: TypeSpecBuilder -) : BuilderSupplier, KotlinClassSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, + KotlinClassSpecSupplier, + DelegatingBuilder { companion object { @JvmStatic - fun classBuilder(name: String): KotlinClassSpecBuilder = KotlinClassSpecBuilder( + fun builder(name: String): KotlinClassSpecBuilder = KotlinClassSpecBuilder( className = ClassName("", name), delegate = TypeSpecBuilder.classBuilder(name) ) @JvmStatic - fun classBuilder(className: ClassName): KotlinClassSpecBuilder = KotlinClassSpecBuilder( + fun builder(className: ClassName): KotlinClassSpecBuilder = KotlinClassSpecBuilder( className = className, delegate = TypeSpecBuilder.classBuilder(className.simpleName) ) + } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun addAnnotation(spec: KotlinAnnotationSpecSupplier) = builder { + delegate.addAnnotation(spec.get()) + } + fun addFunction(funSpec : KotlinFunSpecSupplier) = apply { + delegate.addFunction(funSpec.get()) } override fun builder(block: TypeSpecBuilderReceiver) = apply { diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index b3ecc76..eed7261 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -1,5 +1,6 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.MemberName import io.toolisticon.kotlin.generation.BuilderSupplier @@ -60,6 +61,10 @@ class KotlinFunSpecBuilder internal constructor( } } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + override fun builder(block: FunSpecBuilderReceiver): KotlinFunSpecBuilder = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/_types.kt b/kotlin-code-generation/src/main/kotlin/builder/_types.kt index 698fe50..eeb181c 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/_types.kt @@ -1,5 +1,7 @@ package io.toolisticon.kotlin.generation.builder +import com.squareup.kotlinpoet.CodeBlock +import com.squareup.kotlinpoet.Documentable import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.TypeName import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty diff --git a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt index e5fc031..1e9ac79 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/FunSpecBuilder.kt @@ -37,10 +37,8 @@ class FunSpecBuilder( override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // ContextReceiverBuilder - @ExperimentalKotlinPoetApi override fun contextReceivers(receiverTypes: Iterable) = apply { builder.contextReceivers(receiverTypes) } - @ExperimentalKotlinPoetApi override fun contextReceivers(vararg receiverTypes: TypeName) = apply { builder.contextReceivers(*receiverTypes) } // DocumentableBuilder diff --git a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt index cb734e7..6d58b75 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/PropertySpecBuilder.kt @@ -45,10 +45,8 @@ class PropertySpecBuilder( override fun addAnnotations(annotationSpecs: Iterable) = apply { builder.addAnnotations(annotationSpecs) } // ContextReceiverBuilder - @ExperimentalKotlinPoetApi override fun contextReceivers(receiverTypes: Iterable) = apply { builder.contextReceivers(receiverTypes) } - @ExperimentalKotlinPoetApi override fun contextReceivers(vararg receiverTypes: TypeName) = apply { builder.contextReceivers(*receiverTypes) } // DocumentableBuilder diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt index cd8f48f..979dd5e 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt @@ -86,10 +86,7 @@ class TypeSpecBuilder( override fun addKdoc(block: CodeBlock) = apply { builder.addKdoc(block) } // ContextReceiverBuilder - @ExperimentalKotlinPoetApi override fun contextReceivers(receiverTypes: Iterable) = apply { builder.contextReceivers(receiverTypes) } - - @ExperimentalKotlinPoetApi override fun contextReceivers(vararg receiverTypes: TypeName) = apply { builder.contextReceivers(*receiverTypes) } // MemberSpecHolderBuilder diff --git a/kotlin-code-generation/src/main/kotlin/poet/_types.kt b/kotlin-code-generation/src/main/kotlin/poet/_types.kt index fa40114..b0e7e7f 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/_types.kt @@ -63,11 +63,7 @@ sealed interface OriginatingElementsHolderBuilder { } sealed interface ContextReceivableBuilder { - - @ExperimentalKotlinPoetApi fun contextReceivers(receiverTypes: Iterable): SELF - - @ExperimentalKotlinPoetApi fun contextReceivers(vararg receiverTypes: TypeName): SELF } diff --git a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt index 3e5abb4..ea562e6 100644 --- a/kotlin-code-generation/src/test/kotlin/TestFixtures.kt +++ b/kotlin-code-generation/src/test/kotlin/TestFixtures.kt @@ -17,4 +17,5 @@ object TestFixtures { val myAnnotationSpec = buildAnnotation(MyAnnotation::class) + fun KClass<*>.notDeprecated() = !this.annotations.map { it::class }.contains(Deprecated::class) } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinAnonymousClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnonymousClassTest.kt index d24a856..74addd5 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinAnonymousClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinAnonymousClassTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinAnonymousClassTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinClassTest.kt index 055039f..0e3311f 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinClassTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinClassTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinCompanionObjectTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinCompanionObjectTest.kt index bf82d91..60bdb2c 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinCompanionObjectTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinCompanionObjectTest.kt @@ -1,10 +1,16 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions +import org.junit.jupiter.api.Assumptions.assumeFalse +import org.junit.jupiter.api.Assumptions.assumeTrue import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinCompanionObjectTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt index 36845d6..05f38e9 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinConstructorPropertyTest.kt @@ -1,10 +1,15 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse +import org.junit.jupiter.api.Assumptions.assumeTrue import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinConstructorPropertyTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinEnumClassTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinEnumClassTest.kt index f1840e3..e240bc1 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinEnumClassTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinEnumClassTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinEnumClassTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinFileTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinFileTest.kt index 668982e..5f6281b 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinFileTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinFileTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinFileTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinFunTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinFunTest.kt index 8390586..fa8d7ef 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinFunTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinFunTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinFunTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinInterfaceTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinInterfaceTest.kt index cf8edd5..49a9330 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinInterfaceTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinInterfaceTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinInterfaceTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinObjectTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinObjectTest.kt index a1522ec..93f6a8c 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinObjectTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinObjectTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinObjectTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinParameterTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinParameterTest.kt index e6fc343..750cd15 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinParameterTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinParameterTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinParameterTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinPropertyTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinPropertyTest.kt index 6f4903d..c0bbf6d 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinPropertyTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinPropertyTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinPropertyTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/kotlin-code-generation/src/test/kotlin/spec/KotlinTypeAliasTest.kt b/kotlin-code-generation/src/test/kotlin/spec/KotlinTypeAliasTest.kt index 024343c..19816f0 100644 --- a/kotlin-code-generation/src/test/kotlin/spec/KotlinTypeAliasTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spec/KotlinTypeAliasTest.kt @@ -1,10 +1,14 @@ package io.toolisticon.kotlin.generation.spec +import io.toolisticon.kotlin.generation.TestFixtures.notDeprecated +import org.junit.jupiter.api.Assumptions.assumeFalse import org.junit.jupiter.api.Test +@Deprecated("not implemented yet") internal class KotlinTypeAliasTest { @Test fun name() { + assumeFalse(this::class.notDeprecated()) TODO("Not yet implemented") } } diff --git a/pom.xml b/pom.xml index a704994..52b2a74 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 @@ -22,12 +22,13 @@ kotlin-code-generation-bom _mvn/parent kotlin-code-generation + kotlin-code-generation-test - + @@ -35,11 +36,38 @@ + + + + org.jetbrains.kotlin + kotlin-maven-plugin + + + -opt-in=org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi + -opt-in=com.squareup.kotlinpoet.ExperimentalKotlinPoetApi + + + + + + + itest + + + !skipItest + + + + _itest + + + + The Apache Software License, Version 2.0 @@ -91,17 +119,4 @@ - - - itest - - - !skipItest - - - - _itest - - - From adad2e1787b2f331676437938643108239a7c076 Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Wed, 3 Jul 2024 23:54:55 +0200 Subject: [PATCH 18/19] wip --- _itest/pom.xml | 6 ++ kotlin-code-generation-test/pom.xml | 6 ++ kotlin-code-generation/pom.xml | 6 ++ .../src/main/kotlin/_types.kt | 1 - .../KotlinAnnotationClassSpecBuilder.kt | 23 ++++-- .../builder/KotlinAnnotationSpecBuilder.kt | 4 +- .../KotlinAnonymousClassSpecBuilder.kt | 46 ++++++++++-- .../kotlin/builder/KotlinClassSpecBuilder.kt | 43 ++++++++++-- .../builder/KotlinDataClassSpecBuilder.kt | 70 +++++++++---------- .../builder/KotlinEnumClassSpecBuilder.kt | 59 +++++++++++----- .../kotlin/builder/KotlinFileSpecBuilder.kt | 46 ++++++++---- .../kotlin/builder/KotlinFunSpecBuilder.kt | 70 ++++++++++++++++--- .../builder/KotlinInterfaceSpecBuilder.kt | 43 ++++++++++-- .../kotlin/builder/KotlinObjectSpecBuilder.kt | 57 ++++++++++----- .../builder/KotlinParameterSpecBuilder.kt | 18 ++--- .../builder/KotlinPropertySpecBuilder.kt | 30 ++++++-- .../builder/KotlinTypeAliasSpecBuilder.kt | 17 ++++- .../builder/KotlinValueClassSpecBuilder.kt | 45 ++++++++++-- .../src/main/kotlin/builder/_types.kt | 54 ++++++++++++-- .../main/kotlin/poet/AnnotationSpecBuilder.kt | 4 +- .../src/main/kotlin/poet/CodeBlockBuilder.kt | 4 +- .../src/main/kotlin/poet/TypeSpecBuilder.kt | 2 - pom.xml | 13 ---- 23 files changed, 502 insertions(+), 165 deletions(-) diff --git a/_itest/pom.xml b/_itest/pom.xml index e1d6315..f124b03 100644 --- a/_itest/pom.xml +++ b/_itest/pom.xml @@ -72,6 +72,12 @@ org.jetbrains.kotlin kotlin-maven-plugin + + + -opt-in=org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi + -opt-in=com.squareup.kotlinpoet.ExperimentalKotlinPoetApi + + diff --git a/kotlin-code-generation-test/pom.xml b/kotlin-code-generation-test/pom.xml index 451b84e..2bdb2ae 100644 --- a/kotlin-code-generation-test/pom.xml +++ b/kotlin-code-generation-test/pom.xml @@ -85,6 +85,12 @@ org.jetbrains.kotlin kotlin-maven-plugin + + + -opt-in=org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi + -opt-in=com.squareup.kotlinpoet.ExperimentalKotlinPoetApi + + org.apache.maven.plugins diff --git a/kotlin-code-generation/pom.xml b/kotlin-code-generation/pom.xml index 02d56f4..fdc788b 100644 --- a/kotlin-code-generation/pom.xml +++ b/kotlin-code-generation/pom.xml @@ -96,6 +96,12 @@ org.jetbrains.kotlin kotlin-maven-plugin + + + -opt-in=org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi + -opt-in=com.squareup.kotlinpoet.ExperimentalKotlinPoetApi + + org.apache.maven.plugins diff --git a/kotlin-code-generation/src/main/kotlin/_types.kt b/kotlin-code-generation/src/main/kotlin/_types.kt index 40dcf53..fde210e 100644 --- a/kotlin-code-generation/src/main/kotlin/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/_types.kt @@ -11,4 +11,3 @@ fun interface Builder { } interface BuilderSupplier

: Builder

, Supplier - diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt index 7e6deed..cde2b9e 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationClassSpecBuilder.kt @@ -1,16 +1,16 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildAnnotation import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertySpecBuilder.Companion.primaryConstructorWithProperties -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpec import io.toolisticon.kotlin.generation.spec.KotlinAnnotationClassSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier import io.toolisticon.kotlin.generation.spec.toList +import javax.lang.model.element.Element +import kotlin.reflect.KClass class KotlinAnnotationClassSpecBuilder internal constructor( val className: ClassName, @@ -47,6 +47,21 @@ class KotlinAnnotationClassSpecBuilder internal constructor( this._retention = retention } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun contextReceivers(vararg receiverTypes: TypeName)= builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier)= builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier)= builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element)= builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier)= builder { this.addType(typeSpec.get()) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt index bf83461..4618788 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnnotationSpecBuilder.kt @@ -14,7 +14,9 @@ import kotlin.reflect.KClass class KotlinAnnotationSpecBuilder internal constructor( private val delegate: AnnotationSpecBuilder -) : BuilderSupplier, KotlinAnnotationSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, + KotlinAnnotationSpecSupplier, + DelegatingBuilder { companion object { @JvmStatic fun builder( diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt index 4393eb9..00fcb5e 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinAnonymousClassSpecBuilder.kt @@ -1,24 +1,60 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.spec.KotlinAnonymousClassSpec import io.toolisticon.kotlin.generation.spec.KotlinAnonymousClassSpecSupplier +import javax.lang.model.element.Element +import kotlin.reflect.KClass class KotlinAnonymousClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder -) : BuilderSupplier, KotlinAnonymousClassSpecSupplier, DelegatingBuilder { +) : BuilderSupplier, + KotlinAnonymousClassSpecSupplier, + DelegatingBuilder { companion object { @JvmStatic - fun anonymousClassBuilder(): KotlinAnonymousClassSpecBuilder = KotlinAnonymousClassSpecBuilder( + fun builder(): KotlinAnonymousClassSpecBuilder = KotlinAnonymousClassSpecBuilder( delegate = TypeSpecBuilder.anonymousClassBuilder() ) } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun contextReceivers(vararg receiverTypes: TypeName)= builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier)= builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier)= builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element)= builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier)= builder { this.addType(typeSpec.get()) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun addTypeVariable(typeVariable: TypeVariableName)= builder { this.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpecSupplier?)= builder { this.primaryConstructor(primaryConstructor?.get()) } + fun superclass(superclass: TypeName)= builder { this.superclass(superclass) } + fun superclass(superclass: KClass<*>)= builder { this.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any)= builder { this.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock)= builder { this.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable)= builder { this.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String)= builder { this.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String)= builder { this.addSuperinterface(superinterface, constructorParameter) } + + fun addInitializerBlock(block: CodeBlock)= builder { this.addInitializerBlock(block) } + override fun build(): KotlinAnonymousClassSpec = KotlinAnonymousClassSpec(delegate.build()) override fun get(): TypeSpec = build().get() override fun spec(): KotlinAnonymousClassSpec = build() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt index 1b72fb4..ec66449 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinClassSpecBuilder.kt @@ -1,15 +1,14 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinClassSpec import io.toolisticon.kotlin.generation.spec.KotlinClassSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinFunSpecSupplier +import javax.lang.model.element.Element +import kotlin.reflect.KClass class KotlinClassSpecBuilder internal constructor( @@ -44,6 +43,40 @@ class KotlinClassSpecBuilder internal constructor( delegate.addFunction(funSpec.get()) } + + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + + + fun contextReceivers(vararg receiverTypes: TypeName)= builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier)= builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier)= builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element)= builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier)= builder { this.addType(typeSpec.get()) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun addTypeVariable(typeVariable: TypeVariableName)= builder { this.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpecSupplier?)= builder { this.primaryConstructor(primaryConstructor?.get()) } + fun superclass(superclass: TypeName)= builder { this.superclass(superclass) } + fun superclass(superclass: KClass<*>)= builder { this.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any)= builder { this.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock)= builder { this.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable)= builder { this.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String)= builder { this.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String)= builder { this.addSuperinterface(superinterface, constructorParameter) } + + fun addEnumConstant(name: String, typeSpec: TypeSpec = TypeSpec.anonymousClassBuilder().build())= builder { this.addEnumConstant(name, typeSpec) } + fun addInitializerBlock(block: CodeBlock)= builder { this.addInitializerBlock(block) } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt index a889ae4..5a246cf 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinDataClassSpecBuilder.kt @@ -1,16 +1,12 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty import io.toolisticon.kotlin.generation.builder.KotlinConstructorPropertySpecBuilder.Companion.primaryConstructorWithProperties -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.spec.* import mu.KLogging +import javax.lang.model.element.Element import kotlin.reflect.KClass class KotlinDataClassSpecBuilder internal constructor( @@ -59,12 +55,6 @@ class KotlinDataClassSpecBuilder internal constructor( override fun spec(): KotlinDataClassSpec = build() override fun get(): TypeSpec = build().get() -// -// fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { -// delegate.addType(typeSpecSupplier.get()) -// } -// - override fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) = apply { this.constructorProperties[spec.name] = spec } @@ -73,32 +63,40 @@ class KotlinDataClassSpecBuilder internal constructor( delegate.addAnnotation(annotation.get()) } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } -// override fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = apply { -// fun addAnnotation(annotation: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder = apply { -// delegate.addAnnotation(annotation) -// } -// -} + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun contextReceivers(vararg receiverTypes: TypeName) = builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier) = builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier) = builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element) = builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier) = builder { this.addType(typeSpec.get()) } + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } -// @Suppress("ClassName") -// object builder : -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.ToKotlinPoetSpecBuilder { -// -// fun builder(className: ClassName) = _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder(className = className) -// operator fun invoke(packageName: String, name: String): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.invoke(ClassName(packageName, name)) -// -// fun builder(packageName: String, name: String) = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder.Companion.builder.builder(ClassName(packageName, name)) -// operator fun invoke(className: ClassName): _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder = -// _root_ide_package_.io.toolisticon.kotlin.generation._BAK.KotlinDataClassBuilder.KotlinDataClassSpecBuilder( -// className = className, -// delegate = TypeSpec.classBuilder(className) -// ) -// -// } + fun addTypeVariable(typeVariable: TypeVariableName) = builder { this.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpecSupplier?) = builder { this.primaryConstructor(primaryConstructor?.get()) } + fun superclass(superclass: TypeName) = builder { this.superclass(superclass) } + fun superclass(superclass: KClass<*>) = builder { this.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any) = builder { this.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock) = builder { this.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable) = builder { this.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName) = builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock) = builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>) = builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock) = builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String) = builder { this.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String) = builder { this.addSuperinterface(superinterface, constructorParameter) } + + fun addEnumConstant(name: String, typeSpec: TypeSpec = TypeSpec.anonymousClassBuilder().build()) = builder { this.addEnumConstant(name, typeSpec) } + fun addInitializerBlock(block: CodeBlock) = builder { this.addInitializerBlock(block) } +} typealias KotlinDataClassSpecBuilderReceiver = KotlinDataClassSpecBuilder.() -> Unit diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt index ac5ae43..0ee381c 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinEnumClassSpecBuilder.kt @@ -1,14 +1,13 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder.Companion.wrap -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpec import io.toolisticon.kotlin.generation.spec.KotlinEnumClassSpecSupplier +import javax.lang.model.element.Element +import kotlin.reflect.KClass class KotlinEnumClassSpecBuilder internal constructor( private val delegate: TypeSpecBuilder @@ -29,28 +28,50 @@ class KotlinEnumClassSpecBuilder internal constructor( delegate.addModifiers(KModifier.ENUM) } -// companion object :KLogging() { -// fun builder(className: ClassName) = KotlinEnumClassSpecBuilder( -// delegate = TypeSpecBuilder.enumBuilder(className) -// ) -// } -// operator fun invoke(block: TypeSpecBuilder.() -> Unit): KotlinEnumClassSpecBuilder = apply { -// delegate.block() -// } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } -// fun addEnumConstant(name: String) = apply { -// delegate.addEnumConstant(name) -// } + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun contextReceivers(vararg receiverTypes: TypeName)= builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier)= builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier)= builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element)= builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier)= builder { this.addType(typeSpec.get()) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun addTypeVariable(typeVariable: TypeVariableName)= builder { this.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpecSupplier?)= builder { this.primaryConstructor(primaryConstructor?.get()) } + fun superclass(superclass: TypeName)= builder { this.superclass(superclass) } + fun superclass(superclass: KClass<*>)= builder { this.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any)= builder { this.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock)= builder { this.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable)= builder { this.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String)= builder { this.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String)= builder { this.addSuperinterface(superinterface, constructorParameter) } + + fun addEnumConstant(name: String, typeSpec: TypeSpec = TypeSpec.anonymousClassBuilder().build())= builder { this.addEnumConstant(name, typeSpec) } + fun addInitializerBlock(block: CodeBlock)= builder { this.addInitializerBlock(block) } - override fun builder(block: TypeSpecBuilderReceiver) = apply { - delegate.builder.block() - } fun addEnumConstant(name: String) = apply { delegate.addEnumConstant(name) } + override fun builder(block: TypeSpecBuilderReceiver) = apply { + delegate.builder.block() + } + override fun build(): KotlinEnumClassSpec = KotlinEnumClassSpec(delegate.build()) override fun spec(): KotlinEnumClassSpec = build() override fun get(): TypeSpec = build().get() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt index 3891d03..720cdc7 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFileSpecBuilder.kt @@ -1,16 +1,12 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.FileSpec -import com.squareup.kotlinpoet.MemberName +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.FileSpecBuilder +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.poet.FileSpecBuilder.Companion.wrap -import io.toolisticon.kotlin.generation.poet.FileSpecBuilderReceiver -import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinFileSpec import io.toolisticon.kotlin.generation.spec.KotlinFileSpecSupplier +import kotlin.reflect.KClass class KotlinFileSpecBuilder internal constructor( private val delegate: FileSpecBuilder @@ -53,14 +49,34 @@ class KotlinFileSpecBuilder internal constructor( fun builder(spec: FileSpec) = KotlinFileSpecBuilder(delegate = spec.toBuilder().wrap()) } - - fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { - delegate.addType(typeSpecSupplier.get()) - } - - fun addAnnotation(annotationSpec: AnnotationSpec): KotlinFileSpecBuilder = builder { - addAnnotation(annotationSpec) - } + fun addAliasedImport(kclass: KClass<*>, alias: String)= builder { this.addAliasedImport(kclass, alias) } + fun addAliasedImport(className: ClassName, alias: String)= builder { this.addAliasedImport(className, alias) } + fun addAliasedImport(className: ClassName, memberName: String, alias: String)= builder { this.addAliasedImport(className, memberName, alias) } + fun addAliasedImport(memberName: MemberName, alias: String)= builder { this.addAliasedImport(memberName, alias) } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier): KotlinFileSpecBuilder = builder { this.addAnnotation(annotationSpec.get()) } + fun addBodyComment(format: String, vararg args: Any)= builder { this.addBodyComment(format, *args) } + fun addCode(format: String, vararg args: Any?)= builder { this.addCode(format, *args) } + fun addCode(codeBlock: CodeBlock)= builder { this.addCode(codeBlock) } + fun addDefaultPackageImport(packageName: String)= builder { this.addDefaultPackageImport(packageName) } + fun addFileComment(format: String, vararg args: Any) = builder { this.addFileComment(format, *args) } + fun addFunction(funSpec: FunSpecSupplier): KotlinFileSpecBuilder = builder { this.addFunction(funSpec.get()) } + fun addImport(constant: Enum<*>) = builder { this.addImport(constant) } + fun addImport(kclass: KClass<*>, vararg names: String) = builder { this.addImport(kclass, *names) } + fun addImport(className: ClassName, vararg names: String) = builder { this.addImport(className, *names) } + fun addImport(kclass: KClass<*>, names: Iterable) = builder { this.addImport(kclass, names) } + fun addImport(className: ClassName, names: Iterable) = builder { this.addImport(className, names) } + fun addImport(packageName: String, vararg names: String) = builder { this.addImport(packageName, *names) } + fun addImport(packageName: String, names: Iterable)= builder { this.addImport(packageName, names) } + fun addImport(import: Import)= builder { this.addImport(import) } + fun addKotlinDefaultImports(includeJvm: Boolean = true, includeJs: Boolean = true)= builder { this.addKotlinDefaultImports(includeJvm, includeJs) } + fun addNamedCode(format: String, args: Map)= builder { this.addNamedCode(format, args) } + fun addProperty(propertySpec: PropertySpecSupplier): KotlinFileSpecBuilder = builder { this.addProperty(propertySpec.get()) } + fun addStatement(format: String, vararg args: Any)= builder { this.addStatement(format, *args) } + fun addType(typeSpecSupplier: TypeSpecSupplier) = builder { this.addType(typeSpecSupplier.get()) } + fun addTypeAlias(typeAliasSpec: TypeAliasSpecSupplier) = builder { this.addTypeAlias(typeAliasSpec.get()) } + fun beginControlFlow(controlFlow: String, vararg args: Any)= builder { this.beginControlFlow(controlFlow, *args) } + fun nextControlFlow(controlFlow: String, vararg args: Any)= builder { this.nextControlFlow(controlFlow, *args) } + fun endControlFlow()= builder { this.endControlFlow() } override fun builder(block: FileSpecBuilderReceiver) = apply { delegate.builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt index eed7261..6e50998 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinFunSpecBuilder.kt @@ -1,15 +1,17 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.FunSpec -import com.squareup.kotlinpoet.MemberName +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier import io.toolisticon.kotlin.generation.poet.FunSpecBuilder import io.toolisticon.kotlin.generation.poet.FunSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.FunSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinFunSpec import io.toolisticon.kotlin.generation.spec.KotlinFunSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier +import javax.lang.model.element.Element +import javax.lang.model.element.Modifier +import kotlin.reflect.KClass class KotlinFunSpecBuilder internal constructor( private val delegate: FunSpecBuilder @@ -55,16 +57,66 @@ class KotlinFunSpecBuilder internal constructor( fun builder(spec: FunSpec) = KotlinFunSpecBuilder(delegate = spec.toBuilder().wrap()) } - fun addParameter(parameter: KotlinParameterSpecSupplier) = apply { - builder { - addParameter(parameter.get()); - } - } - + fun addParameter(parameter: KotlinParameterSpecSupplier) = builder { this.addParameter(parameter.get()) } fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + fun contextReceivers(vararg receiverTypes: TypeName) = builder { this.contextReceivers(*receiverTypes) } + + fun addOriginatingElement(originatingElement: Element) = builder { this.addOriginatingElement(originatingElement) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun jvmModifiers(modifiers: Iterable) = builder { this.jvmModifiers(modifiers) } + + fun addTypeVariables(typeVariables: Iterable) = builder { this.addTypeVariables(typeVariables) } + + fun addTypeVariable(typeVariable: TypeVariableName) = builder { this.addTypeVariable(typeVariable) } + + fun receiver(receiverType: TypeName) = builder { this.receiver(receiverType) } + fun receiver(receiverType: TypeName, kdoc: CodeBlock) = builder { this.receiver(receiverType, kdoc) } + + fun receiver(receiverType: KClass<*>) = builder { this.receiver(receiverType) } + fun receiver(receiverType: KClass<*>, kdoc: CodeBlock) = builder { this.receiver(receiverType, kdoc) } + + fun receiver(receiverType: KClass<*>, kdoc: String, vararg args: Any) = builder { this.receiver(receiverType, kdoc, *args) } + + fun returns(returnType: TypeName) = builder { this.returns(returnType) } + fun returns(returnType: TypeName, kdoc: CodeBlock) = builder { this.returns(returnType, kdoc) } + + fun returns(returnType: KClass<*>) = builder { this.returns(returnType) } + fun returns(returnType: KClass<*>, kdoc: CodeBlock) = builder { this.returns(returnType, kdoc) } + + fun returns(returnType: KClass<*>, kdoc: String, vararg args: Any) = builder { this.returns(returnType, kdoc, *args) } + + fun addParameters(parameterSpecs: Iterable) = builder { this.addParameters(parameterSpecs) } + fun addParameter(parameterSpec: ParameterSpec) = builder { this.addParameter(parameterSpec) } + fun callThisConstructor(args: List) = builder { this.callThisConstructor(args) } + + fun callThisConstructor(args: Iterable) = builder { this.callThisConstructor(args) } + fun callThisConstructor(vararg args: String) = builder { this.callThisConstructor(*args) } + fun callThisConstructor(vararg args: CodeBlock = emptyArray()) = builder { this.callThisConstructor(*args) } + fun callSuperConstructor(args: Iterable) = builder { this.callSuperConstructor(args) } + fun callSuperConstructor(args: List) = builder { this.callSuperConstructor(args) } + fun callSuperConstructor(vararg args: String) = builder { this.callSuperConstructor(*args) } + fun callSuperConstructor(vararg args: CodeBlock = emptyArray()) = builder { this.callSuperConstructor(*args) } + fun addParameter(name: String, type: TypeName, vararg modifiers: KModifier) = builder { this.addParameter(name, type, *modifiers) } + fun addParameter(name: String, type: KClass<*>, vararg modifiers: KModifier) = builder { this.addParameter(name, type, *modifiers) } + fun addParameter(name: String, type: TypeName, modifiers: Iterable) = builder { this.addParameter(name, type, modifiers) } + fun addParameter(name: String, type: KClass<*>, modifiers: Iterable) = builder { this.addParameter(name, type, modifiers) } + fun addCode(format: String, vararg args: Any?) = builder { this.addCode(format, *args) } + fun addNamedCode(format: String, args: Map) = builder { this.addNamedCode(format, args) } + fun addCode(codeBlock: CodeBlock) = builder { this.addCode(codeBlock) } + fun addComment(format: String, vararg args: Any) = builder { this.addComment(format, *args) } + + fun beginControlFlow(controlFlow: String, vararg args: Any) = builder { this.beginControlFlow(controlFlow, *args) } + fun nextControlFlow(controlFlow: String, vararg args: Any) = builder { this.nextControlFlow(controlFlow, *args) } + fun endControlFlow() = builder { this.endControlFlow() } + fun addStatement(format: String, vararg args: Any) = builder { this.addStatement(format, *args) } + + override fun builder(block: FunSpecBuilderReceiver): KotlinFunSpecBuilder = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt index 4adf678..8f5795e 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinInterfaceSpecBuilder.kt @@ -1,12 +1,12 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.spec.KotlinInterfaceSpec import io.toolisticon.kotlin.generation.spec.KotlinInterfaceSpecSupplier +import javax.lang.model.element.Element +import kotlin.reflect.KClass class KotlinInterfaceSpecBuilder internal constructor( private val delegate: TypeSpecBuilder @@ -30,6 +30,41 @@ class KotlinInterfaceSpecBuilder internal constructor( } + + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun contextReceivers(vararg receiverTypes: TypeName)= builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier)= builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier)= builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element)= builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier)= builder { this.addType(typeSpec.get()) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun addTypeVariable(typeVariable: TypeVariableName)= builder { this.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpecSupplier?)= builder { this.primaryConstructor(primaryConstructor?.get()) } + fun superclass(superclass: TypeName)= builder { this.superclass(superclass) } + fun superclass(superclass: KClass<*>)= builder { this.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any)= builder { this.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock)= builder { this.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable)= builder { this.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String)= builder { this.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String)= builder { this.addSuperinterface(superinterface, constructorParameter) } + + fun addInitializerBlock(block: CodeBlock)= builder { this.addInitializerBlock(block) } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt index 67b8a10..b1094c8 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinObjectSpecBuilder.kt @@ -1,12 +1,12 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.spec.KotlinObjectSpec import io.toolisticon.kotlin.generation.spec.KotlinObjectSpecSupplier +import javax.lang.model.element.Element +import kotlin.reflect.KClass class KotlinObjectSpecBuilder internal constructor( private val delegate: TypeSpecBuilder @@ -23,21 +23,40 @@ class KotlinObjectSpecBuilder internal constructor( fun objectBuilder(className: ClassName): KotlinObjectSpecBuilder = objectBuilder(className.simpleName) } -// companion object { -// fun builder(className: ClassName) = KotlinObjectBuilder( -// delegate = TypeSpecBuilder.objectBuilder(className) -// ) -// } - - - // -// fun addType(typeSpecSupplier: TypeSpecSupplier) = apply { -// delegate.addType(typeSpecSupplier.get()) -// } -// -// fun addTypes(typeSpecSupplier: Iterable) = apply { -// typeSpecSupplier.forEach(::addType) -// } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun contextReceivers(vararg receiverTypes: TypeName)= builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier)= builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier)= builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element)= builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier)= builder { this.addType(typeSpec.get()) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun addTypeVariable(typeVariable: TypeVariableName)= builder { this.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpecSupplier?)= builder { this.primaryConstructor(primaryConstructor?.get()) } + fun superclass(superclass: TypeName)= builder { this.superclass(superclass) } + fun superclass(superclass: KClass<*>)= builder { this.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any)= builder { this.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock)= builder { this.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable)= builder { this.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String)= builder { this.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String)= builder { this.addSuperinterface(superinterface, constructorParameter) } + + fun addInitializerBlock(block: CodeBlock)= builder { this.addInitializerBlock(block) } + + override fun builder(block: TypeSpecBuilderReceiver): KotlinObjectSpecBuilder = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt index 7075a7e..ae728b2 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinParameterSpecBuilder.kt @@ -1,14 +1,11 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.ParameterSpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asTypeName +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.ParameterSpecBuilderReceiver -import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinParameterSpec import io.toolisticon.kotlin.generation.spec.KotlinParameterSpecSupplier import java.lang.reflect.Type @@ -85,9 +82,14 @@ class KotlinParameterSpecBuilder internal constructor( delegate.builder.block() } - fun addAnnotation(annotationSpec: KotlinAnnotationSpecSupplier): KotlinParameterSpecBuilder = builder { - addAnnotation(annotationSpec.get()) - } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier): KotlinParameterSpecBuilder = builder { this.addAnnotation(annotationSpec.get()) } + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun defaultValue(format: String, vararg args: Any?) = builder { this.defaultValue(format, *args) } + fun defaultValue(codeBlock: CodeBlock?) = builder { this.defaultValue(codeBlock) } override fun build(): KotlinParameterSpec = KotlinParameterSpec(spec = delegate.build()) override fun spec(): KotlinParameterSpec = build() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt index eea030a..7eec9c0 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinPropertySpecBuilder.kt @@ -1,17 +1,16 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.PropertySpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asTypeName +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier +import io.toolisticon.kotlin.generation.poet.FunSpecSupplier import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder import io.toolisticon.kotlin.generation.poet.PropertySpecBuilder.Companion.wrap import io.toolisticon.kotlin.generation.poet.PropertySpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinPropertySpec import io.toolisticon.kotlin.generation.spec.KotlinPropertySpecSupplier import java.lang.reflect.Type +import javax.lang.model.element.Element import kotlin.reflect.KClass class KotlinPropertySpecBuilder internal constructor( @@ -74,9 +73,26 @@ class KotlinPropertySpecBuilder internal constructor( fun builder(spec: PropertySpec) = KotlinPropertySpecBuilder(delegate = spec.toBuilder().wrap()) } - fun addAnnotation(annotationSpec: AnnotationSpecSupplier): KotlinPropertySpecBuilder = apply { - delegate.addAnnotation(annotationSpec.get()) - } + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + fun contextReceivers(vararg receiverTypes: TypeName) = builder { this.contextReceivers(*receiverTypes) } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + fun addOriginatingElement(originatingElement: Element) = builder { this.addOriginatingElement(originatingElement) } + + fun mutable(mutable: Boolean = true) = builder { this.mutable(mutable) } + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + fun addModifiers(modifiers: Iterable) = builder { this.addModifiers(modifiers) } + fun addTypeVariables(typeVariables: Iterable) = builder { this.addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName) = builder { this.addTypeVariable(typeVariable) } + fun initializer(format: String, vararg args: Any?) = builder { this.initializer(format, *args) } + fun initializer(codeBlock: CodeBlock?) = builder { this.initializer(codeBlock) } + fun delegate(format: String, vararg args: Any?) = builder { this.delegate(format, *args) } + fun delegate(codeBlock: CodeBlock) = builder { this.delegate(codeBlock) } + fun getter(getter: FunSpecSupplier?) = builder { this.getter(getter?.get()) } + fun setter(setter: FunSpecSupplier?) = builder { this.setter(setter?.get()) } + fun receiver(receiverType: TypeName?) = builder { this.receiver(receiverType) } + fun receiver(receiverType: KClass<*>) = builder { this.receiver(receiverType) } override fun builder(block: PropertySpecBuilderReceiver) = apply { delegate.builder.block() diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt index 53ece28..4367f77 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinTypeAliasSpecBuilder.kt @@ -1,9 +1,8 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.TypeAliasSpec -import com.squareup.kotlinpoet.TypeName -import com.squareup.kotlinpoet.asTypeName +import com.squareup.kotlinpoet.* import io.toolisticon.kotlin.generation.BuilderSupplier +import io.toolisticon.kotlin.generation.poet.AnnotationSpecSupplier import io.toolisticon.kotlin.generation.poet.TypeAliasSpecBuilder import io.toolisticon.kotlin.generation.poet.TypeAliasSpecBuilderReceiver import io.toolisticon.kotlin.generation.spec.KotlinTypeAliasSpec @@ -32,6 +31,18 @@ class KotlinTypeAliasSpecBuilder internal constructor( ): KotlinTypeAliasSpecBuilder = builder(name, type.asTypeName()) } + + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun addTypeVariables(typeVariables: Iterable) = builder { this.addTypeVariables(typeVariables) } + fun addTypeVariable(typeVariable: TypeVariableName) = builder { this.addTypeVariable(typeVariable) } + + override fun builder(block: TypeAliasSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt index 2c3e0f6..b16894f 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/KotlinValueClassSpecBuilder.kt @@ -1,15 +1,14 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.* import com.squareup.kotlinpoet.jvm.jvmInline import io.toolisticon.kotlin.generation.BuilderSupplier -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilder -import io.toolisticon.kotlin.generation.poet.TypeSpecBuilderReceiver +import io.toolisticon.kotlin.generation.poet.* import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpec import io.toolisticon.kotlin.generation.spec.KotlinValueClassSpecSupplier +import javax.lang.model.element.Element +import kotlin.reflect.KClass class KotlinValueClassSpecBuilder internal constructor( val className: ClassName, @@ -47,6 +46,42 @@ class KotlinValueClassSpecBuilder internal constructor( this.constructorProperty = spec } + + fun addAnnotation(annotationSpec: AnnotationSpecSupplier) = builder { this.addAnnotation(annotationSpec.get()) } + + fun addKdoc(format: String, vararg args: Any) = builder { addKdoc(format, *args) } + fun addKdoc(block: CodeBlock) = builder { addKdoc(block) } + + fun contextReceivers(vararg receiverTypes: TypeName)= builder { this.contextReceivers(*receiverTypes) } + + fun addFunction(funSpec: FunSpecSupplier)= builder { this.addFunction(funSpec.get()) } + fun addProperty(propertySpec: PropertySpecSupplier)= builder { this.addProperty(propertySpec.get()) } + + fun addOriginatingElement(originatingElement: Element)= builder { this.addOriginatingElement(originatingElement) } + fun addType(typeSpec: TypeSpecSupplier)= builder { this.addType(typeSpec.get()) } + + fun addModifiers(vararg modifiers: KModifier) = builder { this.addModifiers(*modifiers) } + + fun addTypeVariable(typeVariable: TypeVariableName)= builder { this.addTypeVariable(typeVariable) } + fun primaryConstructor(primaryConstructor: FunSpecSupplier?)= builder { this.primaryConstructor(primaryConstructor?.get()) } + fun superclass(superclass: TypeName)= builder { this.superclass(superclass) } + fun superclass(superclass: KClass<*>)= builder { this.superclass(superclass) } + + fun addSuperclassConstructorParameter(format: String, vararg args: Any)= builder { this.addSuperclassConstructorParameter(format, *args) } + fun addSuperclassConstructorParameter(codeBlock: CodeBlock)= builder { this.addSuperclassConstructorParameter(codeBlock) } + + fun addSuperinterfaces(superinterfaces: Iterable)= builder { this.addSuperinterfaces(superinterfaces) } + fun addSuperinterface(superinterface: TypeName)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: TypeName, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>)= builder { this.addSuperinterface(superinterface) } + fun addSuperinterface(superinterface: KClass<*>, delegate: CodeBlock)= builder { this.addSuperinterface(superinterface, delegate) } + fun addSuperinterface(superinterface: KClass<*>, constructorParameterName: String)= builder { this.addSuperinterface(superinterface, constructorParameterName) } + fun addSuperinterface(superinterface: TypeName, constructorParameter: String)= builder { this.addSuperinterface(superinterface, constructorParameter) } + + fun addEnumConstant(name: String, typeSpec: TypeSpec = TypeSpec.anonymousClassBuilder().build())= builder { this.addEnumConstant(name, typeSpec) } + fun addInitializerBlock(block: CodeBlock)= builder { this.addInitializerBlock(block) } + + override fun builder(block: TypeSpecBuilderReceiver) = apply { delegate.builder.block() } diff --git a/kotlin-code-generation/src/main/kotlin/builder/_types.kt b/kotlin-code-generation/src/main/kotlin/builder/_types.kt index eeb181c..dd5980b 100644 --- a/kotlin-code-generation/src/main/kotlin/builder/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/builder/_types.kt @@ -1,21 +1,24 @@ package io.toolisticon.kotlin.generation.builder -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.Documentable -import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.TypeName +import io.toolisticon.kotlin.generation.BuilderSupplier import io.toolisticon.kotlin.generation.KotlinCodeGeneration.buildConstructorProperty +import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilder +import io.toolisticon.kotlin.generation.poet.AnnotationSpecBuilderReceiver +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpec +import io.toolisticon.kotlin.generation.spec.KotlinAnnotationSpecSupplier import io.toolisticon.kotlin.generation.spec.KotlinConstructorPropertySpecSupplier import kotlin.reflect.KClass interface DelegatingBuilder { - fun builder(block: RECEIVER) : SELF + fun builder(block: RECEIVER): SELF } interface ConstructorPropertySupport { - fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier) : SELF + fun addConstructorProperty(spec: KotlinConstructorPropertySpecSupplier): SELF fun addConstructorProperty(name: String, type: TypeName, block: KotlinConstructorPropertySpecBuilderReceiver = {}) = addConstructorProperty( buildConstructorProperty(name, type, block) @@ -25,3 +28,44 @@ interface ConstructorPropertySupport { buildConstructorProperty(name, type, block) ) } + +//BuilderSupplier, +//KotlinAnonymousClassSpecSupplier, +//DelegatingBuilder { +// +// BuilderSupplier, +// KotlinAnnotationSpecSupplier, +// DelegatingBuilder {} +// +//sealed class KotlinCodeGenerationSpecBuilder< +// SELF : Any, +// POET_SPEC : Any, +// SPEC: KotlinAnnotationSpec, +// POET_BUILDER, +// POET_BUILDER_RECCEIVER +// >(protected val delegate: POET_BUILDER) : +// DelegatingBuilder, BuilderSupplier { +// +//} + +// FIXME +//class FooSpecBuilder internal constructor( +// delegate: AnnotationSpecBuilder +//) : KotlinCodeGenerationSpecBuilder< +// FooSpecBuilder, +// AnnotationSpec, +// AnnotationSpecBuilder, +// AnnotationSpecBuilderReceiver +// >(delegate) +//{ +// override fun builder(block: AnnotationSpecBuilderReceiver): FooSpecBuilder { +// TODO("Not yet implemented") +// } +// +// override fun build(): FooSpecBuilder { +// TODO("Not yet implemented") +// } +// +// override fun get(): AnnotationSpec = build().get() +// +//} diff --git a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt index 4b1611e..40531b1 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/AnnotationSpecBuilder.kt @@ -26,8 +26,8 @@ class AnnotationSpecBuilder( // Annotatable fun addMember(format: String, vararg args: Any) = apply { builder.addMember(CodeBlock.of(format, *args)) } - fun addMember(codeBlock: CodeBlock) = apply { builder. addMember(codeBlock) } - fun useSiteTarget(useSiteTarget: UseSiteTarget?) = apply { builder. useSiteTarget(useSiteTarget) } + fun addMember(codeBlock: CodeBlock) = apply { builder.addMember(codeBlock) } + fun useSiteTarget(useSiteTarget: UseSiteTarget?) = apply { builder.useSiteTarget(useSiteTarget) } override fun build(): AnnotationSpec = builder.build() diff --git a/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt index 7f587d9..86e1fbc 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/CodeBlockBuilder.kt @@ -5,8 +5,8 @@ import com.squareup.kotlinpoet.CodeBlock.Builder class CodeBlockBuilder( - override val builder: CodeBlock.Builder -) : PoetSpecBuilder { + override val builder: Builder +) : PoetSpecBuilder { companion object { private fun Builder.wrap() = CodeBlockBuilder(this) fun of(format: String, vararg args: Any?): CodeBlock = CodeBlock.of(format, *args) diff --git a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt index 979dd5e..51f373a 100644 --- a/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt +++ b/kotlin-code-generation/src/main/kotlin/poet/TypeSpecBuilder.kt @@ -72,8 +72,6 @@ class TypeSpecBuilder( @JvmStatic fun anonymousClassBuilder(): TypeSpecBuilder = TypeSpec.anonymousClassBuilder().wrap() - - } diff --git a/pom.xml b/pom.xml index 52b2a74..66ed289 100644 --- a/pom.xml +++ b/pom.xml @@ -36,19 +36,6 @@ - - - - org.jetbrains.kotlin - kotlin-maven-plugin - - - -opt-in=org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi - -opt-in=com.squareup.kotlinpoet.ExperimentalKotlinPoetApi - - - - From 10d618be1574773d4b0d79905911c66db046dd7e Mon Sep 17 00:00:00 2001 From: Jan Galinski Date: Thu, 4 Jul 2024 00:32:16 +0200 Subject: [PATCH 19/19] fix parent --- _itest/pom.xml | 1 + _mvn/parent/pom.xml | 1 + kotlin-code-generation-bom/pom.xml | 5 ----- pom.xml | 4 ++-- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/_itest/pom.xml b/_itest/pom.xml index f124b03..3a77bda 100644 --- a/_itest/pom.xml +++ b/_itest/pom.xml @@ -8,6 +8,7 @@ 0.0.1-SNAPSHOT ../_mvn/parent/pom.xml + io.toolisticon.kotlin.generation.itest kotlin-code-generation-itest test: ${project.artifactId} diff --git a/_mvn/parent/pom.xml b/_mvn/parent/pom.xml index fe36a22..26802cc 100644 --- a/_mvn/parent/pom.xml +++ b/_mvn/parent/pom.xml @@ -6,6 +6,7 @@ io.toolisticon.kotlin.generation._ kotlin-code-generation-root 0.0.1-SNAPSHOT + ../../pom.xml kotlin-code-generation-parent diff --git a/kotlin-code-generation-bom/pom.xml b/kotlin-code-generation-bom/pom.xml index b9220bc..2c508e7 100644 --- a/kotlin-code-generation-bom/pom.xml +++ b/kotlin-code-generation-bom/pom.xml @@ -13,11 +13,6 @@ Bill of material for kotlin-code-generation. pom - - 1.17.0 - 0.5.0-alpha08 - - diff --git a/pom.xml b/pom.xml index 66ed289..bbad3ce 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 @@ -19,8 +19,8 @@ pom - kotlin-code-generation-bom _mvn/parent + kotlin-code-generation-bom kotlin-code-generation kotlin-code-generation-test