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