[IR] Fixed a bunch of bugs near local objects in inline lambdas

This commit is contained in:
Igor Chevdar
2022-08-04 20:38:23 +03:00
committed by Space
parent e38f02b53a
commit c5eb6fb562
@@ -44,11 +44,19 @@ class LocalClassesInInlineLambdasLowering(val context: CommonBackendContext) : B
if (!rootCallee.isInline) if (!rootCallee.isInline)
return super.visitCall(expression, data) return super.visitCall(expression, data)
val inlineLambdas = (0 until expression.valueArgumentsCount) expression.extensionReceiver = expression.extensionReceiver?.transform(this, data)
.mapNotNull { index -> expression.dispatchReceiver = expression.dispatchReceiver?.transform(this, data)
(expression.getValueArgument(index) as? IrFunctionExpression)?.function val inlineLambdas = mutableListOf<IrFunction>()
?.takeIf { rootCallee.valueParameters[index].isInlineParameter() } for (index in 0 until expression.valueArgumentsCount) {
} val argument = expression.getValueArgument(index)
val inlineLambda = (argument as? IrFunctionExpression)?.function
?.takeIf { rootCallee.valueParameters[index].isInlineParameter() }
if (inlineLambda == null)
expression.putValueArgument(index, argument?.transform(this, data))
else
inlineLambdas.add(inlineLambda)
}
val localClasses = mutableSetOf<IrClass>() val localClasses = mutableSetOf<IrClass>()
val localFunctions = mutableSetOf<IrFunction>() val localFunctions = mutableSetOf<IrFunction>()
val adaptedFunctions = mutableSetOf<IrSimpleFunction>() val adaptedFunctions = mutableSetOf<IrSimpleFunction>()
@@ -104,14 +112,16 @@ class LocalClassesInInlineLambdasLowering(val context: CommonBackendContext) : B
LocalDeclarationsLowering(context).lower(irBlock, container, data, localClasses, adaptedFunctions) LocalDeclarationsLowering(context).lower(irBlock, container, data, localClasses, adaptedFunctions)
irBlock.statements.addAll(0, localClasses) irBlock.statements.addAll(0, localClasses)
expression.transformChildrenVoid(object : IrElementTransformerVoid() { for (lambda in inlineLambdas) {
override fun visitClass(declaration: IrClass): IrStatement { lambda.transformChildrenVoid(object : IrElementTransformerVoid() {
return IrCompositeImpl( override fun visitClass(declaration: IrClass): IrStatement {
declaration.startOffset, declaration.endOffset, return IrCompositeImpl(
context.irBuiltIns.unitType declaration.startOffset, declaration.endOffset,
) context.irBuiltIns.unitType
} )
}) }
})
}
localClasses.forEach { it.setDeclarationsParent(data) } localClasses.forEach { it.setDeclarationsParent(data) }
return irBlock return irBlock