[JS IR] Support IrFunctionExpression in jsBind intrinsic

This commit is contained in:
Sergej Jaskiewicz
2022-04-07 19:38:32 +03:00
committed by Space
parent 9fe0f055c5
commit 5b61e60f2f
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
import org.jetbrains.kotlin.ir.expressions.IrFunctionReference import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
@@ -195,15 +196,21 @@ class JsIntrinsicTransformers(backendContext: JsIrBackendContext) {
add(intrinsics.jsBind) { call, context: JsGenerationContext -> add(intrinsics.jsBind) { call, context: JsGenerationContext ->
val receiver = call.getValueArgument(0)!! val receiver = call.getValueArgument(0)!!
val reference = call.getValueArgument(1) as IrFunctionReference
val superClass = call.superQualifierSymbol!!
val jsReceiver = receiver.accept(IrElementToJsExpressionTransformer(), context) val jsReceiver = receiver.accept(IrElementToJsExpressionTransformer(), context)
val functionName = context.getNameForMemberFunction(reference.symbol.owner as IrSimpleFunction) val jsBindTarget = when (val target = call.getValueArgument(1)!!) {
val superName = context.getNameForClass(superClass.owner).makeRef() is IrFunctionReference -> {
val qPrototype = JsNameRef(functionName, prototypeOf(superName)) val superClass = call.superQualifierSymbol!!
val bindRef = JsNameRef(Namer.BIND_FUNCTION, qPrototype) val functionName = context.getNameForMemberFunction(target.symbol.owner as IrSimpleFunction)
val superName = context.getNameForClass(superClass.owner).makeRef()
JsNameRef(functionName, prototypeOf(superName))
}
is IrFunctionExpression -> target.accept(IrElementToJsExpressionTransformer(), context)
else -> compilationException(
"The 'target' argument of 'jsBind' must be either IrFunctionReference or IrFunctionExpression",
call
)
}
val bindRef = JsNameRef(Namer.BIND_FUNCTION, jsBindTarget)
JsInvocation(bindRef, jsReceiver) JsInvocation(bindRef, jsReceiver)
} }