diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt index 480206f38b0..d48b21e04e5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt @@ -49,11 +49,26 @@ internal fun MethodNode.acceptWithStateMachine( irFunction.psiElement ?: classCodegen.irClass.psiElement else classCodegen.context.suspendLambdaToOriginalFunctionMap[classCodegen.irClass.attributeOwnerId]!!.psiElement + + val lineNumber = if (irFunction.isSuspend) { + val irFile = irFunction.file + if (irFunction.startOffset >= 0) { + // if it suspend function like `suspend fun foo(...)` + irFile.fileEntry.getLineNumber(irFunction.startOffset) + } else { + val klass = classCodegen.irClass + if (klass.startOffset >= 0) { + // if it suspend lambda transformed into class `runSuspend { .... }` + irFile.fileEntry.getLineNumber(klass.startOffset) + } else 0 + } + } else element?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0 + val visitor = CoroutineTransformerMethodVisitor( methodVisitor, access, name, desc, signature, exceptions.toTypedArray(), obtainClassBuilderForCoroutineState = obtainContinuationClassBuilder, reportSuspensionPointInsideMonitor = { reportSuspensionPointInsideMonitor(element as KtElement, state, it) }, - lineNumber = element?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0, + lineNumber = lineNumber, sourceFile = classCodegen.irClass.file.name, languageVersionSettings = languageVersionSettings, shouldPreserveClassInitialization = state.constructorCallNormalizationMode.shouldPreserveClassInitialization, diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepInto/siSuspendFun.out b/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepInto/siSuspendFun.out index 2be0a660b3d..b6411851106 100644 --- a/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepInto/siSuspendFun.out +++ b/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepInto/siSuspendFun.out @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR LineBreakpoint created at siSuspendFun.kt:31 Run Java Connected to the target VM diff --git a/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepOut/souSuspendFun.out b/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepOut/souSuspendFun.out index de4524f361c..1c16602a9db 100644 --- a/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepOut/souSuspendFun.out +++ b/idea/jvm-debugger/jvm-debugger-test/testData/stepping/stepOut/souSuspendFun.out @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR LineBreakpoint created at souSuspendFun.kt:9 Run Java Connected to the target VM