From 137532bfa67b8e5554669c19048dd7d28cbbf56f Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 26 Feb 2021 19:23:42 +0300 Subject: [PATCH] [JS IR] Use separate origin for class reference to preserve constructors --- .../src/org/jetbrains/kotlin/ir/backend/js/Dce.kt | 8 ++++++++ .../org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt | 9 +++++++-- .../ir/backend/js/lower/ClassReferenceLowering.kt | 10 +++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt index f13ce04bf22..146effd3f83 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/Dce.kt @@ -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, 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 diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt index a1bdce0b6c3..21b3509d7af 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ir/IrBuilder.kt @@ -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? = null): IrCall { + fun buildCall( + target: IrSimpleFunctionSymbol, + type: IrType? = null, + typeArguments: List? = 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) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt index 2500c038043..3b720ab6085 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ClassReferenceLowering.kt @@ -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") + } }