[PSI2IR] Generate delegating constructor call correctly
This commit is contained in:
committed by
TeamCityServer
parent
af78ec7371
commit
8ec418e90f
+29
-1
@@ -61,6 +61,34 @@ import kotlin.math.min
|
|||||||
fun StatementGenerator.generateReceiverOrNull(ktDefaultElement: KtElement, receiver: ReceiverValue?): IntermediateValue? =
|
fun StatementGenerator.generateReceiverOrNull(ktDefaultElement: KtElement, receiver: ReceiverValue?): IntermediateValue? =
|
||||||
receiver?.let { generateReceiver(ktDefaultElement, receiver) }
|
receiver?.let { generateReceiver(ktDefaultElement, receiver) }
|
||||||
|
|
||||||
|
fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
|
||||||
|
ktDefaultElement: KtElement,
|
||||||
|
receiver: ContextClassReceiver?
|
||||||
|
): IntermediateValue? =
|
||||||
|
receiver?.let {
|
||||||
|
generateContextReceiverForDelegatingConstructorCall(
|
||||||
|
ktDefaultElement.startOffsetSkippingComments,
|
||||||
|
ktDefaultElement.endOffset,
|
||||||
|
receiver
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
|
||||||
|
defaultStartOffset: Int,
|
||||||
|
defaultEndOffset: Int,
|
||||||
|
receiver: ContextClassReceiver
|
||||||
|
): IntermediateValue {
|
||||||
|
val irReceiverType = receiver.type.toIrType()
|
||||||
|
val contextReceivers = receiver.classDescriptor.contextReceivers
|
||||||
|
val receiverParameter = contextReceivers.single { it.value == receiver }
|
||||||
|
return object : ExpressionValue(irReceiverType) {
|
||||||
|
override fun load(): IrExpression = IrGetValueImpl(
|
||||||
|
defaultStartOffset, defaultEndOffset, irReceiverType,
|
||||||
|
context.symbolTable.referenceValueParameter(receiverParameter)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun StatementGenerator.generateReceiver(ktDefaultElement: KtElement, receiver: ReceiverValue): IntermediateValue =
|
fun StatementGenerator.generateReceiver(ktDefaultElement: KtElement, receiver: ReceiverValue): IntermediateValue =
|
||||||
generateReceiver(ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset, receiver)
|
generateReceiver(ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset, receiver)
|
||||||
|
|
||||||
@@ -226,7 +254,7 @@ fun StatementGenerator.generateCallReceiver(
|
|||||||
dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver)
|
dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver)
|
||||||
extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver)
|
extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver)
|
||||||
contextReceiverValues = if (ktDefaultElement is KtConstructorDelegationCall) contextReceivers.mapNotNull {
|
contextReceiverValues = if (ktDefaultElement is KtConstructorDelegationCall) contextReceivers.mapNotNull {
|
||||||
generateReceiverOrNull(ktDefaultElement, it as ContextClassReceiver)
|
generateContextReceiverForDelegatingConstructorCall(ktDefaultElement, it as ContextClassReceiver)
|
||||||
}
|
}
|
||||||
else contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) }
|
else contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -288,6 +288,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
|||||||
)
|
)
|
||||||
}.apply {
|
}.apply {
|
||||||
metadata = DescriptorMetadataSource.Function(it.descriptor)
|
metadata = DescriptorMetadataSource.Function(it.descriptor)
|
||||||
|
contextReceiverParametersCount = ktContextReceiversElements.size
|
||||||
}
|
}
|
||||||
}.buildWithScope { irConstructor ->
|
}.buildWithScope { irConstructor ->
|
||||||
generateValueParameterDeclarations(irConstructor, ktParametersElement, null, ktContextReceiversElements)
|
generateValueParameterDeclarations(irConstructor, ktParametersElement, null, ktContextReceiversElements)
|
||||||
|
|||||||
Reference in New Issue
Block a user