[WASM] Use correct source file for inlined local declarations

#KT-78384 Fixed
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt
index a4a99d4..8e079bd 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt
@@ -1418,11 +1418,11 @@
     }
 
     private fun IrElement.getSourceLocation() = getSourceLocation(
-        functionContext.currentFunctionSymbol, functionContext.currentFunctionSymbol?.owner?.fileOrNull
+        functionContext.currentFunctionSymbol, functionContext.currentFileEntry
     )
 
     private fun IrElement.getSourceEndLocation() = getSourceLocation(
-        functionContext.currentFunctionSymbol, functionContext.currentFunctionSymbol?.owner?.fileOrNull, type = LocationType.END
+        functionContext.currentFunctionSymbol, functionContext.currentFileEntry, type = LocationType.END
     )
 
     private fun IrElement.nextLocation() = when (getSourceLocation()) {
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt
index 57e1a22..12ff85d 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt
@@ -12,6 +12,7 @@
 import org.jetbrains.kotlin.descriptors.Modality
 import org.jetbrains.kotlin.ir.IrBuiltIns
 import org.jetbrains.kotlin.ir.IrElement
+import org.jetbrains.kotlin.ir.IrFileEntry
 import org.jetbrains.kotlin.backend.common.lower.WebCallableReferenceLowering
 import org.jetbrains.kotlin.ir.backend.js.lower.originalFqName
 import org.jetbrains.kotlin.ir.backend.js.utils.*
@@ -23,7 +24,7 @@
 import org.jetbrains.kotlin.ir.types.getClass
 import org.jetbrains.kotlin.ir.util.*
 import org.jetbrains.kotlin.ir.util.erasedUpperBound
-import org.jetbrains.kotlin.ir.visitors.IrVisitorVoid
+import org.jetbrains.kotlin.ir.visitors.IrVisitor
 import org.jetbrains.kotlin.ir.visitors.acceptVoid
 import org.jetbrains.kotlin.name.parentOrNull
 import org.jetbrains.kotlin.wasm.ir.*
@@ -39,26 +40,26 @@
     private val wasmModuleMetadataCache: WasmModuleMetadataCache,
     private val allowIncompleteImplementations: Boolean,
     private val skipCommentInstructions: Boolean,
-) : IrVisitorVoid() {
+) : IrVisitor<Unit, DeclarationGenerator.Context>() {
     // Shortcuts
     private val irBuiltIns: IrBuiltIns = backendContext.irBuiltIns
 
     private val unitGetInstanceFunction: IrSimpleFunction by lazy { backendContext.findUnitGetInstanceFunction() }
     private val unitPrimaryConstructor: IrConstructor? by lazy { backendContext.irBuiltIns.unitClass.owner.primaryConstructor }
 
-    override fun visitElement(element: IrElement) {
+    override fun visitElement(element: IrElement, data: Context) {
         error("Unexpected element of type ${element::class}")
     }
 
-    override fun visitProperty(declaration: IrProperty) {
+    override fun visitProperty(declaration: IrProperty, data: Context) {
         require(declaration.isExternal)
     }
 
-    override fun visitTypeAlias(declaration: IrTypeAlias) {
+    override fun visitTypeAlias(declaration: IrTypeAlias, data: Context) {
         // Type aliases are not material
     }
 
-    override fun visitFunction(declaration: IrFunction) {
+    override fun visitFunction(declaration: IrFunction, data: Context) {
         // Constructor of inline class or with `@WasmPrimitiveConstructor` is empty
         if (declaration is IrConstructor &&
             (backendContext.inlineClassesUtils.isClassInlineLike(declaration.parentAsClass) || declaration.hasWasmPrimitiveConstructorAnnotation())
@@ -132,8 +133,8 @@
         }
 
         val locationTarget = declaration.locationTarget
-        val functionStartLocation = locationTarget.getSourceLocation(declaration.symbol, declaration.fileOrNull)
-        val functionEndLocation = locationTarget.getSourceLocation(declaration.symbol, declaration.fileOrNull, LocationType.END)
+        val functionStartLocation = locationTarget.getSourceLocation(declaration.symbol, declaration.fileEntry)
+        val functionEndLocation = locationTarget.getSourceLocation(declaration.symbol, declaration.fileEntry, LocationType.END)
 
         val function = WasmFunction.Defined(
             watName,
@@ -147,7 +148,8 @@
             backendContext,
             wasmFileCodegenContext,
             wasmModuleTypeTransformer,
-            skipCommentInstructions
+            declaration.sourceFileWhenInlined ?: data.sourceFileEntry,
+            skipCommentInstructions,
         )
 
         for (irParameter in irParameters) {
@@ -444,7 +446,7 @@
         wasmFileCodegenContext.defineGlobalClassITable(klass.symbol, wasmClassIFaceGlobal)
     }
 
-    override fun visitClass(declaration: IrClass) {
+    override fun visitClass(declaration: IrClass, data: Context) {
         if (declaration.isExternal) return
         val symbol = declaration.symbol
 
@@ -505,7 +507,7 @@
         }
 
         for (member in declaration.declarations) {
-            member.acceptVoid(this)
+            member.accept(this, data.copy(declaration.sourceFileWhenInlined ?: data.sourceFileEntry))
         }
     }
 
@@ -534,7 +536,7 @@
         )
     }
 
-    override fun visitField(declaration: IrField) {
+    override fun visitField(declaration: IrField, data: Context) {
         // Member fields are generated as part of struct type
         if (!declaration.isStatic) return
 
@@ -551,7 +553,7 @@
                     wasmExpressionGenerator,
                     wasmFileCodegenContext,
                     backendContext,
-                    initValue.getSourceLocation(declaration.symbol, declaration.fileOrNull)
+                    initValue.getSourceLocation(declaration.symbol, data.sourceFileEntry)
                 )
             } else {
                 val stubFunction = WasmFunction.Defined("static_fun_stub", WasmSymbol())
@@ -561,6 +563,7 @@
                     backendContext,
                     wasmFileCodegenContext,
                     wasmModuleTypeTransformer,
+                    data.sourceFileEntry,
                     skipCommentInstructions,
                 )
                 val bodyGenerator = BodyGenerator(
@@ -591,6 +594,8 @@
 
         wasmFileCodegenContext.defineGlobalField(declaration.symbol, global)
     }
+
+    data class Context(val sourceFileEntry: IrFileEntry)
 }
 
 fun generateDefaultInitializerForType(type: WasmType, g: WasmExpressionBuilder) =
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmFunctionCodegenContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmFunctionCodegenContext.kt
index 2875158..d157c96 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmFunctionCodegenContext.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmFunctionCodegenContext.kt
@@ -14,7 +14,6 @@
 import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
 import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
 import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
-import org.jetbrains.kotlin.ir.util.fileEntry
 import org.jetbrains.kotlin.wasm.ir.*
 import java.util.LinkedList
 
@@ -27,6 +26,7 @@
     private val backendContext: WasmBackendContext,
     private val wasmFileCodegenContext: WasmFileCodegenContext,
     private val wasmModuleTypeTransformer: WasmModuleTypeTransformer,
+    private val functionFileEntry: IrFileEntry,
     skipCommentInstructions: Boolean
 ) {
     val bodyGen: WasmExpressionBuilder =
@@ -111,7 +111,7 @@
         get() = inlineContextStack.firstOrNull()?.inlineFunctionSymbol ?: irFunction?.symbol
 
     val currentFileEntry: IrFileEntry?
-        get() = inlineContextStack.firstOrNull()?.irFileEntry ?: irFunction?.fileEntry
+        get() = inlineContextStack.firstOrNull()?.irFileEntry ?: functionFileEntry
 
     fun stepIntoInlinedFunction(inlineFunctionSymbol: IrFunctionSymbol?, irFileEntry: IrFileEntry) {
         inlineContextStack.push(InlineContext(inlineFunctionSymbol, irFileEntry))
diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleFragmentGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleFragmentGenerator.kt
index de72d7e..60c7612 100644
--- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleFragmentGenerator.kt
+++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/WasmModuleFragmentGenerator.kt
@@ -83,7 +83,7 @@
         skipCommentInstructions,
     )
     for (irDeclaration in irFile.declarations) {
-        irDeclaration.acceptVoid(generator)
+        irDeclaration.accept(generator, DeclarationGenerator.Context(irFile.fileEntry))
     }
 
     val fileContext = backendContext.getFileContext(irFile)
diff --git a/compiler/testData/debug/stepping/kt42208.kt b/compiler/testData/debug/stepping/kt42208.kt
index 69f78cc..2650c5c 100644
--- a/compiler/testData/debug/stepping/kt42208.kt
+++ b/compiler/testData/debug/stepping/kt42208.kt
@@ -30,10 +30,10 @@
 // test.kt:6 $box (4)
 
 // EXPECTATIONS ClassicFrontend WASM
-// test.kt:8 $box$lambda.invoke (42)
+// test1.kt:11 $box$lambda.invoke (0)
 
 // EXPECTATIONS FIR WASM
-// test.kt:8 $box$lambda.invoke (43)
+// test1.kt:11 $box$lambda.invoke (1)
 
 // EXPECTATIONS WASM
 // test.kt:6 $box (4)
diff --git a/compiler/testData/debug/stepping/kt42208b.kt b/compiler/testData/debug/stepping/kt42208b.kt
index a8c5a9f..1596af2 100644
--- a/compiler/testData/debug/stepping/kt42208b.kt
+++ b/compiler/testData/debug/stepping/kt42208b.kt
@@ -33,10 +33,10 @@
 // test.kt:7 $box (4)
 
 // EXPECTATIONS ClassicFrontend WASM
-// test.kt:9 $box$lambda.invoke (29)
+// test1.kt:12 $box$lambda.invoke (0)
 
 // EXPECTATIONS FIR WASM
-// test.kt:9 $box$lambda.invoke (30)
+// test1.kt:12 $box$lambda.invoke (1)
 
 // EXPECTATIONS WASM
 // test.kt:7 $box (4)
diff --git a/compiler/testData/debug/stepping/kt42208c.kt b/compiler/testData/debug/stepping/kt42208c.kt
index bed0974..62d673d 100644
--- a/compiler/testData/debug/stepping/kt42208c.kt
+++ b/compiler/testData/debug/stepping/kt42208c.kt
@@ -56,10 +56,10 @@
 // test3.kt:16 $baz (4)
 
 // EXPECTATIONS ClassicFrontend WASM
-// test.kt:10 $box$lambda.invoke (12)
+// test1.kt:13 $box$lambda.invoke (0)
 
 // EXPECTATIONS FIR WASM
-// test.kt:10 $box$lambda.invoke (13)
+// test1.kt:13 $box$lambda.invoke (1)
 
 // EXPECTATIONS WASM
 // test3.kt:16 $baz (4)
@@ -70,10 +70,10 @@
 // test3.kt:16 $baz (4)
 
 // EXPECTATIONS ClassicFrontend WASM
-// test.kt:10 $box$lambda.invoke (12)
+// test1.kt:13 $box$lambda.invoke (0)
 
 // EXPECTATIONS FIR WASM
-// test.kt:10 $box$lambda.invoke (13)
+// test1.kt:13 $box$lambda.invoke (1)
 
 // EXPECTATIONS WASM
 // test3.kt:16 $baz (4)