Reuse implicitCastIfNeededTo function in FunctionInlining
This commit is contained in:
+10
-19
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user