[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.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.backend.js.export.isExported
|
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.ir.JsIrBuilder
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.lower.ClassReferenceLowering
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.*
|
import org.jetbrains.kotlin.ir.backend.js.utils.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
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
|
val ref = expression.getTypeArgument(0)!!.classifierOrFail.owner as IrDeclaration
|
||||||
ref.enqueue("intrinsic: jsClass")
|
ref.enqueue("intrinsic: jsClass")
|
||||||
referencedJsClasses += ref
|
referencedJsClasses += ref
|
||||||
|
if (expression.origin == ClassReferenceLowering.Companion.CLASS_REFERENCE) {
|
||||||
|
(ref as IrClass)
|
||||||
|
.constructors
|
||||||
|
.forEach {
|
||||||
|
it.enqueue("intrinsic: jsClass constructor")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
context.intrinsics.jsGetKClassFromExpression -> {
|
context.intrinsics.jsGetKClassFromExpression -> {
|
||||||
val ref = expression.getTypeArgument(0)?.classOrNull ?: context.irBuiltIns.anyClass
|
val ref = expression.getTypeArgument(0)?.classOrNull ?: context.irBuiltIns.anyClass
|
||||||
|
|||||||
@@ -21,7 +21,12 @@ object JsIrBuilder {
|
|||||||
object SYNTHESIZED_STATEMENT : IrStatementOriginImpl("SYNTHESIZED_STATEMENT")
|
object SYNTHESIZED_STATEMENT : IrStatementOriginImpl("SYNTHESIZED_STATEMENT")
|
||||||
object SYNTHESIZED_DECLARATION : IrDeclarationOriginImpl("SYNTHESIZED_DECLARATION")
|
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
|
val owner = target.owner
|
||||||
return IrCallImpl(
|
return IrCallImpl(
|
||||||
UNDEFINED_OFFSET,
|
UNDEFINED_OFFSET,
|
||||||
@@ -30,7 +35,7 @@ object JsIrBuilder {
|
|||||||
target,
|
target,
|
||||||
typeArgumentsCount = owner.typeParameters.size,
|
typeArgumentsCount = owner.typeParameters.size,
|
||||||
valueArgumentsCount = owner.valueParameters.size,
|
valueArgumentsCount = owner.valueParameters.size,
|
||||||
origin = SYNTHESIZED_STATEMENT
|
origin = origin
|
||||||
).apply {
|
).apply {
|
||||||
typeArguments?.let {
|
typeArguments?.let {
|
||||||
assert(typeArguments.size == typeArgumentsCount)
|
assert(typeArguments.size == typeArgumentsCount)
|
||||||
|
|||||||
+9
-1
@@ -127,7 +127,11 @@ class ClassReferenceLowering(val context: JsIrBackendContext) : BodyLoweringPass
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun callJsClass(type: IrType) =
|
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 =
|
private fun buildCall(name: IrSimpleFunctionSymbol, vararg args: IrExpression): IrExpression =
|
||||||
JsIrBuilder.buildCall(name).apply {
|
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