IR: don't stop lowering expression on first vararg expression, please lower deeper
This commit is contained in:
committed by
vvlevchenko
parent
489723721f
commit
4673de2fdd
+7
-2
@@ -34,8 +34,13 @@ class VarargInjectionLowering internal constructor(val context: Context): Functi
|
|||||||
|
|
||||||
private fun lower(owner:FunctionDescriptor, irBody: IrBody) {
|
private fun lower(owner:FunctionDescriptor, irBody: IrBody) {
|
||||||
irBody.transformChildrenVoid(object: IrElementTransformerVoid() {
|
irBody.transformChildrenVoid(object: IrElementTransformerVoid() {
|
||||||
|
val transformer = this
|
||||||
override fun visitCall(expression: IrCall): IrExpression {
|
override fun visitCall(expression: IrCall): IrExpression {
|
||||||
|
log("call of: ${expression.descriptor}")
|
||||||
context.createIrBuilder(owner, expression.startOffset, expression.endOffset).apply {
|
context.createIrBuilder(owner, expression.startOffset, expression.endOffset).apply {
|
||||||
|
expression.descriptor.valueParameters.forEach {
|
||||||
|
log("varargElementType: ${it.varargElementType} expr: ${ir2string(expression.getValueArgument(it))}")
|
||||||
|
}
|
||||||
expression.descriptor.valueParameters.filter{it.varargElementType != null && expression.getValueArgument(it) == null}.forEach {
|
expression.descriptor.valueParameters.filter{it.varargElementType != null && expression.getValueArgument(it) == null}.forEach {
|
||||||
expression.putValueArgument(it.index,
|
expression.putValueArgument(it.index,
|
||||||
IrVarargImpl(startOffset = startOffset,
|
IrVarargImpl(startOffset = startOffset,
|
||||||
@@ -45,7 +50,7 @@ class VarargInjectionLowering internal constructor(val context: Context): Functi
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.visitCall(expression)
|
expression.transformChildrenVoid(this)
|
||||||
return expression
|
return expression
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +74,7 @@ class VarargInjectionLowering internal constructor(val context: Context): Functi
|
|||||||
|
|
||||||
val vars = expression.elements.map {
|
val vars = expression.elements.map {
|
||||||
val initVar = scope.createTemporaryVariable(
|
val initVar = scope.createTemporaryVariable(
|
||||||
(it as? IrSpreadElement)?.expression ?: it as IrExpression,
|
((it as? IrSpreadElement)?.expression ?: it as IrExpression).apply { it.transformChildrenVoid(transformer) },
|
||||||
"elem".synthesizedString, true)
|
"elem".synthesizedString, true)
|
||||||
block.statements.add(initVar)
|
block.statements.add(initVar)
|
||||||
it to initVar
|
it to initVar
|
||||||
|
|||||||
Reference in New Issue
Block a user