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 <Aleksander.Kuznetsov@jetbrains.com>
This commit is contained in:
Alexander Kuznetsov
2024-01-17 11:04:33 +00:00
committed by Space Team
parent dfe2d8651e
commit b828365bb5
@@ -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