[JS IR] Fix debug info for Char, Long, and unsigned integer literals
Map class constructor calls to the literals they were generated from. #KT-46276
This commit is contained in:
committed by
Space Team
parent
512a2bfd7a
commit
43c5c8b44f
+31
-11
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.ir.backend.js.lower
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.compilationException
|
import org.jetbrains.kotlin.backend.common.compilationException
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
|
||||||
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
@@ -27,43 +26,64 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
|||||||
|
|
||||||
class ConstTransformer(private val context: JsIrBackendContext) : IrElementTransformerVoid() {
|
class ConstTransformer(private val context: JsIrBackendContext) : IrElementTransformerVoid() {
|
||||||
private fun <C> lowerConst(
|
private fun <C> lowerConst(
|
||||||
|
expression: IrConst<*>,
|
||||||
irClass: IrClassSymbol,
|
irClass: IrClassSymbol,
|
||||||
carrierFactory: (Int, Int, IrType, C) -> IrExpression,
|
carrierFactory: (Int, Int, IrType, C) -> IrExpression,
|
||||||
vararg args: C
|
vararg args: C
|
||||||
): IrExpression {
|
): IrExpression {
|
||||||
val constructor = irClass.constructors.single { it.owner.isPrimary }
|
val constructor = irClass.constructors.single { it.owner.isPrimary }
|
||||||
val argType = constructor.owner.valueParameters.first().type
|
val argType = constructor.owner.valueParameters.first().type
|
||||||
return IrConstructorCallImpl.fromSymbolOwner(irClass.defaultType, constructor).apply {
|
return IrConstructorCallImpl.fromSymbolOwner(expression.startOffset, expression.endOffset, irClass.defaultType, constructor).apply {
|
||||||
for (i in args.indices) {
|
for (i in args.indices) {
|
||||||
putValueArgument(i, carrierFactory(UNDEFINED_OFFSET, UNDEFINED_OFFSET, argType, args[i]))
|
putValueArgument(i, carrierFactory(startOffset, endOffset, argType, args[i]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createLong(v: Long): IrExpression =
|
private fun createLong(expression: IrConst<*>, v: Long): IrExpression =
|
||||||
lowerConst(context.intrinsics.longClassSymbol, IrConstImpl.Companion::int, v.toInt(), (v shr 32).toInt())
|
lowerConst(expression, context.intrinsics.longClassSymbol, IrConstImpl.Companion::int, v.toInt(), (v shr 32).toInt())
|
||||||
|
|
||||||
override fun visitConst(expression: IrConst<*>): IrExpression {
|
override fun visitConst(expression: IrConst<*>): IrExpression {
|
||||||
with(context.intrinsics) {
|
with(context.intrinsics) {
|
||||||
if (expression.type.isUnsigned() && expression.kind != IrConstKind.Null) {
|
if (expression.type.isUnsigned() && expression.kind != IrConstKind.Null) {
|
||||||
return when (expression.type.classifierOrNull) {
|
return when (expression.type.classifierOrNull) {
|
||||||
uByteClassSymbol -> lowerConst(uByteClassSymbol, IrConstImpl.Companion::byte, IrConstKind.Byte.valueOf(expression))
|
uByteClassSymbol -> lowerConst(
|
||||||
|
expression,
|
||||||
|
uByteClassSymbol,
|
||||||
|
IrConstImpl.Companion::byte,
|
||||||
|
IrConstKind.Byte.valueOf(expression)
|
||||||
|
)
|
||||||
|
|
||||||
uShortClassSymbol -> lowerConst(uShortClassSymbol, IrConstImpl.Companion::short, IrConstKind.Short.valueOf(expression))
|
uShortClassSymbol -> lowerConst(
|
||||||
|
expression,
|
||||||
|
uShortClassSymbol,
|
||||||
|
IrConstImpl.Companion::short,
|
||||||
|
IrConstKind.Short.valueOf(expression)
|
||||||
|
)
|
||||||
|
|
||||||
uIntClassSymbol -> lowerConst(uIntClassSymbol, IrConstImpl.Companion::int, IrConstKind.Int.valueOf(expression))
|
uIntClassSymbol -> lowerConst(
|
||||||
|
expression,
|
||||||
|
uIntClassSymbol,
|
||||||
|
IrConstImpl.Companion::int,
|
||||||
|
IrConstKind.Int.valueOf(expression)
|
||||||
|
)
|
||||||
|
|
||||||
uLongClassSymbol -> lowerConst(uLongClassSymbol, { _, _, _, v -> createLong(v) }, IrConstKind.Long.valueOf(expression))
|
uLongClassSymbol -> lowerConst(
|
||||||
|
expression,
|
||||||
|
uLongClassSymbol,
|
||||||
|
{ _, _, _, v -> createLong(expression, v) },
|
||||||
|
IrConstKind.Long.valueOf(expression)
|
||||||
|
)
|
||||||
|
|
||||||
else -> compilationException("Unknown unsigned type", expression)
|
else -> compilationException("Unknown unsigned type", expression)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return when {
|
return when {
|
||||||
expression.kind is IrConstKind.Char ->
|
expression.kind is IrConstKind.Char ->
|
||||||
lowerConst(charClassSymbol, IrConstImpl.Companion::int, IrConstKind.Char.valueOf(expression).code)
|
lowerConst(expression, charClassSymbol, IrConstImpl.Companion::int, IrConstKind.Char.valueOf(expression).code)
|
||||||
|
|
||||||
expression.kind is IrConstKind.Long ->
|
expression.kind is IrConstKind.Long ->
|
||||||
createLong(IrConstKind.Long.valueOf(expression))
|
createLong(expression, IrConstKind.Long.valueOf(expression))
|
||||||
|
|
||||||
else -> super.visitConst(expression)
|
else -> super.visitConst(expression)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -5,5 +5,5 @@ fun foo() {
|
|||||||
0L)
|
0L)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LINES(JS): 3 * 5 1 6 2 4
|
// LINES(JS): 3 * 5 1 6 2 4
|
||||||
// LINES(JS_IR): 1 1 2 4
|
// LINES(JS_IR): 1 1 2 3 4 5
|
||||||
|
|||||||
Reference in New Issue
Block a user