From e7a3cd638e7671a689e3dea2c705762265460795 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 13 Nov 2023 15:05:50 +0100 Subject: [PATCH] [JVM_IR] Don't generate reflective access to getter/setter without property This is the case when we have Java class in hierarchy. In this case, we want to generate reflective access to the original Java method. #KT-63642 Fixed --- .../kotlin/backend/jvm/lower/ReflectiveAccess.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 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 3ededb8a50c..44c1acf423b 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 @@ -106,9 +106,11 @@ internal class ReflectiveAccessLowering( if (callee.isAccessible(withSuper = superQualifier != null)) { return expression } - return if (expression.origin == IrStatementOrigin.GET_PROPERTY) { + + val isAccessToProperty = expression.symbol.owner.correspondingPropertySymbol != null + return if (isAccessToProperty && expression.origin == IrStatementOrigin.GET_PROPERTY) { generateReflectiveAccessForGetter(expression) - } else if (expression.origin?.isAssignmentOperator() == true) { + } else if (isAccessToProperty && expression.origin?.isAssignmentOperator() == true) { generateReflectiveAccessForSetter(expression) } else if (expression.dispatchReceiver == null && expression.extensionReceiver == null) { generateReflectiveStaticCall(expression) @@ -325,7 +327,7 @@ internal class ReflectiveAccessLowering( arguments.addAll(call.getValueArguments()) return generateReflectiveMethodInvocation( - call.superQualifierSymbol?.defaultType ?: call.dispatchReceiver?.type ?: call.symbol.owner.parentAsClass.defaultType, + call.superQualifierSymbol?.defaultType ?: call.symbol.owner.resolveFakeOverrideOrFail().parentAsClass.defaultType, call.symbol.owner.name.asString(), parameterTypes, call.dispatchReceiver,