[IR] Fixed a bunch of bugs near local objects in inline lambdas
This commit is contained in:
+23
-13
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user