[JS IR] Drop last null arguments in calls of external functions

^KT-40090 fixed
This commit is contained in:
Ilya Goncharov
2020-11-19 13:10:08 +03:00
parent 5c731c6c04
commit fe3030c432
@@ -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 {