matiaslev
01/25/2020, 7:26 PM/**
* The [typeChecker] function allows the user to provide a custom implementation of the [KotlinTypeChecker].
* With a custom [KotlinTypeChecker], we can redefine what subtyping and type equality means.
*/
fun typeChecker(replace: (KotlinTypeChecker) -> KotlinTypeChecker): arrow.meta.phases.config.StorageComponentContainer =
storageComponent(
registerModuleComponents = { container, moduleDescriptor ->
val defaultTypeChecker = KotlinTypeChecker.DEFAULT
val replacement = replace(defaultTypeChecker)
if (replacement != defaultTypeChecker) {
val defaultTypeCheckerField = KotlinTypeChecker::class.java.getDeclaredField("DEFAULT")
setFinalStatic(defaultTypeCheckerField, replace(defaultTypeChecker))
}
},
check = { _, _, _ ->
}
)
and tries Field::class.java.getDeclaredField("modifiers")
@Throws(Exception::class)
internal fun setFinalStatic(field: Field, newValue: Any) {
field.isAccessible = true
val modifiersField = Field::class.java.getDeclaredField("modifiers")
modifiersField.isAccessible = true
modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv())
field.set(null, newValue)
}