Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.enro

import kotlin.reflect.KClass

internal actual fun metadataKeyName(kClass: KClass<*>): String {
return kClass.qualifiedName
?: kClass.simpleName
?: error("MetadataKey class must have a qualifiedName or simpleName")
}
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ public interface NavigationKey {
public val default: T,
) {
public val name: String by lazy {
this::class.qualifiedName ?: error("MetadataKeys must have a valid qualifiedName")
metadataKeyName(this::class)
}
}

Expand Down
21 changes: 21 additions & 0 deletions enro-common/src/commonMain/kotlin/dev/enro/metadataKeyName.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package dev.enro

import kotlin.reflect.KClass

/**
* Stable string identifier for a [NavigationKey.MetadataKey]'s class.
* Used as the storage key inside [NavigationKey.Metadata] and persisted
* across saved-state round-trips, so the identifier must be:
*
* - **Stable across runs** — serialised metadata must restore to the
* same logical key on next launch.
* - **Unique per MetadataKey class** — two different MetadataKey objects
* must not collide.
*
* On every target except Kotlin/JS this is `KClass.qualifiedName`. On
* Kotlin/JS, `qualifiedName` is unsupported by the Kotlin reflection
* API, so we fall back to `simpleName`. The JS fallback is correct for
* the common `object MyKey : MetadataKey<...>` pattern as long as the
* `MyKey` simple names are unique within the app.
*/
internal expect fun metadataKeyName(kClass: KClass<*>): String
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.enro

import kotlin.reflect.KClass

internal actual fun metadataKeyName(kClass: KClass<*>): String {
return kClass.qualifiedName
?: kClass.simpleName
?: error("MetadataKey class must have a qualifiedName or simpleName")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.enro

import kotlin.reflect.KClass

internal actual fun metadataKeyName(kClass: KClass<*>): String {
return kClass.qualifiedName
?: kClass.simpleName
?: error("MetadataKey class must have a qualifiedName or simpleName")
}
12 changes: 12 additions & 0 deletions enro-common/src/jsMain/kotlin/dev/enro/metadataKeyName.js.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package dev.enro

import kotlin.reflect.KClass

// Kotlin/JS reflection does not expose qualifiedName. simpleName is the
// only stable identifier available — collisions across packages are
// possible in principle, but the recommended `object MyKey : MetadataKey<…>`
// pattern produces a unique simpleName per definition site.
internal actual fun metadataKeyName(kClass: KClass<*>): String {
return kClass.simpleName
?: error("MetadataKey class must have a simpleName on Kotlin/JS")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.enro

import kotlin.reflect.KClass

internal actual fun metadataKeyName(kClass: KClass<*>): String {
return kClass.qualifiedName
?: kClass.simpleName
?: error("MetadataKey class must have a qualifiedName or simpleName")
}
Loading