Skip to content

Commit 25a9525

Browse files
committed
fix decoding null
1 parent 7676f53 commit 25a9525

File tree

3 files changed

+13
-13
lines changed

3 files changed

+13
-13
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ buildscript {
1818
}
1919
}
2020
dependencies {
21-
classpath("com.android.tools.build:gradle:4.1.2")
21+
classpath("com.android.tools.build:gradle:4.0.2")
2222
classpath("com.adarshr:gradle-test-logger-plugin:2.1.1")
2323
}
2424
}

firebase-common/src/commonMain/kotlin/dev/gitlive/firebase/decoders.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ class FirebaseDecoder(internal val value: Any?, private val decodeDouble: (value
6060
override fun decodeNull() = decodeNull(value)
6161

6262
@ExperimentalSerializationApi
63-
override fun decodeInline(inlineDescriptor: SerialDescriptor): Decoder =
64-
FirebaseDecoder(value, decodeDouble)
63+
override fun decodeInline(inlineDescriptor: SerialDescriptor) = FirebaseDecoder(value, decodeDouble)
6564
}
6665

6766
class FirebaseClassDecoder(
@@ -79,13 +78,6 @@ class FirebaseClassDecoder(
7978
.firstOrNull { !descriptor.isElementOptional(it) || containsKey(descriptor.getElementName(it)) }
8079
?.also { index = it + 1 }
8180
?: DECODE_DONE
82-
83-
override fun <T : Any> decodeNullableSerializableElement(
84-
descriptor: SerialDescriptor,
85-
index: Int,
86-
deserializer: DeserializationStrategy<T?>,
87-
previousValue: T?
88-
) = decodeSerializableElement(descriptor, index, deserializer, previousValue)
8981
}
9082

9183
open class FirebaseCompositeDecoder constructor(
@@ -123,13 +115,15 @@ open class FirebaseCompositeDecoder constructor(
123115

124116
override fun decodeLongElement(descriptor: SerialDescriptor, index: Int) = decodeLong(get(descriptor, index))
125117

126-
@ExperimentalSerializationApi
127118
override fun <T : Any> decodeNullableSerializableElement(
128119
descriptor: SerialDescriptor,
129120
index: Int,
130121
deserializer: DeserializationStrategy<T?>,
131122
previousValue: T?
132-
) = decodeSerializableElement(descriptor, index, deserializer, previousValue)
123+
): T? {
124+
val isNullabilitySupported = deserializer.descriptor.isNullable
125+
return if (isNullabilitySupported || decodeNotNullMark(get(descriptor, index))) decodeSerializableElement(descriptor, index, deserializer, previousValue) else decodeNull(get(descriptor, index))
126+
}
133127

134128
override fun decodeShortElement(descriptor: SerialDescriptor, index: Int) = decodeShort(get(descriptor, index))
135129

@@ -206,5 +200,4 @@ private fun decodeNotNullMark(value: Any?) = value != null
206200

207201
private fun decodeNull(value: Any?) = value as Nothing?
208202

209-
private fun decodeUnit(value: Any?) = value as Unit
210203

firebase-common/src/commonTest/kotlin/dev/gitlive/firebase/EncodersTest.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import kotlinx.serialization.Serializable
88
import kotlinx.serialization.builtins.ListSerializer
99
import kotlin.test.Test
1010
import kotlin.test.assertEquals
11+
import kotlin.test.assertNull
1112

1213
expect fun nativeMapOf(vararg pairs: Pair<String, Any>): Any
1314
expect fun nativeListOf(vararg elements: Any): Any
@@ -47,4 +48,10 @@ class EncodersTest {
4748
val decoded = decode(ListSerializer(TestData.serializer()), nativeListOf(nativeMapOf("map" to nativeMapOf("key" to "value"))))
4849
assertEquals(listOf(TestData(mapOf("key" to "value"), false)), decoded)
4950
}
51+
52+
@Test
53+
fun decodeObjectNullableValue() {
54+
val decoded = decode(TestData.serializer(), mapOf("map" to mapOf("key" to "value"), "nullableBool" to null))
55+
assertNull(decoded.nullableBool)
56+
}
5057
}

0 commit comments

Comments
 (0)