Change return target in $default function on transformation
This commit is contained in:
+23
-1
@@ -23,6 +23,10 @@ import org.jetbrains.kotlin.ir.IrStatement
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.IrReturn
|
||||||
|
import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
|
|
||||||
internal val staticDefaultFunctionPhase = makeIrFilePhase(
|
internal val staticDefaultFunctionPhase = makeIrFilePhase(
|
||||||
@@ -34,15 +38,33 @@ internal val staticDefaultFunctionPhase = makeIrFilePhase(
|
|||||||
private class StaticDefaultFunctionLowering() : IrElementTransformerVoid(), ClassLoweringPass {
|
private class StaticDefaultFunctionLowering() : IrElementTransformerVoid(), ClassLoweringPass {
|
||||||
constructor(@Suppress("UNUSED_PARAMETER") context: BackendContext) : this()
|
constructor(@Suppress("UNUSED_PARAMETER") context: BackendContext) : this()
|
||||||
|
|
||||||
|
val updatedFunctions = hashMapOf<IrFunctionSymbol, IrFunction>()
|
||||||
|
|
||||||
override fun lower(irClass: IrClass) {
|
override fun lower(irClass: IrClass) {
|
||||||
irClass.accept(this, null)
|
irClass.accept(this, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitFunction(declaration: IrFunction): IrStatement {
|
override fun visitFunction(declaration: IrFunction): IrStatement {
|
||||||
return if (declaration.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER && declaration.dispatchReceiverParameter != null) {
|
return if (declaration.origin == IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER && declaration.dispatchReceiverParameter != null) {
|
||||||
createStaticFunctionWithReceivers(declaration.parent, declaration.name, declaration)
|
return createStaticFunctionWithReceivers(declaration.parent, declaration.name, declaration).also {
|
||||||
|
updatedFunctions[declaration.symbol] = it
|
||||||
|
super.visitFunction(declaration)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
super.visitFunction(declaration)
|
super.visitFunction(declaration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitReturn(expression: IrReturn): IrExpression {
|
||||||
|
return super.visitReturn(
|
||||||
|
if (updatedFunctions.containsKey(expression.returnTargetSymbol)) {
|
||||||
|
with(expression) {
|
||||||
|
val irFunction = updatedFunctions[expression.returnTargetSymbol]!!
|
||||||
|
IrReturnImpl(startOffset, endOffset, expression.type, irFunction.symbol, expression.value)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
expression
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user