Reuse implicitCastIfNeededTo function in FunctionInlining

This commit is contained in:
Ivan Kylchik
2023-03-14 11:44:54 +01:00
committed by Space Team
parent 49fdfc2992
commit f8deae4570
@@ -242,11 +242,7 @@ class FunctionInlining(
expression.transformChildrenVoid(this) expression.transformChildrenVoid(this)
if (expression.returnTargetSymbol == copiedCallee.symbol) { if (expression.returnTargetSymbol == copiedCallee.symbol) {
val expr = val expr = expression.value.doImplicitCastIfNeededTo(callSite.type)
if (insertAdditionalImplicitCasts)
expression.value.implicitCastIfNeededTo(callSite.type)
else
expression.value
return irBuilder.at(expression).irReturn(expr) return irBuilder.at(expression).irReturn(expr)
} }
return expression return expression
@@ -265,15 +261,13 @@ class FunctionInlining(
argument.transformChildrenVoid(this) // Default argument can contain subjects for substitution. argument.transformChildrenVoid(this) // Default argument can contain subjects for substitution.
var ret = val ret =
if (argument is IrGetValueWithoutLocation) if (argument is IrGetValueWithoutLocation)
argument.withLocation(newExpression.startOffset, newExpression.endOffset) argument.withLocation(newExpression.startOffset, newExpression.endOffset)
else else
argument.copy() argument.copy()
if (insertAdditionalImplicitCasts) return ret.doImplicitCastIfNeededTo(newExpression.type)
ret = ret.implicitCastIfNeededTo(newExpression.type)
return ret
} }
override fun visitCall(expression: IrCall): IrExpression { override fun visitCall(expression: IrCall): IrExpression {
@@ -470,15 +464,15 @@ class FunctionInlining(
} }
when (parameter) { when (parameter) {
function.dispatchReceiverParameter -> function.dispatchReceiverParameter ->
this.dispatchReceiver = argument.implicitCastIfNeededTo(inlinedFunction.dispatchReceiverParameter!!.type) this.dispatchReceiver = argument.doImplicitCastIfNeededTo(inlinedFunction.dispatchReceiverParameter!!.type)
function.extensionReceiverParameter -> function.extensionReceiverParameter ->
this.extensionReceiver = argument.implicitCastIfNeededTo(inlinedFunction.extensionReceiverParameter!!.type) this.extensionReceiver = argument.doImplicitCastIfNeededTo(inlinedFunction.extensionReceiverParameter!!.type)
else -> else ->
putValueArgument( putValueArgument(
parameter.index, parameter.index,
argument.implicitCastIfNeededTo(inlinedFunction.valueParameters[parameter.index].type) argument.doImplicitCastIfNeededTo(inlinedFunction.valueParameters[parameter.index].type)
) )
} }
} }
@@ -492,18 +486,15 @@ class FunctionInlining(
} else { } else {
val transformedExpression = super.visitExpression(immediateCall).transform(this@FunctionInlining, null) val transformedExpression = super.visitExpression(immediateCall).transform(this@FunctionInlining, null)
wrapInStubFunction(transformedExpression, irCall, irFunctionReference) wrapInStubFunction(transformedExpression, irCall, irFunctionReference)
}.implicitCastIfNeededTo(irCall.type) }.doImplicitCastIfNeededTo(irCall.type)
} }
override fun visitElement(element: IrElement) = element.accept(this, null) override fun visitElement(element: IrElement) = element.accept(this, null)
} }
private fun IrExpression.implicitCastIfNeededTo(type: IrType): IrExpression { private fun IrExpression.doImplicitCastIfNeededTo(type: IrType): IrExpression {
// No need to cast expressions of type nothing if (!insertAdditionalImplicitCasts) return this
return if (type == this.type || !insertAdditionalImplicitCasts || this.type == context.irBuiltIns.nothingType) return this.implicitCastIfNeededTo(type)
this
else
IrTypeOperatorCallImpl(startOffset, endOffset, type, IrTypeOperator.IMPLICIT_CAST, type, this)
} }
// With `insertAdditionalImplicitCasts` flag we sometimes insert // With `insertAdditionalImplicitCasts` flag we sometimes insert