Skip to content

Commit 0c679b9

Browse files
authored
Fix getCodec of matching type argument bug (#1339)
bson-kotlin optional type fix
1 parent 18a6c9c commit 0c679b9

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

bson-kotlin/src/main/kotlin/org/bson/codecs/kotlin/DataClassCodec.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ package org.bson.codecs.kotlin
1818
import java.lang.reflect.ParameterizedType
1919
import java.lang.reflect.Type
2020
import kotlin.reflect.KClass
21+
import kotlin.reflect.KClassifier
2122
import kotlin.reflect.KFunction
2223
import kotlin.reflect.KParameter
2324
import kotlin.reflect.KProperty1
24-
import kotlin.reflect.KType
2525
import kotlin.reflect.KTypeParameter
2626
import kotlin.reflect.KTypeProjection
2727
import kotlin.reflect.full.createType
@@ -142,7 +142,9 @@ internal data class DataClassCodec<T : Any>(
142142
val primaryConstructor =
143143
kClass.primaryConstructor ?: throw CodecConfigurationException("No primary constructor for $kClass")
144144
val typeMap =
145-
types.mapIndexed { i, k -> primaryConstructor.typeParameters[i].createType() to k }.toMap()
145+
types
146+
.mapIndexed { i, k -> primaryConstructor.typeParameters[i].createType().classifier!! to k }
147+
.toMap()
146148

147149
val propertyModels =
148150
primaryConstructor.parameters.map { kParameter ->
@@ -193,18 +195,20 @@ internal data class DataClassCodec<T : Any>(
193195
@Suppress("UNCHECKED_CAST")
194196
private fun getCodec(
195197
kParameter: KParameter,
196-
typeMap: Map<KType, Type>,
198+
typeMap: Map<KClassifier, Type>,
197199
codecRegistry: CodecRegistry
198200
): Codec<Any> {
199201
return when (kParameter.type.classifier) {
200202
is KClass<*> -> {
201203
codecRegistry.getCodec(
202204
kParameter,
203205
(kParameter.type.classifier as KClass<Any>).javaObjectType,
204-
kParameter.type.arguments.mapNotNull { typeMap[it.type] ?: computeJavaType(it) }.toList())
206+
kParameter.type.arguments
207+
.mapNotNull { typeMap[it.type?.classifier] ?: computeJavaType(it) }
208+
.toList())
205209
}
206210
is KTypeParameter -> {
207-
when (val pType = typeMap[kParameter.type] ?: kParameter.type.javaType) {
211+
when (val pType = typeMap[kParameter.type.classifier] ?: kParameter.type.javaType) {
208212
is Class<*> ->
209213
codecRegistry.getCodec(kParameter, (pType as Class<Any>).kotlin.javaObjectType, emptyList())
210214
is ParameterizedType ->

bson-kotlin/src/test/kotlin/org/bson/codecs/kotlin/DataClassCodecTest.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,15 +249,17 @@ class DataClassCodecTest {
249249
|"nestedParameterized": {
250250
| "parameterizedDataClass":
251251
| {"number": 4.2, "string": "myString", "parameterizedList": [{"name": "embedded1"}]},
252-
| "other": "myOtherString"
252+
| "other": "myOtherString", "optionalOther": "myOptionalOtherString"
253253
| }
254254
|}"""
255255
.trimMargin()
256256
val dataClass =
257257
DataClassWithNestedParameterizedDataClass(
258258
"myId",
259259
DataClassWithNestedParameterized(
260-
DataClassParameterized(4.2, "myString", listOf(DataClassEmbedded("embedded1"))), "myOtherString"))
260+
DataClassParameterized(4.2, "myString", listOf(DataClassEmbedded("embedded1"))),
261+
"myOtherString",
262+
"myOptionalOtherString"))
261263

262264
assertRoundTrips(expected, dataClass)
263265
}

bson-kotlin/src/test/kotlin/org/bson/codecs/kotlin/samples/DataClasses.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ data class DataClassWithNestedParameterizedDataClass(
8989

9090
data class DataClassWithNestedParameterized<A, B, C : Number>(
9191
val parameterizedDataClass: DataClassParameterized<C, A>,
92-
val other: B
92+
val other: B,
93+
val optionalOther: B?
9394
)
9495

9596
data class DataClassWithPair(val pair: Pair<String, Int>)

0 commit comments

Comments
 (0)