IR: allow work with childrenless IR nodes in expression body

This commit is contained in:
Vasily Levchenko
2017-02-15 17:36:13 +03:00
committed by vvlevchenko
parent b5f43d6e6c
commit 75d09e6674
@@ -65,19 +65,10 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D
val builder = context.createIrBuilder(descriptor) val builder = context.createIrBuilder(descriptor)
val body = builder.irBlockBody(irFunction) { val body = builder.irBlockBody(irFunction) {
val params = mutableListOf<VariableDescriptor>() val params = mutableListOf<VariableDescriptor>()
val variables = mutableMapOf<VariableDescriptor, VariableDescriptor>() val variables = mutableMapOf<ValueDescriptor, ValueDescriptor>()
if (descriptor.extensionReceiverParameter != null) {
val newExtensionReceiver = variables[functionDescriptor.extensionReceiverParameter!!] = descriptor.extensionReceiverParameter!!
if (descriptor.extensionReceiverParameter == null) { }
null
} else {
IrGetValueImpl(
startOffset = irFunction.startOffset,
endOffset = irFunction.endOffset,
descriptor = descriptor.extensionReceiverParameter!!,
origin = null
)
}
for (valueParameter in functionDescriptor.valueParameters) { for (valueParameter in functionDescriptor.valueParameters) {
val parameterDescriptor = descriptor.valueParameters[valueParameter.index] val parameterDescriptor = descriptor.valueParameters[valueParameter.index]
@@ -93,14 +84,19 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D
putValueArgument(0, irInt(1 shl valueParameter.index)) putValueArgument(0, irInt(1 shl valueParameter.index))
}, irInt(0)) }, irInt(0))
val expressionBody = getDefaultParameterExpressionBody(irFunction, valueParameter) val expressionBody = getDefaultParameterExpressionBody(irFunction, valueParameter)
/* Use previously calculated values in next expression. */ /* Use previously calculated values in next expression. */
expressionBody.expression.transformChildrenVoid(object:IrElementTransformerVoid() { expressionBody.transformChildrenVoid(object:IrElementTransformerVoid() {
override fun visitGetValue(expression: IrGetValue): IrExpression { override fun visitGetValue(expression: IrGetValue): IrExpression {
if (expression.descriptor == functionDescriptor.extensionReceiverParameter) log("GetValue: ${expression.descriptor}")
return newExtensionReceiver!! val valueDescriptor = variables[expression.descriptor]
if (!variables.containsKey(expression.descriptor)) return when (valueDescriptor) {
return expression is VariableDescriptor -> irGet(valueDescriptor)
return irGet(variables[expression.descriptor] as VariableDescriptor) is ReceiverParameterDescriptor -> irGet(valueDescriptor)
null -> expression
else -> TODO("$valueDescriptor")
}
} }
}) })
/* Mapping calculated values with its origin variables. */ /* Mapping calculated values with its origin variables. */
@@ -133,7 +129,7 @@ class DefaultArgumentStubGenerator internal constructor(val context: Context): D
dispatchReceiver = irThis() dispatchReceiver = irThis()
} }
if (functionDescriptor.extensionReceiverParameter != null) { if (functionDescriptor.extensionReceiverParameter != null) {
extensionReceiver = newExtensionReceiver extensionReceiver = irGet(variables[functionDescriptor.extensionReceiverParameter!!] as ReceiverParameterDescriptor)
} }
params.forEachIndexed { i, variable -> params.forEachIndexed { i, variable ->
putValueArgument(i, irGet(variable)) putValueArgument(i, irGet(variable))
@@ -388,4 +384,6 @@ internal object Helper {
val kConstructorMarkerName = Name.identifier("__\$marker\$__") val kConstructorMarkerName = Name.identifier("__\$marker\$__")
val kDefaultArgumentMarkerClassDescriptor = DescriptorUtils.getAllDescriptors(kKonanInternalPackageDescriptor.memberScope) val kDefaultArgumentMarkerClassDescriptor = DescriptorUtils.getAllDescriptors(kKonanInternalPackageDescriptor.memberScope)
.first{ it is ClassDescriptor && it.name == kDefaultArgumentMarkerName} as ClassDescriptor .first{ it is ClassDescriptor && it.name == kDefaultArgumentMarkerName} as ClassDescriptor
} }
internal fun IrBuilderWithScope.irGet(descriptor: ReceiverParameterDescriptor):IrGetValue = IrGetValueImpl(startOffset, endOffset, descriptor)