diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt index 9c483f48805..3499845db49 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/jsAstUtils.kt @@ -198,26 +198,35 @@ fun translateCall( } } -fun translateCallArguments(expression: IrMemberAccessExpression<*>, context: JsGenerationContext, transformer: IrElementToJsExpressionTransformer): List { +fun translateCallArguments( + expression: IrMemberAccessExpression<*>, + context: JsGenerationContext, + transformer: IrElementToJsExpressionTransformer, +): List { val size = expression.valueArgumentsCount - val arguments = (0 until size).mapTo(ArrayList(size)) { index -> - val argument = expression.getValueArgument(index) - val result = argument?.accept(transformer, context) - if (result == null) { - if (context.staticContext.backendContext.es6mode) return@mapTo JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(2)) - - assert(expression is IrFunctionAccessExpression && expression.symbol.owner.isExternalOrInheritedFromExternal()) - JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(1)) - } else - result - } + val validWithNullArgs = expression.validWithNullArgs() + val arguments = (0 until size) + .mapTo(ArrayList(size)) { index -> + val argument = expression.getValueArgument(index) + argument?.accept(transformer, context) + } + .onEach { result -> + if (result == null) { + assert(validWithNullArgs) + } + } + .dropLastWhile { it == null } + .map { it ?: JsPrefixOperation(JsUnaryOperator.VOID, JsIntLiteral(1)) } return if (expression.symbol.isSuspend) { arguments + context.continuation } else arguments } +private fun IrMemberAccessExpression<*>.validWithNullArgs() = + this is IrFunctionAccessExpression && symbol.owner.isExternalOrInheritedFromExternal() + fun JsStatement.asBlock() = this as? JsBlock ?: JsBlock(this) fun defineProperty(receiver: JsExpression, name: String, value: () -> JsExpression): JsInvocation {