[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)