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:
committed by
Space Team
parent
dfe2d8651e
commit
b828365bb5
+6
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user