diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt index 2322cfca48b..6c2c90826e3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmStaticAnnotationLowering.kt @@ -51,10 +51,8 @@ internal val jvmStaticAnnotationPhase = makeIrFilePhase( private class JvmStaticAnnotationLowering(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass { override fun lower(irFile: IrFile) { CompanionObjectJvmStaticLowering(context).runOnFilePostfix(irFile) - - val functionsMadeStatic = - SingletonObjectJvmStaticLowering(context).apply { runOnFilePostfix(irFile) }.functionsMadeStatic - irFile.transformChildrenVoid(MakeCallsStatic(context, functionsMadeStatic)) + SingletonObjectJvmStaticLowering(context).runOnFilePostfix(irFile) + irFile.transformChildrenVoid(MakeCallsStatic(context)) } } @@ -167,8 +165,6 @@ private class CompanionObjectJvmStaticLowering(val context: JvmBackendContext) : private class SingletonObjectJvmStaticLowering( val context: JvmBackendContext ) : ClassLoweringPass { - val functionsMadeStatic: MutableSet = mutableSetOf() - override fun lower(irClass: IrClass) { if (!irClass.isObject || irClass.isCompanion) return @@ -178,7 +174,6 @@ private class SingletonObjectJvmStaticLowering( jvmStaticFunction.dispatchReceiverParameter?.let { oldDispatchReceiverParameter -> jvmStaticFunction.dispatchReceiverParameter = null modifyBody(jvmStaticFunction, irClass, oldDispatchReceiverParameter) - functionsMadeStatic.add(jvmStaticFunction.symbol) } } } @@ -188,12 +183,16 @@ private class SingletonObjectJvmStaticLowering( } } +private fun IrFunction.isJvmStaticInSingleton(): Boolean { + val parentClass = parent as? IrClass ?: return false + return isJvmStaticFunction(this) && parentClass.isObject && !parentClass.isCompanion +} + private class MakeCallsStatic( - val context: JvmBackendContext, - val functionsMadeStatic: Set + val context: JvmBackendContext ) : IrElementTransformerVoid() { override fun visitCall(expression: IrCall): IrExpression { - if (functionsMadeStatic.contains(expression.symbol)) { + if (expression.symbol.owner.isJvmStaticInSingleton() && expression.dispatchReceiver != null) { return context.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset).irBlock(expression) { // OldReceiver has to be evaluated for its side effects. val oldReceiver = super.visitExpression(expression.dispatchReceiver!!) diff --git a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/jvmStaticDefault.kt b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/jvmStaticDefault.kt index ddbfa35a9eb..e3ea90f24dc 100644 --- a/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/jvmStaticDefault.kt +++ b/compiler/testData/codegen/boxInline/defaultValues/lambdaInlining/jvmStaticDefault.kt @@ -1,6 +1,5 @@ // FILE: 1.kt // SKIP_INLINE_CHECK_IN: inlineFun$default -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM //WITH_RUNTIME package test