Skip to content

Commit 2d1e8db

Browse files
sandwwraithSpace Team
authored andcommitted
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

Lines changed: 2 additions & 1 deletion
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
Lines changed: 23 additions & 0 deletions
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

Lines changed: 6 additions & 0 deletions
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

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy