[JS IR] Use separate origin for class reference to preserve constructors

This commit is contained in:
Ilya Goncharov
2021-02-26 19:23:42 +03:00
committed by TeamCityServer
parent 796d2fd210
commit 137532bfa6
3 changed files with 24 additions and 3 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.export.isExported
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.backend.js.lower.ClassReferenceLowering
import org.jetbrains.kotlin.ir.backend.js.utils.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
@@ -385,6 +386,13 @@ fun usefulDeclarations(roots: Iterable<IrDeclaration>, context: JsIrBackendConte
val ref = expression.getTypeArgument(0)!!.classifierOrFail.owner as IrDeclaration
ref.enqueue("intrinsic: jsClass")
referencedJsClasses += ref
if (expression.origin == ClassReferenceLowering.Companion.CLASS_REFERENCE) {
(ref as IrClass)
.constructors
.forEach {
it.enqueue("intrinsic: jsClass constructor")
}
}
}
context.intrinsics.jsGetKClassFromExpression -> {
val ref = expression.getTypeArgument(0)?.classOrNull ?: context.irBuiltIns.anyClass
@@ -21,7 +21,12 @@ object JsIrBuilder {
object SYNTHESIZED_STATEMENT : IrStatementOriginImpl("SYNTHESIZED_STATEMENT")
object SYNTHESIZED_DECLARATION : IrDeclarationOriginImpl("SYNTHESIZED_DECLARATION")
fun buildCall(target: IrSimpleFunctionSymbol, type: IrType? = null, typeArguments: List<IrType>? = null): IrCall {
fun buildCall(
target: IrSimpleFunctionSymbol,
type: IrType? = null,
typeArguments: List<IrType>? = null,
origin: IrStatementOrigin = SYNTHESIZED_STATEMENT
): IrCall {
val owner = target.owner
return IrCallImpl(
UNDEFINED_OFFSET,
@@ -30,7 +35,7 @@ object JsIrBuilder {
target,
typeArgumentsCount = owner.typeParameters.size,
valueArgumentsCount = owner.valueParameters.size,
origin = SYNTHESIZED_STATEMENT
origin = origin
).apply {
typeArguments?.let {
assert(typeArguments.size == typeArgumentsCount)
@@ -127,7 +127,11 @@ class ClassReferenceLowering(val context: JsIrBackendContext) : BodyLoweringPass
}
private fun callJsClass(type: IrType) =
JsIrBuilder.buildCall(intrinsics.jsClass, typeArguments = listOf(type))
JsIrBuilder.buildCall(
intrinsics.jsClass,
typeArguments = listOf(type),
origin = CLASS_REFERENCE
)
private fun buildCall(name: IrSimpleFunctionSymbol, vararg args: IrExpression): IrExpression =
JsIrBuilder.buildCall(name).apply {
@@ -252,5 +256,9 @@ class ClassReferenceLowering(val context: JsIrBackendContext) : BodyLoweringPass
}
})
}
companion object {
object CLASS_REFERENCE : IrStatementOriginImpl("CLASS_REFERENCE")
}
}