backend: do not rely on parameter.original in autoboxing
`function.parameter.original` sometimes turns out to be not the same as `function.original.parameter`.
This commit is contained in:
committed by
SvyatoslavScherbina
parent
8ca5d08e8e
commit
3aa48b7e0c
+13
-4
@@ -37,6 +37,15 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
|
|||||||
protected open fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression =
|
protected open fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression =
|
||||||
this.useAsValue(parameter)
|
this.useAsValue(parameter)
|
||||||
|
|
||||||
|
protected open fun IrExpression.useAsDispatchReceiver(function: CallableDescriptor): IrExpression =
|
||||||
|
this.useAsArgument(function.dispatchReceiverParameter!!)
|
||||||
|
|
||||||
|
protected open fun IrExpression.useAsExtensionReceiver(function: CallableDescriptor): IrExpression =
|
||||||
|
this.useAsArgument(function.extensionReceiverParameter!!)
|
||||||
|
|
||||||
|
protected open fun IrExpression.useAsValueArgument(parameter: ValueParameterDescriptor): IrExpression =
|
||||||
|
this.useAsArgument(parameter)
|
||||||
|
|
||||||
protected open fun IrExpression.useForVariable(variable: VariableDescriptor): IrExpression =
|
protected open fun IrExpression.useForVariable(variable: VariableDescriptor): IrExpression =
|
||||||
this.useAsValue(variable)
|
this.useAsValue(variable)
|
||||||
|
|
||||||
@@ -55,12 +64,12 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
|
|||||||
expression.transformChildrenVoid(this)
|
expression.transformChildrenVoid(this)
|
||||||
|
|
||||||
with(expression) {
|
with(expression) {
|
||||||
dispatchReceiver = dispatchReceiver?.useAsArgument(descriptor.dispatchReceiverParameter!!)
|
dispatchReceiver = dispatchReceiver?.useAsDispatchReceiver(descriptor)
|
||||||
extensionReceiver = extensionReceiver?.useAsArgument(descriptor.extensionReceiverParameter!!)
|
extensionReceiver = extensionReceiver?.useAsExtensionReceiver(descriptor)
|
||||||
for (index in descriptor.valueParameters.indices) {
|
for (index in descriptor.valueParameters.indices) {
|
||||||
val argument = getValueArgument(index) ?: continue
|
val argument = getValueArgument(index) ?: continue
|
||||||
val parameter = descriptor.valueParameters[index]
|
val parameter = descriptor.valueParameters[index]
|
||||||
putValueArgument(index, argument.useAsArgument(parameter))
|
putValueArgument(index, argument.useAsValueArgument(parameter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,7 +223,7 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
|
|||||||
declaration.descriptor.valueParameters.forEach { parameter ->
|
declaration.descriptor.valueParameters.forEach { parameter ->
|
||||||
val defaultValue = declaration.getDefault(parameter)
|
val defaultValue = declaration.getDefault(parameter)
|
||||||
if (defaultValue is IrExpressionBody) {
|
if (defaultValue is IrExpressionBody) {
|
||||||
defaultValue.expression = defaultValue.expression.useAsArgument(parameter)
|
defaultValue.expression = defaultValue.expression.useAsValueArgument(parameter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+13
-3
@@ -6,8 +6,9 @@ import org.jetbrains.kotlin.backend.konan.Context
|
|||||||
import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalClass
|
import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalClass
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalFunctions
|
import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalFunctions
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.unboundCallableReferenceTypeOrNull
|
import org.jetbrains.kotlin.backend.konan.descriptors.unboundCallableReferenceTypeOrNull
|
||||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
||||||
@@ -128,8 +129,17 @@ private class AutoboxingTransformer(val context: Context) : AbstractValueUsageTr
|
|||||||
return this.adaptIfNecessary(actualType, type)
|
return this.adaptIfNecessary(actualType, type)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression {
|
override fun IrExpression.useAsDispatchReceiver(function: CallableDescriptor): IrExpression {
|
||||||
return this.useAsValue(parameter.original)
|
return this.useAsArgument(function.original.dispatchReceiverParameter!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun IrExpression.useAsExtensionReceiver(function: CallableDescriptor): IrExpression {
|
||||||
|
return this.useAsArgument(function.original.extensionReceiverParameter!!)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun IrExpression.useAsValueArgument(parameter: ValueParameterDescriptor): IrExpression {
|
||||||
|
val function = parameter.containingDeclaration
|
||||||
|
return this.useAsArgument(function.original.valueParameters[parameter.index])
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun IrExpression.useForField(field: PropertyDescriptor): IrExpression {
|
override fun IrExpression.useForField(field: PropertyDescriptor): IrExpression {
|
||||||
|
|||||||
Reference in New Issue
Block a user