[IR] Fixed wrong parents
This commit is contained in:
+13
-8
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.backend.common.BackendContext
|
|||||||
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.ir.isInlineFunWithReifiedParameter
|
import org.jetbrains.kotlin.backend.common.ir.isInlineFunWithReifiedParameter
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
|
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
|
||||||
import org.jetbrains.kotlin.ir.builders.irCall
|
import org.jetbrains.kotlin.ir.builders.irCall
|
||||||
@@ -24,9 +23,10 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl
|
|||||||
import org.jetbrains.kotlin.ir.types.IrTypeArgument
|
import org.jetbrains.kotlin.ir.types.IrTypeArgument
|
||||||
import org.jetbrains.kotlin.ir.types.IrTypeSubstitutor
|
import org.jetbrains.kotlin.ir.types.IrTypeSubstitutor
|
||||||
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
|
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
|
||||||
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
|
import org.jetbrains.kotlin.ir.util.setDeclarationsParent
|
||||||
import org.jetbrains.kotlin.ir.util.typeSubstitutionMap
|
import org.jetbrains.kotlin.ir.util.typeSubstitutionMap
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
@@ -37,9 +37,12 @@ class WrapInlineDeclarationsWithReifiedTypeParametersLowering(val context: Backe
|
|||||||
get() = context.irFactory
|
get() = context.irFactory
|
||||||
|
|
||||||
override fun lower(irBody: IrBody, container: IrDeclaration) {
|
override fun lower(irBody: IrBody, container: IrDeclaration) {
|
||||||
irBody.transformChildrenVoid(object : IrElementTransformerVoid() {
|
irBody.transformChildren(object : IrElementTransformer<IrDeclarationParent?> {
|
||||||
override fun visitFunctionReference(expression: IrFunctionReference): IrExpression {
|
override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclarationParent?) =
|
||||||
expression.transformChildrenVoid()
|
super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data)
|
||||||
|
|
||||||
|
override fun visitFunctionReference(expression: IrFunctionReference, data: IrDeclarationParent?): IrExpression {
|
||||||
|
expression.transformChildren(this, data)
|
||||||
|
|
||||||
val owner = expression.symbol.owner as? IrSimpleFunction
|
val owner = expression.symbol.owner as? IrSimpleFunction
|
||||||
?: return expression
|
?: return expression
|
||||||
@@ -66,7 +69,7 @@ class WrapInlineDeclarationsWithReifiedTypeParametersLowering(val context: Backe
|
|||||||
startOffset = SYNTHETIC_OFFSET
|
startOffset = SYNTHETIC_OFFSET
|
||||||
endOffset = SYNTHETIC_OFFSET
|
endOffset = SYNTHETIC_OFFSET
|
||||||
}.apply {
|
}.apply {
|
||||||
parent = container as IrDeclarationParent
|
parent = data ?: error("Unable to get a proper parent while lower ${expression.render()} at ${container.render()}")
|
||||||
val irBuilder = context.createIrBuilder(symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET)
|
val irBuilder = context.createIrBuilder(symbol, SYNTHETIC_OFFSET, SYNTHETIC_OFFSET)
|
||||||
val forwardExtensionReceiverAsParam = owner.extensionReceiverParameter?.let { extensionReceiver ->
|
val forwardExtensionReceiverAsParam = owner.extensionReceiverParameter?.let { extensionReceiver ->
|
||||||
runIf(expression.extensionReceiver == null) {
|
runIf(expression.extensionReceiver == null) {
|
||||||
@@ -90,6 +93,8 @@ class WrapInlineDeclarationsWithReifiedTypeParametersLowering(val context: Backe
|
|||||||
statements.add(
|
statements.add(
|
||||||
irBuilder.irReturn(
|
irBuilder.irReturn(
|
||||||
irBuilder.irCall(owner.symbol).also { call ->
|
irBuilder.irCall(owner.symbol).also { call ->
|
||||||
|
expression.extensionReceiver?.setDeclarationsParent(this@apply)
|
||||||
|
expression.dispatchReceiver?.setDeclarationsParent(this@apply)
|
||||||
val (extensionReceiver, forwardedParams) = if (forwardExtensionReceiverAsParam) {
|
val (extensionReceiver, forwardedParams) = if (forwardExtensionReceiverAsParam) {
|
||||||
irBuilder.irGet(valueParameters.first()) to valueParameters.subList(1, valueParameters.size)
|
irBuilder.irGet(valueParameters.first()) to valueParameters.subList(1, valueParameters.size)
|
||||||
} else {
|
} else {
|
||||||
@@ -124,6 +129,6 @@ class WrapInlineDeclarationsWithReifiedTypeParametersLowering(val context: Backe
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
}, container as? IrDeclarationParent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user