Cannot use CodingKey named "value"
marcprux opened this issue · comments
Marc Prud'hommeaux commented
The following swift:
public struct ValueHolder: Decodable {
public let x: Int
public let value: String?
public let z: Bool
}
transpiles into the kotlin:
class ValueHolder: Decodable {
val x: Int
val value: String?
val z: Boolean
constructor(x: Int, value: String? = null, z: Boolean) {
this.x = x
this.value = value
this.z = z
}
private enum class CodingKeys(override val rawValue: String, @Suppress("UNUSED_PARAMETER") unusedp: Nothing? = null): CodingKey, RawRepresentable<String> {
x("x"),
value("value"),
z("z");
}
private fun CodingKeys(rawValue: String): CodingKeys? {
return when (rawValue) {
"x" -> CodingKeys.x
"value" -> CodingKeys.value
"z" -> CodingKeys.z
else -> null
}
}
constructor(from: Decoder) {
val container = from.container(keyedBy = CodingKeys::class)
this.x = container.decode(Int::class, forKey = CodingKeys.x)
this.value = container.decodeIfPresent(String::class, forKey = CodingKeys.value)
this.z = container.decode(Boolean::class, forKey = CodingKeys.z)
}
companion object: DecodableCompanion<ValueHolder> {
override fun init(from: Decoder): ValueHolder = ValueHolder(from = from)
}
}
and yields the (rather inscrutable) compile error:
GRADLE> e: file://…Tests.kt:270:16 Expecting ';' after the last enum entry or '}' to close enum class body
GRADLE> e: file://…Tests.kt:271:14 Expecting member declaration
GRADLE> e: file://…Tests.kt:271:15 Expecting member declaration
GRADLE> e: file://…Tests.kt:271:16 Expecting member declaration
GRADLE> e: file://…Tests.kt:271:21 Expecting member declaration
GRADLE> e: file://…Tests.kt:271:22 Expecting member declaration
GRADLE> e: file://…Tests.kt:271:23 Expecting member declaration
GRADLE> e: file://…Tests.kt:272:9 Expecting member declaration
GRADLE> e: file://…Tests.kt:272:10 Expecting member declaration
GRADLE> e: file://…Tests.kt:272:11 Expecting member declaration
GRADLE> e: file://…Tests.kt:272:12 Expecting member declaration
GRADLE> e: file://…Tests.kt:272:13 Expecting member declaration
GRADLE> e: file://…Tests.kt:272:14 Expecting member declaration
GRADLE> e: file://…Tests.kt:278:35 Unresolved reference: value
GRADLE> e: file://…Tests.kt:279:31 Unresolved reference: z
GRADLE> e: file://…Tests.kt:287:83 Unresolved reference: value
GRADLE> e: file://…Tests.kt:288:71 Unresolved reference: z
GRADLE>
GRADLE> FAILURE: Build failed with an exception.
The workaround is to rename the value
property to something else and assign the corresponding CodingKey to the name back to "value", like so:
public struct ValueHolder: Decodable {
public let x: Int
private let _value: String?
public var value: String? { _value }
public let z: Bool
public enum CodingKeys : String, CodingKey {
case x
case _value = "value"
case z
}
}