Skip to content

Commit 4fb1305

Browse files
ht-jorozza
authored andcommitted
Fix getCodec of matching type argument bug (#1339)
bson-kotlin optional type fix Port bson-kotlin test to bson-kotlinx (#1452) JAVA-5365
1 parent 4577f95 commit 4fb1305

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
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.java, 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
@@ -320,15 +320,17 @@ class DataClassCodecTest {
320320
|"nestedParameterized": {
321321
| "parameterizedDataClass":
322322
| {"number": 4.2, "string": "myString", "parameterizedList": [{"name": "embedded1"}]},
323-
| "other": "myOtherString"
323+
| "other": "myOtherString", "optionalOther": "myOptionalOtherString"
324324
| }
325325
|}"""
326326
.trimMargin()
327327
val dataClass =
328328
DataClassWithNestedParameterizedDataClass(
329329
"myId",
330330
DataClassWithNestedParameterized(
331-
DataClassParameterized(4.2, "myString", listOf(DataClassEmbedded("embedded1"))), "myOtherString"))
331+
DataClassParameterized(4.2, "myString", listOf(DataClassEmbedded("embedded1"))),
332+
"myOtherString",
333+
"myOptionalOtherString"))
332334

333335
assertRoundTrips(expected, dataClass)
334336
}

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
@@ -178,7 +178,8 @@ data class DataClassWithNestedParameterizedDataClass(
178178

179179
data class DataClassWithNestedParameterized<A, B, C : Number>(
180180
val parameterizedDataClass: DataClassParameterized<C, A>,
181-
val other: B
181+
val other: B,
182+
val optionalOther: B?
182183
)
183184

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

bson-kotlinx/src/test/kotlin/org/bson/codecs/kotlinx/KotlinSerializerCodecTest.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,15 +396,17 @@ class KotlinSerializerCodecTest {
396396
|"nestedParameterized": {
397397
| "parameterizedDataClass":
398398
| {"number": 4.2, "string": "myString", "parameterizedList": [{"name": "embedded1"}]},
399-
| "other": "myOtherString"
399+
| "other": "myOtherString", "optionalOther": "myOptionalOtherString"
400400
| }
401401
|}"""
402402
.trimMargin()
403403
val dataClass =
404404
DataClassWithNestedParameterizedDataClass(
405405
"myId",
406406
DataClassWithNestedParameterized(
407-
DataClassParameterized(4.2, "myString", listOf(DataClassEmbedded("embedded1"))), "myOtherString"))
407+
DataClassParameterized(4.2, "myString", listOf(DataClassEmbedded("embedded1"))),
408+
"myOtherString",
409+
"myOptionalOtherString"))
408410

409411
assertRoundTrips(expected, dataClass)
410412
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ data class DataClassWithNestedParameterizedDataClass(
125125
@Serializable
126126
data class DataClassWithNestedParameterized<A, B, C : Number>(
127127
val parameterizedDataClass: DataClassParameterized<C, A>,
128-
val other: B
128+
val other: B,
129+
val optionalOther: B?
129130
)
130131

131132
@Serializable data class DataClassWithPair(val pair: Pair<String, Int>)

0 commit comments

Comments
 (0)