Skip to content

decoding value classes crashes #365

Description

@itsvks19

it crashes while decoding value classes, here is my classes where the SchemaVersion is a value class

@Serializable
data class ExtensionManifest(
    val id: String,
    val name: String,
    val version: String,
    @SerialName("schema_version")
    val schemaVersion: SchemaVersion,
    val description: String? = null,
    val repository: String? = null,
    val authors: List<String> = emptyList(),
    val lib: LibManifestEntry = LibManifestEntry(),
    val themes: List<Path> = emptyList(),
    @SerialName("icon_themes")
    val iconThemes: List<Path> = emptyList(),
    val languages: List<Path> = emptyList(),
    val grammars: Map<String, GrammarManifestEntry> = emptyMap(),
    @SerialName("language_servers")
    val languageServers: Map<LanguageServerName, LanguageServerManifestEntry> = emptyMap(),
    val snippets: Path? = null,
    val capabilities: List<ExtensionCapability> = emptyList()
)

SchemaVersion.kt

@JvmInline
@Serializable
value class SchemaVersion(val value: Int)

when running this test, I got following error:

val manifest = manifest()
val toml = Toml(inputConfig = TomlInputConfig(ignoreUnknownNames = true))
val tomlSrc = toml.encodeToString(manifest)
println(tomlSrc)
val manifest2: ExtensionManifest = toml.decodeFromString(tomlSrc)
manifest2.id shouldBe "test"

...

private fun manifest() = ExtensionManifest(
    id = "test",
    name = "Test",
    version = "1.0.0",
    schemaVersion = SchemaVersion.Zero
)

the output of val tomlSrc = toml.encodeToString(manifest):

id = "test"
name = "Test"
version = "1.0.0"
schema_version = 0
authors = [ ]

[lib]







[grammars]

[language_servers]


the error:

Index -1 out of bounds for length 8
java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 8
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Unknown Source)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Unknown Source)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Unknown Source)
	at java.base/java.util.Objects.checkIndex(Unknown Source)
	at java.base/java.util.ArrayList.get(Unknown Source)
	at com.akuleshov7.ktoml.decoders.TomlMainDecoder.getCurrentNode(TomlMainDecoder.kt:69)
	at com.akuleshov7.ktoml.decoders.TomlMainDecoder.decodeKeyValue$ktoml_core(TomlMainDecoder.kt:90)
	at com.akuleshov7.ktoml.decoders.TomlAbstractDecoder.decodeInt(TomlAbstractDecoder.kt:485)
	at com.klyx.extension.SchemaVersion$$serializer.deserialize-yZEIvD4(SchemaVersion.kt:6)
	at com.klyx.extension.SchemaVersion$$serializer.deserialize(SchemaVersion.kt:6)
	at kotlinx.serialization.encoding.Decoder.decodeSerializableValue(Decoding.kt:258)
	at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:16)
	at com.akuleshov7.ktoml.decoders.TomlAbstractDecoder.decodeSerializableValue(TomlAbstractDecoder.kt:124)
	at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
	at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
	at com.klyx.extension.ExtensionManifest$$serializer.deserialize(ExtensionManifest.kt:18)
	at com.klyx.extension.ExtensionManifest$$serializer.deserialize(ExtensionManifest.kt:18)
	at kotlinx.serialization.encoding.Decoder.decodeSerializableValue(Decoding.kt:258)
	at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:16)
	at com.akuleshov7.ktoml.decoders.TomlAbstractDecoder.decodeSerializableValue(TomlAbstractDecoder.kt:124)
	at com.akuleshov7.ktoml.decoders.TomlMainDecoder$Companion.decode(TomlMainDecoder.kt:340)
	at com.akuleshov7.ktoml.Toml.decode(Toml.kt:160)
	at com.akuleshov7.ktoml.Toml.decodeFromString(Toml.kt:52)
	at com.klyx.extension.ExtensionManifestTest$5.invokeSuspend(ExtensionManifestTest.kt:130)
	at com.klyx.extension.ExtensionManifestTest$5.invoke(ExtensionManifestTest.kt)
	at com.klyx.extension.ExtensionManifestTest$5.invoke(ExtensionManifestTest.kt)
	at io.kotest.engine.test.TestCaseExecutor$execute$innerExecute$1.invoke(TestCaseExecutor.kt:116)

When I changed the value class to data class then the error gone.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions