[JS IR] Use separate origin for class reference to preserve constructors
This commit is contained in:
committed by
TeamCityServer
parent
796d2fd210
commit
137532bfa6
@@ -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)
|
||||
|
||||
+9
-1
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user