Skip to content

Commit

Permalink
Don't fail if there is no serializer for type parameters of contextua…
Browse files Browse the repository at this point in the history
…l serializer

Return null instead.
Such behaviour is needed to support cachedChildSerializers logic.
Since this field creator doesn't provide genericGetter (because it's
static),
type param serializer can't be retrieved, and the whole contextual
serializer shouldn't be cached.

#KT-58067 Fixed

(cherry picked from commit fa8f38c)
  • Loading branch information
sandwwraith authored and Space Team committed Apr 19, 2023
1 parent a75271c commit 34efee5
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 1 deletion.
Expand Up @@ -497,7 +497,7 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override
compilerContext,
it
)
instantiate(argSer, it)!!
instantiate(argSer, it) ?: return null
})
)
}
Expand Down
@@ -0,0 +1,44 @@
// TARGET_BACKEND: JVM_IR

// WITH_STDLIB

import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.modules.*
import kotlinx.serialization.encoding.*

class SomeData<T>(val t: T)

@Serializable
class PagedData<T>(
@Contextual val someData: SomeData<T>,
)

class SomeDataSerializer<T>(val tSer: KSerializer<T>) : KSerializer<SomeData<T>> {
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("SomeData")

override fun serialize(encoder: Encoder, value: SomeData<T>) {
encoder as JsonEncoder
val data = encoder.json.encodeToJsonElement(tSer, value.t)
val obj = buildJsonObject {
put("innerType", tSer.descriptor.serialName)
put("data", data)
}
encoder.encodeJsonElement(obj)
}

override fun deserialize(decoder: Decoder): SomeData<T> {
TODO("Not yet implemented")
}
}

fun box(): String {
val module = SerializersModule {
contextual(SomeData::class) { args -> SomeDataSerializer(args[0]) }
}
val json = Json { serializersModule = module }
val input = PagedData<String>(SomeData("foo_bar"))
val enc = json.encodeToString(input)
return if (enc != """{"someData":{"innerType":"kotlin.String","data":"foo_bar"}}""") enc else "OK"
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 34efee5

Please sign in to comment.