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())
|
arguments.addAll(call.getValueArguments())
|
||||||
|
|
||||||
return generateReflectiveMethodInvocation(
|
return generateReflectiveMethodInvocation(
|
||||||
call.superQualifierSymbol?.defaultType ?: call.symbol.owner.resolveFakeOverrideOrFail().parentAsClass.defaultType,
|
getDeclaredClassType(call),
|
||||||
call.symbol.owner.name.asString(),
|
call.symbol.owner.name.asString(),
|
||||||
parameterTypes,
|
parameterTypes,
|
||||||
call.dispatchReceiver,
|
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 {
|
private fun generateReflectiveAccessForGetter(call: IrCall): IrExpression {
|
||||||
val getter = call.symbol.owner
|
val getter = call.symbol.owner
|
||||||
val property = getter.correspondingPropertySymbol!!.owner
|
val property = getter.correspondingPropertySymbol!!.owner
|
||||||
|
|||||||
Reference in New Issue
Block a user