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:
Svyatoslav Scherbina
2017-01-23 13:21:06 +07:00
committed by SvyatoslavScherbina
parent 8ca5d08e8e
commit 3aa48b7e0c
2 changed files with 26 additions and 7 deletions
@@ -37,6 +37,15 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
protected open fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression =
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 =
this.useAsValue(variable)
@@ -55,12 +64,12 @@ abstract class AbstractValueUsageTransformer(val builtIns: KotlinBuiltIns): IrEl
expression.transformChildrenVoid(this)
with(expression) {
dispatchReceiver = dispatchReceiver?.useAsArgument(descriptor.dispatchReceiverParameter!!)
extensionReceiver = extensionReceiver?.useAsArgument(descriptor.extensionReceiverParameter!!)
dispatchReceiver = dispatchReceiver?.useAsDispatchReceiver(descriptor)
extensionReceiver = extensionReceiver?.useAsExtensionReceiver(descriptor)
for (index in descriptor.valueParameters.indices) {
val argument = getValueArgument(index) ?: continue
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 ->
val defaultValue = declaration.getDefault(parameter)
if (defaultValue is IrExpressionBody) {
defaultValue.expression = defaultValue.expression.useAsArgument(parameter)
defaultValue.expression = defaultValue.expression.useAsValueArgument(parameter)
}
}
@@ -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.getKonanInternalFunctions
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.ValueParameterDescriptor
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
@@ -128,8 +129,17 @@ private class AutoboxingTransformer(val context: Context) : AbstractValueUsageTr
return this.adaptIfNecessary(actualType, type)
}
override fun IrExpression.useAsArgument(parameter: ParameterDescriptor): IrExpression {
return this.useAsValue(parameter.original)
override fun IrExpression.useAsDispatchReceiver(function: CallableDescriptor): IrExpression {
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 {