
commonMain.co.touchlab.skie.compilerinject.reflection.PropertyField.kt Maven / Gradle / Ivy
package co.touchlab.skie.compilerinject.reflection
import java.lang.reflect.Field
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
import kotlin.reflect.KProperty1
class PropertyField(private val originalPropertyName: String) : ReadWriteProperty {
override operator fun getValue(thisRef: T, property: KProperty<*>): V = onFieldOf(thisRef) { field ->
@Suppress("UNCHECKED_CAST")
field.get(thisRef) as V
}
override operator fun setValue(thisRef: T, property: KProperty<*>, value: V) = onFieldOf(thisRef) { field ->
field.set(thisRef, value)
}
private inline fun onFieldOf(thisRef: T, run: (Field) -> U): U {
thisRef.javaClass.getDeclaredField(originalPropertyName).let { field ->
check(field.trySetAccessible()) { "Failed to make field `${originalPropertyName}` accessible" }
return run(field)
}
}
}
val KProperty1.field: PropertyField
get() = PropertyField(this.name)
© 2015 - 2025 Weber Informatics LLC | Privacy Policy