Skip to content

Commit a024eed

Browse files
committed
Supply proper equals(), hashCode(), and toString() for SerialDescriptor() wrapper.
Fixes #2941
1 parent 5439653 commit a024eed

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

core/commonMain/src/kotlinx/serialization/descriptors/SerialDescriptors.kt

+20-7
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,25 @@ public fun SerialDescriptor(serialName: String, original: SerialDescriptor): Ser
121121
return WrappedSerialDescriptor(serialName, original)
122122
}
123123

124-
internal class WrappedSerialDescriptor(override val serialName: String, original: SerialDescriptor) : SerialDescriptor by original
124+
internal class WrappedSerialDescriptor(override val serialName: String, private val original: SerialDescriptor) :
125+
SerialDescriptor by original {
126+
127+
override fun equals(other: Any?): Boolean {
128+
if (this === other) return true
129+
if (other !is WrappedSerialDescriptor) return false
130+
131+
return serialName == other.serialName && original == other.original
132+
}
133+
134+
override fun hashCode(): Int {
135+
var result = serialName.hashCode()
136+
result = 31 * result + original.hashCode()
137+
return result
138+
}
139+
140+
override fun toString(): String = toStringImpl()
141+
142+
}
125143

126144
/**
127145
* An unsafe alternative to [buildClassSerialDescriptor] that supports an arbitrary [SerialKind].
@@ -370,10 +388,5 @@ internal class SerialDescriptorImpl(
370388

371389
override fun hashCode(): Int = _hashCode
372390

373-
override fun toString(): String {
374-
return (0 until elementsCount).joinToString(", ", prefix = "$serialName(", postfix = ")") {
375-
getElementName(it) + ": " + getElementDescriptor(it).serialName
376-
}
377-
}
391+
override fun toString(): String = toStringImpl()
378392
}
379-

core/commonMain/src/kotlinx/serialization/internal/PluginGeneratedSerialDescriptor.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,7 @@ internal open class PluginGeneratedSerialDescriptor(
9696

9797
override fun hashCode(): Int = _hashCode
9898

99-
override fun toString(): String {
100-
return (0 until elementsCount).joinToString(", ", "$serialName(", ")") { i ->
101-
getElementName(i) + ": " + getElementDescriptor(i).serialName
102-
}
103-
}
99+
override fun toString(): String = toStringImpl()
104100
}
105101

106102
@OptIn(ExperimentalSerializationApi::class)
@@ -131,3 +127,7 @@ internal fun SerialDescriptor.hashCodeImpl(typeParams: Array<SerialDescriptor>):
131127
result = 31 * result + kindHash
132128
return result
133129
}
130+
131+
internal fun SerialDescriptor.toStringImpl(): String = (0 until elementsCount).joinToString(", ", "$serialName(", ")") { i ->
132+
getElementName(i) + ": " + getElementDescriptor(i).serialName
133+
}

core/commonTest/src/kotlinx/serialization/WrappedSerialDescriptorTest.kt

+10
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,14 @@ class WrappedSerialDescriptorTest {
7575
}
7676
assertFails { SerialDescriptor("kotlin.Int", Int.serializer().descriptor) }
7777
}
78+
79+
@Test
80+
fun testWrappedEqHc() {
81+
val a = SerialDescriptor("SimpleTypeWrapper", SimpleType.serializer().descriptor)
82+
val b = SerialDescriptor("SimpleTypeWrapper", SimpleType.serializer().descriptor)
83+
assertEquals(a, b)
84+
assertEquals(a.hashCode(), b.hashCode())
85+
assertNotEquals(a, SimpleType.serializer().descriptor)
86+
assertEquals(a.toString(), "SimpleTypeWrapper(int: kotlin.Int, float: kotlin.Float)")
87+
}
7888
}

0 commit comments

Comments
 (0)