Skip to content

Commit 2d1e8db

Browse files
sandwwraithSpace Team
authored and
Space Team
committed
Handle @serializable classes that implement interfaces by delegation
by filtering out delegated properties that end up in irClass.properties() list Fixes Kotlin/kotlinx.serialization#2157 (cherry picked from commit dc0cd61)
1 parent d5e97c6 commit 2d1e8db

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrSerializableProperties.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package org.jetbrains.kotlinx.serialization.compiler.backend.ir
88
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
99
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
1010
import org.jetbrains.kotlin.ir.declarations.IrClass
11+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
1112
import org.jetbrains.kotlin.ir.declarations.IrProperty
1213
import org.jetbrains.kotlin.ir.types.IrSimpleType
1314
import org.jetbrains.kotlin.ir.util.*
@@ -78,7 +79,7 @@ internal fun serializablePropertiesForIrBackend(
7879

7980
val (primaryCtorSerializableProps, bodySerializableProps) = properties
8081
.asSequence()
81-
.filter { !it.isFakeOverride && !it.isDelegated }
82+
.filter { !it.isFakeOverride && !it.isDelegated && it.origin != IrDeclarationOrigin.DELEGATED_MEMBER }
8283
.filter(::isPropSerializable)
8384
.map {
8485
val isConstructorParameterWithDefault = primaryParamsAsProps[it] ?: false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// TARGET_BACKEND: JVM_IR
2+
3+
// WITH_STDLIB
4+
5+
import kotlinx.serialization.*
6+
import kotlinx.serialization.descriptors.*
7+
import kotlinx.serialization.encoding.*
8+
import kotlinx.serialization.json.*
9+
10+
@Serializable()
11+
class Dto(
12+
val data: Map<Int, Int>
13+
) : Map<Int, Int> by data
14+
15+
fun box(): String {
16+
val dto = Dto(mapOf(1 to 2))
17+
val s = Json.encodeToString(dto)
18+
if (s != """{"data":{"1":2}}""") return s
19+
val d = Json.decodeFromString<Dto>(s)
20+
if (d.size != 1) return "Delegation to Map failed"
21+
if (d.data != dto.data) return "Equals failed ${d.data}"
22+
return "OK"
23+
}

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)