Skip to content

Commit 608154c

Browse files
committed
Fix Scala case class macro codec lookup bug (#945)
Fixes an issue when determining the codec to use for a case class that contains a Map type that has a value that contains the same key name and field name. JAVA-4611
1 parent c92176a commit 608154c

File tree

2 files changed

+12
-17
lines changed

2 files changed

+12
-17
lines changed

bson-scala/src/main/scala/org/mongodb/scala/bson/codecs/macrocodecs/MacroCodec.scala

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ trait MacroCodec[T] extends Codec[T] {
104104
if (typeArgs.isEmpty) {
105105
reader.skipValue()
106106
} else {
107-
map += (name -> readValue(reader, decoderContext, typeArgs.head, typeArgs.tail, fieldTypeArgsMap))
107+
map += (name -> readValue(reader, decoderContext, typeArgs.head, typeArgs.tail))
108108
}
109109
}
110110
reader.readEndDocument()
@@ -180,13 +180,12 @@ trait MacroCodec[T] extends Codec[T] {
180180
reader: BsonReader,
181181
decoderContext: DecoderContext,
182182
clazz: Class[V],
183-
typeArgs: List[Class[_]],
184-
fieldTypeArgsMap: Map[String, List[Class[_]]]
183+
typeArgs: List[Class[_]]
185184
): V = {
186185
val currentType = reader.getCurrentBsonType
187186
currentType match {
188-
case BsonType.DOCUMENT => readDocument(reader, decoderContext, clazz, typeArgs, fieldTypeArgsMap)
189-
case BsonType.ARRAY => readArray(reader, decoderContext, clazz, typeArgs, fieldTypeArgsMap)
187+
case BsonType.DOCUMENT => readDocument(reader, decoderContext, clazz, typeArgs)
188+
case BsonType.ARRAY => readArray(reader, decoderContext, clazz, typeArgs)
190189
case BsonType.NULL =>
191190
reader.readNull()
192191
null.asInstanceOf[V] // scalastyle:ignore
@@ -198,8 +197,7 @@ trait MacroCodec[T] extends Codec[T] {
198197
reader: BsonReader,
199198
decoderContext: DecoderContext,
200199
clazz: Class[V],
201-
typeArgs: List[Class[_]],
202-
fieldTypeArgsMap: Map[String, List[Class[_]]]
200+
typeArgs: List[Class[_]]
203201
): V = {
204202

205203
if (typeArgs.isEmpty) {
@@ -210,7 +208,7 @@ trait MacroCodec[T] extends Codec[T] {
210208
reader.readStartArray()
211209
val list = mutable.ListBuffer[Any]()
212210
while (reader.readBsonType ne BsonType.END_OF_DOCUMENT) {
213-
list.append(readValue(reader, decoderContext, typeArgs.head, typeArgs.tail, fieldTypeArgsMap))
211+
list.append(readValue(reader, decoderContext, typeArgs.head, typeArgs.tail))
214212
}
215213
reader.readEndArray()
216214
if (classOf[Set[_]].isAssignableFrom(clazz)) {
@@ -228,8 +226,7 @@ trait MacroCodec[T] extends Codec[T] {
228226
reader: BsonReader,
229227
decoderContext: DecoderContext,
230228
clazz: Class[V],
231-
typeArgs: List[Class[_]],
232-
fieldTypeArgsMap: Map[String, List[Class[_]]]
229+
typeArgs: List[Class[_]]
233230
): V = {
234231
if (classToCaseClassMap.getOrElse(clazz, false) || typeArgs.isEmpty) {
235232
registry.get(clazz).decode(reader, decoderContext)
@@ -238,16 +235,14 @@ trait MacroCodec[T] extends Codec[T] {
238235
reader.readStartDocument()
239236
while (reader.readBsonType ne BsonType.END_OF_DOCUMENT) {
240237
val name = reader.readName
241-
val fieldClazzTypeArgs = fieldTypeArgsMap.getOrElse(name, typeArgs)
242-
if (fieldClazzTypeArgs.isEmpty) {
238+
if (typeArgs.isEmpty) {
243239
reader.skipValue()
244240
} else {
245241
map += (name -> readValue(
246242
reader,
247243
decoderContext,
248-
fieldClazzTypeArgs.head,
249-
fieldClazzTypeArgs.tail,
250-
fieldTypeArgsMap
244+
typeArgs.head,
245+
typeArgs.tail
251246
))
252247
}
253248
}

bson-scala/src/test/scala/org/mongodb/scala/bson/codecs/MacrosSpec.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,8 @@ class MacrosSpec extends BaseSpec {
329329

330330
it should "be able to round trip nested case classes in maps" in {
331331
roundTrip(
332-
ContainsMapOfCaseClasses("Bob", Map("mother" -> Person("Jane", "Jones"))),
333-
"""{name: "Bob", friends: {mother: {firstName: "Jane", lastName: "Jones"}}}""",
332+
ContainsMapOfCaseClasses("Bob", Map("name" -> Person("Jane", "Jones"))),
333+
"""{name: "Bob", friends: {name: {firstName: "Jane", lastName: "Jones"}}}""",
334334
classOf[ContainsMapOfCaseClasses],
335335
classOf[Person]
336336
)

0 commit comments

Comments
 (0)