commonMain.co.touchlab.skie.compilerinject.reflection.PropertyField.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of kotlin-compiler-linker-plugin-kgp_1.9.20 Show documentation
Show all versions of kotlin-compiler-linker-plugin-kgp_1.9.20 Show documentation
Kotlin compiler plugin that improves Swift interface of a Kotlin Multiplatform framework.
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)