[JS IR] Drop last null arguments in calls of external functions
^KT-40090 fixed
This commit is contained in:
+21
-12
@@ -198,26 +198,35 @@ fun translateCall(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun translateCallArguments(expression: IrMemberAccessExpression<*>, context: JsGenerationContext, transformer: IrElementToJsExpressionTransformer): List<JsExpression> {
|
fun translateCallArguments(
|
||||||
|
expression: IrMemberAccessExpression<*>,
|
||||||
|
context: JsGenerationContext,
|
||||||
|
transformer: IrElementToJsExpressionTransformer,
|
||||||
|
): List<JsExpression> {
|
||||||
val size = expression.valueArgumentsCount
|
val size = expression.valueArgumentsCount
|
||||||
|
|
||||||
val arguments = (0 until size).mapTo(ArrayList(size)) { index ->
|
val validWithNullArgs = expression.validWithNullArgs()
|
||||||
val argument = expression.getValueArgument(index)
|
val arguments = (0 until size)
|
||||||
val result = argument?.accept(transformer, context)
|
.mapTo(ArrayList(size)) { index ->
|
||||||
if (result == null) {
|
val argument = expression.getValueArgument(index)
|
||||||
if (context.staticContext.backendContext.es6mode) return@mapTo JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(2))
|
argument?.accept(transformer, context)
|
||||||
|
}
|
||||||
assert(expression is IrFunctionAccessExpression && expression.symbol.owner.isExternalOrInheritedFromExternal())
|
.onEach { result ->
|
||||||
JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(1))
|
if (result == null) {
|
||||||
} else
|
assert(validWithNullArgs)
|
||||||
result
|
}
|
||||||
}
|
}
|
||||||
|
.dropLastWhile { it == null }
|
||||||
|
.map { it ?: JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(1)) }
|
||||||
|
|
||||||
return if (expression.symbol.isSuspend) {
|
return if (expression.symbol.isSuspend) {
|
||||||
arguments + context.continuation
|
arguments + context.continuation
|
||||||
} else arguments
|
} else arguments
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun IrMemberAccessExpression<*>.validWithNullArgs() =
|
||||||
|
this is IrFunctionAccessExpression && symbol.owner.isExternalOrInheritedFromExternal()
|
||||||
|
|
||||||
fun JsStatement.asBlock() = this as? JsBlock ?: JsBlock(this)
|
fun JsStatement.asBlock() = this as? JsBlock ?: JsBlock(this)
|
||||||
|
|
||||||
fun defineProperty(receiver: JsExpression, name: String, value: () -> JsExpression): JsInvocation {
|
fun defineProperty(receiver: JsExpression, name: String, value: () -> JsExpression): JsInvocation {
|
||||||
|
|||||||
Reference in New Issue
Block a user