diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index e01809d2c5f..d0ba363a7b9 100644 --- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -106,7 +106,25 @@ class IrSourceCompilerForInline( @OptIn(ObsoleteDescriptorBasedAPI::class) override val isCallInsideSameModuleAsCallee: Boolean - get() = callee.module == codegen.irFunction.module + get() { + val inlineFunModule = callee.fileOrNull?.module + val currentlyGeneratedFunModule = codegen.irFunction.fileOrNull?.module + check(currentlyGeneratedFunModule != null) { + "There is no module for function ${codegen.irFunction.name}:\n${codegen.irFunction.render()}" + } + + return if (inlineFunModule == null) { + callee.module == codegen.irFunction.module + } else { + // Check by IR is needed for the evaluate expression in IDE. + // When we compile some code fragment with inline function call + // that has an anonymous object in callee, we will get incorrect behavior. + // Code fragment is wrapped in `EvaluatorModuleDescriptor` and we accidentally + // think that inline call and callee are in different modules that leads to an error in + // `AnonymousObjectTransformer.doTransform`. + inlineFunModule == currentlyGeneratedFunModule + } + } override val isFinallyMarkerRequired: Boolean get() = codegen.isFinallyMarkerRequired