decrease number of expected functions

This commit is contained in:
InsanusMokrassar 2020-02-13 12:56:04 +06:00
parent 1b87562035
commit ea29a801fd
10 changed files with 42 additions and 53 deletions

View File

@ -36,7 +36,7 @@ kotlin {
commonMain { commonMain {
dependencies { dependencies {
implementation kotlin('stdlib') implementation kotlin('stdlib')
api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" api kotlin('reflect')
api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$kotlin_serialisation_runtime_version" api "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$kotlin_serialisation_runtime_version"
} }
} }

View File

@ -1,11 +1,10 @@
package com.insanusmokrassar.sdi package com.insanusmokrassar.sdi
import com.insanusmokrassar.sdi.utils.* import com.insanusmokrassar.sdi.utils.createModuleBasedOnConfigRoot
import kotlinx.serialization.* import kotlinx.serialization.*
import kotlinx.serialization.internal.* import kotlinx.serialization.internal.HashMapSerializer
import kotlinx.serialization.internal.StringSerializer
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
import kotlinx.serialization.modules.*
import kotlin.reflect.KClass
@ImplicitReflectionSerializer @ImplicitReflectionSerializer
@Serializable(ModuleSerializer::class) @Serializable(ModuleSerializer::class)

View File

@ -2,7 +2,8 @@ package com.insanusmokrassar.sdi.utils
import kotlinx.serialization.* import kotlinx.serialization.*
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
import kotlinx.serialization.modules.* import kotlinx.serialization.modules.SerializerAlreadyRegisteredException
import kotlinx.serialization.modules.SerializersModuleBuilder
import kotlin.reflect.KClass import kotlin.reflect.KClass
@ImplicitReflectionSerializer @ImplicitReflectionSerializer
@ -13,7 +14,7 @@ internal class DependencyResolver<T : Any>(
private val dependencyGetter: (String) -> Any private val dependencyGetter: (String) -> Any
) : KSerializer<T> { ) : KSerializer<T> {
private val originalSerializer: KSerializer<T> = try { private val originalSerializer: KSerializer<T> = try {
resolveSerializerByKClass(kClass) kClass.serializer()
} catch (e: Exception) { } catch (e: Exception) {
PolymorphicSerializer(kClass) PolymorphicSerializer(kClass)
} }

View File

@ -1,8 +1,9 @@
package com.insanusmokrassar.sdi.utils package com.insanusmokrassar.sdi.utils
import kotlinx.serialization.* import kotlinx.serialization.ImplicitReflectionSerializer
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
import kotlinx.serialization.modules.* import kotlinx.serialization.modules.SerializerAlreadyRegisteredException
import kotlinx.serialization.modules.SerializersModule
private typealias PackageOrOtherDependencyNamePair = Pair<String?, String?> private typealias PackageOrOtherDependencyNamePair = Pair<String?, String?>
@ -63,9 +64,7 @@ internal fun createModuleBasedOnConfigRoot(jsonObject: JsonObject): Json {
key to packageName key to packageName
}.toMap() }.toMap()
return Json( val context = SerializersModule {
configuration = JsonConfiguration(useArrayPolymorphism = true),
context = SerializersModule {
keysToPackages.values.forEach { keysToPackages.values.forEach {
val kclass = resolveKClassByPackageName(it) val kclass = resolveKClassByPackageName(it)
@ -82,6 +81,9 @@ internal fun createModuleBasedOnConfigRoot(jsonObject: JsonObject): Json {
} }
} }
} }
return Json(
configuration = JsonConfiguration(useArrayPolymorphism = true),
context = context
).also { ).also {
jsonStringFormat = it jsonStringFormat = it
} }

View File

@ -1,24 +1,22 @@
package com.insanusmokrassar.sdi.utils package com.insanusmokrassar.sdi.utils
import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.*
import kotlinx.serialization.KSerializer
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.reflect.KType
@ImplicitReflectionSerializer
expect fun resolveSerializerByPackageName(packageName: String): KSerializer<*>
@ImplicitReflectionSerializer
expect fun <T : Any> resolveSerializerByKClass(kClass: KClass<T>): KSerializer<T>
expect fun resolveKClassByPackageName(packageName: String): KClass<*> expect fun resolveKClassByPackageName(packageName: String): KClass<*>
expect val KClass<*>.currentSupertypes: List<KType> @ImplicitReflectionSerializer
internal fun <T : Any> resolveSerializerByKClass(kClass: KClass<T>): KSerializer<T> = kClass.serializer()
val KClass<*>.allSubclasses: Set<KClass<*>> @ImplicitReflectionSerializer
internal fun resolveSerializerByPackageName(packageName: String): KSerializer<*> = resolveSerializerByKClass(
resolveKClassByPackageName(packageName)
)
internal val KClass<*>.allSubclasses: Set<KClass<*>>
get() { get() {
val subclasses = mutableSetOf<KClass<*>>() val subclasses = mutableSetOf<KClass<*>>()
val leftToVisit = currentSupertypes.mapNotNull { it.classifier as? KClass<*> }.toMutableList() val leftToVisit = supertypes.mapNotNull { it.classifier as? KClass<*> }.toMutableList()
while (leftToVisit.isNotEmpty()) { while (leftToVisit.isNotEmpty()) {
val top = leftToVisit.removeAt(0) val top = leftToVisit.removeAt(0)
if (subclasses.add(top)) { if (subclasses.add(top)) {

View File

@ -2,7 +2,8 @@ package com.insanusmokrassar.sdi
import kotlinx.serialization.* import kotlinx.serialization.*
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlin.test.* import kotlin.test.Test
import kotlin.test.assertEquals
interface List_ParentalAPI { interface List_ParentalAPI {
val services: List<List_ChildAPI> val services: List<List_ChildAPI>

View File

@ -2,7 +2,8 @@ package com.insanusmokrassar.sdi
import kotlinx.serialization.* import kotlinx.serialization.*
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlin.test.* import kotlin.test.Test
import kotlin.test.assertEquals
interface SimpleCustomObject_ControllerAPI { interface SimpleCustomObject_ControllerAPI {
fun showUp() fun showUp()

View File

@ -2,7 +2,8 @@ package com.insanusmokrassar.sdi
import kotlinx.serialization.* import kotlinx.serialization.*
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlin.test.* import kotlin.test.Test
import kotlin.test.assertEquals
interface Simple_ControllerAPI { interface Simple_ControllerAPI {
fun showUp() fun showUp()

View File

@ -1,7 +0,0 @@
package com.insanusmokrassar.sdi.utils
import kotlin.reflect.KClass
import kotlin.reflect.KType
actual val KClass<*>.currentSupertypes: List<KType>
get() = this.supertypes

View File

@ -1,12 +1,5 @@
package com.insanusmokrassar.sdi.utils package com.insanusmokrassar.sdi.utils
import kotlinx.serialization.*
import kotlin.reflect.KClass import kotlin.reflect.KClass
@ImplicitReflectionSerializer
actual fun resolveSerializerByPackageName(packageName: String): KSerializer<*> = Class.forName(packageName).kotlin.serializer()
@ImplicitReflectionSerializer
actual fun <T : Any> resolveSerializerByKClass(kClass: KClass<T>): KSerializer<T> = kClass.serializer()
actual fun resolveKClassByPackageName(packageName: String): KClass<*> = Class.forName(packageName).kotlin actual fun resolveKClassByPackageName(packageName: String): KClass<*> = Class.forName(packageName).kotlin