[JS IR] Add vararg to state machine building

^KT-48344 fixed
This commit is contained in:
Ilya Goncharov
2021-08-23 13:57:51 +03:00
committed by Space
parent 0ca9e08c11
commit acb7ba86bc
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.ir.backend.js.lower.coroutines
import org.jetbrains.kotlin.backend.common.ir.isElseBranch
import org.jetbrains.kotlin.backend.common.ir.isPure
import org.jetbrains.kotlin.backend.common.ir.isSuspend
import org.jetbrains.kotlin.backend.common.peek
import org.jetbrains.kotlin.backend.common.pop
@@ -15,7 +16,6 @@ import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.backend.common.ir.isPure
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.*
@@ -488,6 +488,44 @@ class StateMachineBuilder(
transformLastExpression { expression.apply { argument = it } }
}
override fun visitVararg(expression: IrVararg) {
if (expression !in suspendableNodes) return addStatement(expression)
val spreadIndices = mutableSetOf<Int>()
val arguments: Array<IrExpression?> = expression.elements
.mapIndexed { index, item ->
if (item is IrSpreadElement) {
spreadIndices.add(index)
item.expression
} else {
item as IrExpression
}
}
.toTypedArray()
val newArgs = transformArguments(arguments)
.mapIndexed { index, item ->
requireNotNull(item)
if (index in spreadIndices) {
IrSpreadElementImpl(
item.startOffset,
item.endOffset,
item
)
} else {
item
}
}
.toList()
addStatement(
IrVarargImpl(
expression.startOffset,
expression.endOffset,
expression.type,
expression.varargElementType,
newArgs
)
)
}
private fun transformArguments(arguments: Array<IrExpression?>): Array<IrExpression?> {
var suspendableCount = arguments.fold(0) { r, n -> if (n != null && n in suspendableNodes) r + 1 else r }