From b828365bb57dcb4ee3a9ea2409d197e4d214c311 Mon Sep 17 00:00:00 2001 From: Alexander Kuznetsov Date: Wed, 17 Jan 2024 11:04:33 +0000 Subject: [PATCH] ReflectiveAccess: find the exact class the field is declared in Affects IR Evaluator in IDEA. The problem is happening because `ReflectiveAccessLowering#fieldLocationAndReceiver` returns the class the field was called on, not the class the field was declared in. Then the class is used for obtaining a field by using reflection's `getDeclaredField` to make the field accessible after. But `getDeclaredField` doesn't work for field declared in a superclass, hence the error. #KT-65012 fixed Merge-request: KT-MR-13919 Merged-by: Alexander Kuznetsov --- .../kotlin/backend/jvm/lower/ReflectiveAccess.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt index ab36b3c97a2..a76217493ca 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt @@ -327,7 +327,7 @@ internal class ReflectiveAccessLowering( arguments.addAll(call.getValueArguments()) return generateReflectiveMethodInvocation( - call.superQualifierSymbol?.defaultType ?: call.symbol.owner.resolveFakeOverrideOrFail().parentAsClass.defaultType, + getDeclaredClassType(call), call.symbol.owner.name.asString(), parameterTypes, call.dispatchReceiver, @@ -449,9 +449,13 @@ internal class ReflectiveAccessLowering( } } - return call.dispatchReceiver!!.type to call.dispatchReceiver!! + val type = getDeclaredClassType(call) + return type to call.dispatchReceiver!! } + private fun getDeclaredClassType(call: IrCall) = + call.superQualifierSymbol?.defaultType ?: call.symbol.owner.resolveFakeOverrideOrFail().parentAsClass.defaultType + private fun generateReflectiveAccessForGetter(call: IrCall): IrExpression { val getter = call.symbol.owner val property = getter.correspondingPropertySymbol!!.owner