All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.co.touchlab.skie.compilerinject.reflection.PropertyField.kt Maven / Gradle / Ivy

There is a newer version: 0.9.0-RC.5
Show newest version
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 - 2024 Weber Informatics LLC | Privacy Policy