diff --git a/kotlin-code-generation/src/main/kotlin/_types.kt b/kotlin-code-generation/src/main/kotlin/_types.kt index 16b17bf..7cd9412 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 com.squareup.kotlinpoet.ClassName import java.util.function.Supplier +import kotlin.reflect.KClass /** * Marks a type as capable of building a new product. @@ -22,6 +23,22 @@ interface WithClassName { val className: ClassName } +/** + * An implementing type can provide a generic value for a tag key. + * Behaves as [com.squareup.kotlinpoet.Taggable] but hides the implementation of the tg provider. + */ +interface WithTags { + /** + * @see [com.squareup.kotlinpoet.Taggable.tag] + */ + fun tag(type: KClass): T? +} + +/** + * Reified access to [WithTags.tag]. + */ +inline fun WithTags.tag(): T? = tag(T::class) + /** * ClassName when used as a file name for fileSpec. */ diff --git a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt index 8f67751..3ee0072 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/KotlinFileSpec.kt @@ -3,6 +3,7 @@ package io.toolisticon.kotlin.generation.spec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.FileSpec import io.toolisticon.kotlin.generation.WithClassName +import io.toolisticon.kotlin.generation.WithTags import io.toolisticon.kotlin.generation.poet.FileSpecSupplier import kotlin.reflect.KClass @@ -11,7 +12,7 @@ import kotlin.reflect.KClass */ data class KotlinFileSpec( private val spec: FileSpec -) : KotlinGeneratorSpec, KotlinFileSpecSupplier, TaggableSpec, KotlinFileSpecIterable { +) : KotlinGeneratorSpec, KotlinFileSpecSupplier, WithTags, KotlinFileSpecIterable { val packageName: String = spec.packageName val rootName: String = spec.name @@ -37,6 +38,7 @@ interface KotlinFileSpecSupplier : KotlinGeneratorSpecSupplier, * List that contains multiple [KotlinFileSpec]s. */ @JvmInline +@Suppress("JavaDefaultMethodsNotOverriddenByDelegation") value class KotlinFileSpecList(private val fileSpecs: List) : List by fileSpecs, KotlinFileSpecIterable { companion object { diff --git a/kotlin-code-generation/src/main/kotlin/spec/_types.kt b/kotlin-code-generation/src/main/kotlin/spec/_types.kt index 16f7fa7..9fa7fee 100644 --- a/kotlin-code-generation/src/main/kotlin/spec/_types.kt +++ b/kotlin-code-generation/src/main/kotlin/spec/_types.kt @@ -6,9 +6,12 @@ import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi import com.squareup.kotlinpoet.TypeSpec import io.toolisticon.kotlin.generation.KotlinCodeGeneration import io.toolisticon.kotlin.generation.WithClassName -import io.toolisticon.kotlin.generation.poet.* +import io.toolisticon.kotlin.generation.WithTags +import io.toolisticon.kotlin.generation.poet.KDoc +import io.toolisticon.kotlin.generation.poet.PoetSpec +import io.toolisticon.kotlin.generation.poet.PoetSpecSupplier +import io.toolisticon.kotlin.generation.poet.TypeSpecSupplier import io.toolisticon.kotlin.generation.support.SUPPRESS_UNUSED -import kotlin.reflect.KClass interface KotlinGeneratorSpecSupplier { fun spec(): GENERATOR_SPEC @@ -24,7 +27,7 @@ sealed interface KotlinGeneratorTypeSpec> : } @ExperimentalKotlinPoetApi -sealed interface KotlinDocumentableSpec : TaggableSpec { +sealed interface KotlinDocumentableSpec : WithTags { val kdoc: KDoc } @@ -41,21 +44,6 @@ fun ToFileTypeSpecSupplier.toFileSpec() = KotlinCodeGeneration.buildFile(classNa addType(this@toFileSpec) } -/** - * Marks Spec as [com.squareup.kotlinpoet.Taggable]. - */ -sealed interface TaggableSpec { - /** - * @see [com.squareup.kotlinpoet.Taggable.tag] - */ - fun tag(type: KClass): T? -} - -/** - * Reified access to [TaggableSpec.tag]. - */ -inline fun TaggableSpec.tag(): T? = tag(T::class) - /** * Tags a spec with extra type. */ diff --git a/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationContext.kt b/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationContext.kt index da4d300..bf8be9f 100644 --- a/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationContext.kt +++ b/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationContext.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation.spi import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi +import io.toolisticon.kotlin.generation.WithTags import kotlin.reflect.KClass /** @@ -13,7 +14,7 @@ import kotlin.reflect.KClass * Hint: for implementing a concrete context, use the [io.toolisticon.kotlin.generation.spi.context.KotlinCodeGenerationContextBase]. */ @ExperimentalKotlinPoetApi -interface KotlinCodeGenerationContext> { +interface KotlinCodeGenerationContext> : WithTags { /** * SELF type of the context implementation, used to verify against [io.toolisticon.kotlin.generation.spi.KotlinCodeGenerationSpi.contextType]. @@ -38,6 +39,8 @@ interface KotlinCodeGenerationContext> fun , CONTEXT : KotlinCodeGenerationContext, INPUT : Any, BUILDER : Any> processors( processorType: KClass ): List = registry.processors.filterIsInstance(processorType.java) + + override fun tag(type: KClass): T? = null } /** diff --git a/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationSpi.kt b/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationSpi.kt index 52d6ade..ebde895 100644 --- a/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationSpi.kt +++ b/kotlin-code-generation/src/main/kotlin/spi/KotlinCodeGenerationSpi.kt @@ -1,6 +1,7 @@ package io.toolisticon.kotlin.generation.spi import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi +import io.toolisticon.kotlin.generation.WithTags import java.util.function.BiPredicate import kotlin.reflect.KClass import kotlin.reflect.full.isSubclassOf @@ -14,7 +15,7 @@ import kotlin.reflect.full.isSubclassOf * * [KotlinCodeGenerationProcessor] - visitor pattern to modify spec builders before the spec is build. */ @ExperimentalKotlinPoetApi -sealed interface KotlinCodeGenerationSpi, INPUT : Any> : Comparable>, BiPredicate { +sealed interface KotlinCodeGenerationSpi, INPUT : Any> : Comparable>, BiPredicate, WithTags { companion object { val metaInfServices = "META-INF/services/${KotlinCodeGenerationSpi::class.qualifiedName}" const val DEFAULT_ORDER = 0 @@ -57,4 +58,6 @@ sealed interface KotlinCodeGenerationSpi tag(type: KClass): T? = null } diff --git a/kotlin-code-generation/src/test/kotlin/_test/TestDeclarationFileStrategy.kt b/kotlin-code-generation/src/test/kotlin/_test/TestDeclarationFileStrategy.kt index 69499f3..479886f 100644 --- a/kotlin-code-generation/src/test/kotlin/_test/TestDeclarationFileStrategy.kt +++ b/kotlin-code-generation/src/test/kotlin/_test/TestDeclarationFileStrategy.kt @@ -1,4 +1,3 @@ - package io.toolisticon.kotlin.generation._test import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi diff --git a/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationServiceRepositoryTest.kt b/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationServiceRepositoryTest.kt index 80e8b86..b2c26a9 100644 --- a/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationServiceRepositoryTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationServiceRepositoryTest.kt @@ -24,9 +24,7 @@ internal class KotlinCodeGenerationServiceRepositoryTest { contextType = TestContext::class, inputType = TestInput::class, ) { - override fun invoke(context: TestContext, input: TestInput): KotlinDataClassSpec { - TODO("Not yet implemented") - } + override fun invoke(context: TestContext, input: TestInput): KotlinDataClassSpec = TODO("Not yet implemented") override val specType: KClass = KotlinDataClassSpec::class diff --git a/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationStrategyListTest.kt b/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationStrategyListTest.kt index 58bcdde..767b1fd 100644 --- a/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationStrategyListTest.kt +++ b/kotlin-code-generation/src/test/kotlin/spi/KotlinCodeGenerationStrategyListTest.kt @@ -1,4 +1,3 @@ - package io.toolisticon.kotlin.generation.spi import com.squareup.kotlinpoet.ExperimentalKotlinPoetApi @@ -16,6 +15,7 @@ import io.toolisticon.kotlin.generation.spi.strategy.executeAll import io.toolisticon.kotlin.generation.spi.strategy.executeSingle import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test +import kotlin.reflect.KClass @OptIn(ExperimentalKotlinPoetApi::class) class KotlinCodeGenerationStrategyListTest { @@ -24,6 +24,8 @@ class KotlinCodeGenerationStrategyListTest { override fun invoke(context: EmptyContext, input: InputA): KotlinDataClassSpec = buildDataClass(input.className) { input.fields.map { (k, v) -> buildConstructorProperty(k, v) }.forEach(this::addConstructorProperty) } + + override fun tag(type: KClass): T? = TODO("Not yet implemented") } class BStrategy : DataClassBStrategy() {