From 307c8030af4d8039318e4487ed99757d1f057855 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 14 Jan 2025 09:54:04 +0600 Subject: [PATCH 1/3] start 0.24.2 --- CHANGELOG.md | 2 ++ gradle.properties | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 363019da732..eb8c2e055a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## 0.24.2 + ## 0.24.1 * `Versions`: diff --git a/gradle.properties b/gradle.properties index c65ecc78ec2..56ffbf27b85 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,5 +15,5 @@ crypto_js_version=4.1.1 # Project data group=dev.inmo -version=0.24.1 -android_code_version=280 +version=0.24.2 +android_code_version=281 From a5eb0fbd24a9eccb212394e54e84c3fe924d8c24 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 14 Jan 2025 09:56:30 +0600 Subject: [PATCH 2/3] add opportunity to generate types lists for sealed subtypes --- CHANGELOG.md | 4 + ...onGetGenerateSealedWorkaroundAnnotation.kt | 6 ++ .../generator/src/main/kotlin/Processor.kt | 86 +++++++++++++++++-- .../test/src/commonMain/kotlin/Test.kt | 5 ++ .../kotlin/TestSealedTypesWorkaround.kt | 12 +++ .../kotlin/GenerateSealedTypesWorkaround.kt | 15 ++++ .../kotlin/GenerateSealedWorkaround.kt | 2 +- 7 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 ksp/sealed/generator/test/src/commonMain/kotlin/TestSealedTypesWorkaround.kt create mode 100644 ksp/sealed/src/commonMain/kotlin/GenerateSealedTypesWorkaround.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index eb8c2e055a6..acb14e917f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 0.24.2 +* `Ksp`: + * `Sealed`: + * Add annotation `GenerateSealedTypesWorkaround` which allow to generate `subtypes` lists + ## 0.24.1 * `Versions`: diff --git a/ksp/sealed/generator/src/main/kotlin/KSClassDeclarationGetGenerateSealedWorkaroundAnnotation.kt b/ksp/sealed/generator/src/main/kotlin/KSClassDeclarationGetGenerateSealedWorkaroundAnnotation.kt index aab653b1349..7746baa5177 100644 --- a/ksp/sealed/generator/src/main/kotlin/KSClassDeclarationGetGenerateSealedWorkaroundAnnotation.kt +++ b/ksp/sealed/generator/src/main/kotlin/KSClassDeclarationGetGenerateSealedWorkaroundAnnotation.kt @@ -3,9 +3,15 @@ package dev.inmo.micro_utils.ksp.sealed.generator import com.google.devtools.ksp.KspExperimental import com.google.devtools.ksp.getAnnotationsByType import com.google.devtools.ksp.symbol.KSClassDeclaration +import dev.inmo.micro_utils.ksp.sealed.GenerateSealedTypesWorkaround import dev.inmo.micro_utils.ksp.sealed.GenerateSealedWorkaround import dev.inmo.microutils.kps.sealed.GenerateSealedWorkaround as OldGenerateSealedWorkaround @OptIn(KspExperimental::class) val KSClassDeclaration.getGenerateSealedWorkaroundAnnotation get() = (getAnnotationsByType(GenerateSealedWorkaround::class).firstOrNull() ?: getAnnotationsByType(OldGenerateSealedWorkaround::class).firstOrNull()) + + +@OptIn(KspExperimental::class) +val KSClassDeclaration.getGenerateSealedTypesWorkaroundAnnotation + get() = getAnnotationsByType(GenerateSealedTypesWorkaround::class).firstOrNull() diff --git a/ksp/sealed/generator/src/main/kotlin/Processor.kt b/ksp/sealed/generator/src/main/kotlin/Processor.kt index d2c7e1f522e..28ce7840a80 100644 --- a/ksp/sealed/generator/src/main/kotlin/Processor.kt +++ b/ksp/sealed/generator/src/main/kotlin/Processor.kt @@ -6,21 +6,17 @@ import com.google.devtools.ksp.processing.CodeGenerator import com.google.devtools.ksp.processing.Resolver import com.google.devtools.ksp.processing.SymbolProcessor import com.google.devtools.ksp.symbol.* -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.CodeBlock -import com.squareup.kotlinpoet.FileSpec -import com.squareup.kotlinpoet.FunSpec -import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.* import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy -import com.squareup.kotlinpoet.PropertySpec -import com.squareup.kotlinpoet.asTypeName import com.squareup.kotlinpoet.ksp.toClassName import dev.inmo.micro_ksp.generator.buildSubFileName import dev.inmo.micro_ksp.generator.companion import dev.inmo.micro_ksp.generator.findSubClasses import dev.inmo.micro_ksp.generator.writeFile +import dev.inmo.micro_utils.ksp.sealed.GenerateSealedTypesWorkaround import dev.inmo.micro_utils.ksp.sealed.GenerateSealedWorkaround import java.io.File +import kotlin.reflect.KClass class Processor( private val codeGenerator: CodeGenerator @@ -109,6 +105,62 @@ class Processor( ) } + @OptIn(KspExperimental::class) + private fun FileSpec.Builder.generateSealedTypesWorkaround( + ksClassDeclaration: KSClassDeclaration, + resolver: Resolver + ) { + val annotation = ksClassDeclaration.getGenerateSealedTypesWorkaroundAnnotation + val subClasses = ksClassDeclaration.resolveSubclasses( + searchIn = resolver.getAllFiles(), + allowNonSealed = annotation ?.includeNonSealedSubTypes ?: false + ).distinct() + val subClassesNames = subClasses.filter { + it.getAnnotationsByType(GenerateSealedWorkaround.Exclude::class).count() == 0 + }.sortedBy { + (it.getAnnotationsByType(GenerateSealedWorkaround.Order::class).firstOrNull()) ?.order ?: 0 + }.map { + it.toClassName() + }.toList() + val className = ksClassDeclaration.toClassName() + val setType = Set::class.asTypeName().parameterizedBy( + KClass::class.asTypeName().parameterizedBy( + TypeVariableName( + "out ${ksClassDeclaration.asStarProjectedType().toClassName().simpleNames.joinToString(".")}", + ) + ) + ) + addProperty( + PropertySpec.builder( + "subtypes", + setType + ).apply { + modifiers.add( + KModifier.PRIVATE + ) + initializer( + CodeBlock.of( + """setOf(${subClassesNames.joinToString(",\n") { it.simpleNames.joinToString(".") + "::class" }})""" + ) + ) + }.build() + ) + addFunction( + FunSpec.builder("subtypes").apply { + val companion = ksClassDeclaration.takeIf { it.isCompanionObject } ?.toClassName() + ?: ksClassDeclaration.companion ?.toClassName() + ?: ClassName(className.packageName, *className.simpleNames.toTypedArray(), "Companion") + receiver(companion) + returns(setType) + addCode( + CodeBlock.of( + """return subtypes""" + ) + ) + }.build() + ) + } + @OptIn(KspExperimental::class) override fun process(resolver: Resolver): List { (resolver.getSymbolsWithAnnotation(GenerateSealedWorkaround::class.qualifiedName!!)).filterIsInstance().forEach { @@ -131,6 +183,26 @@ class Processor( }.build() } } + (resolver.getSymbolsWithAnnotation(GenerateSealedTypesWorkaround::class.qualifiedName!!)).filterIsInstance().forEach { + val prefix = (it.getGenerateSealedTypesWorkaroundAnnotation) ?.prefix ?.takeIf { + it.isNotEmpty() + } ?: it.buildSubFileName.replaceFirst(it.simpleName.asString(), "") + it.writeFile(prefix = prefix, suffix = "SealedTypesWorkaround") { + FileSpec.builder( + it.packageName.asString(), + "${it.simpleName.getShortName()}SealedTypesWorkaround" + ).apply { + addFileComment( + """ + THIS CODE HAVE BEEN GENERATED AUTOMATICALLY + TO REGENERATE IT JUST DELETE FILE + ORIGINAL FILE: ${it.containingFile ?.fileName} + """.trimIndent() + ) + generateSealedTypesWorkaround(it, resolver) + }.build() + } + } return emptyList() } diff --git a/ksp/sealed/generator/test/src/commonMain/kotlin/Test.kt b/ksp/sealed/generator/test/src/commonMain/kotlin/Test.kt index 01c9e8e90b4..39b35448f4b 100644 --- a/ksp/sealed/generator/test/src/commonMain/kotlin/Test.kt +++ b/ksp/sealed/generator/test/src/commonMain/kotlin/Test.kt @@ -1,14 +1,19 @@ package dev.inmo.micro_utils.ksp.sealed.generator.test +import dev.inmo.micro_utils.ksp.sealed.GenerateSealedTypesWorkaround import dev.inmo.micro_utils.ksp.sealed.GenerateSealedWorkaround @GenerateSealedWorkaround +@GenerateSealedTypesWorkaround sealed interface Test { @GenerateSealedWorkaround.Order(2) + @GenerateSealedTypesWorkaround.Order(2) object A : Test @GenerateSealedWorkaround.Exclude + @GenerateSealedTypesWorkaround.Exclude object B : Test @GenerateSealedWorkaround.Order(0) + @GenerateSealedTypesWorkaround.Order(0) object C : Test // Required for successful sealed workaround generation diff --git a/ksp/sealed/generator/test/src/commonMain/kotlin/TestSealedTypesWorkaround.kt b/ksp/sealed/generator/test/src/commonMain/kotlin/TestSealedTypesWorkaround.kt new file mode 100644 index 00000000000..6a6f2e2e34b --- /dev/null +++ b/ksp/sealed/generator/test/src/commonMain/kotlin/TestSealedTypesWorkaround.kt @@ -0,0 +1,12 @@ +// THIS CODE HAVE BEEN GENERATED AUTOMATICALLY +// TO REGENERATE IT JUST DELETE FILE +// ORIGINAL FILE: Test.kt +package dev.inmo.micro_utils.ksp.`sealed`.generator.test + +import kotlin.collections.Set +import kotlin.reflect.KClass + +private val subtypes: Set> = setOf(Test.C::class, + Test.A::class) + +public fun Test.Companion.subtypes(): Set> = subtypes diff --git a/ksp/sealed/src/commonMain/kotlin/GenerateSealedTypesWorkaround.kt b/ksp/sealed/src/commonMain/kotlin/GenerateSealedTypesWorkaround.kt new file mode 100644 index 00000000000..8eab25d790b --- /dev/null +++ b/ksp/sealed/src/commonMain/kotlin/GenerateSealedTypesWorkaround.kt @@ -0,0 +1,15 @@ +package dev.inmo.micro_utils.ksp.sealed + +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.CLASS) +annotation class GenerateSealedTypesWorkaround( + val prefix: String = "", + val includeNonSealedSubTypes: Boolean = false, +) { + @Retention(AnnotationRetention.BINARY) + @Target(AnnotationTarget.CLASS) + annotation class Order(val order: Int) + @Retention(AnnotationRetention.BINARY) + @Target(AnnotationTarget.CLASS) + annotation class Exclude +} \ No newline at end of file diff --git a/ksp/sealed/src/commonMain/kotlin/GenerateSealedWorkaround.kt b/ksp/sealed/src/commonMain/kotlin/GenerateSealedWorkaround.kt index 2146dff9346..df769f0bcb3 100644 --- a/ksp/sealed/src/commonMain/kotlin/GenerateSealedWorkaround.kt +++ b/ksp/sealed/src/commonMain/kotlin/GenerateSealedWorkaround.kt @@ -4,7 +4,7 @@ package dev.inmo.micro_utils.ksp.sealed @Target(AnnotationTarget.CLASS) annotation class GenerateSealedWorkaround( val prefix: String = "", - val includeNonSealedSubTypes: Boolean = false + val includeNonSealedSubTypes: Boolean = false, ) { @Retention(AnnotationRetention.BINARY) @Target(AnnotationTarget.CLASS) From f40d33db2a44ff34d28caafa1fc311aea9e1863d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 14 Jan 2025 10:09:16 +0600 Subject: [PATCH 3/3] update exposed --- CHANGELOG.md | 2 ++ gradle/libs.versions.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acb14e917f2..edd5c08c841 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## 0.24.2 +* `Versions`: + * `Exposed`: `0.57.0` -> `0.58.0` * `Ksp`: * `Sealed`: * Add annotation `GenerateSealedTypesWorkaround` which allow to generate `subtypes` lists diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 27996460831..2cae8345af2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ kt-coroutines = "1.10.1" kslog = "1.4.0" jb-compose = "1.7.3" -jb-exposed = "0.57.0" +jb-exposed = "0.58.0" jb-dokka = "2.0.0" sqlite = "3.47.2.0"