IR: allow work with childrenless IR nodes in expression body
This commit is contained in:
committed by
vvlevchenko
parent
b5f43d6e6c
commit
75d09e6674
+18
-20
@@ -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))
|
||||||
@@ -389,3 +385,5 @@ internal object Helper {
|
|||||||
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)
|
||||||
Reference in New Issue
Block a user