[PSI, FE, PSI2IR] Use labels for referencing specific receiver

This commit is contained in:
Anastasiya Shadrina
2021-01-18 19:47:07 +07:00
committed by TeamCityServer
parent aaabf5e1ca
commit 1bcaeabd84
54 changed files with 744 additions and 134 deletions
@@ -50,7 +50,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
declareSimpleFunction(
ktFunction,
ktFunction.receiverTypeReference,
ktFunction.contextReceiverTypeReferences,
ktFunction.contextReceivers.mapNotNull { it.typeReference() },
origin,
getOrFail(BindingContext.FUNCTION, ktFunction)
) {
@@ -127,7 +127,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
irAccessor.returnType = irAccessor.descriptor.returnType!!.toIrType()
generateValueParameterDeclarations(
irAccessor, ktAccessor ?: ktProperty, ktProperty.receiverTypeReference,
ktProperty.contextReceiverTypeReferences
ktProperty.contextReceivers.mapNotNull { it.typeReference() }
)
val ktBodyExpression = ktAccessor?.bodyExpression
irAccessor.body =
@@ -237,7 +237,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
declareConstructor(
ktClassOrObject,
ktClassOrObject.primaryConstructor ?: ktClassOrObject,
ktClassOrObject.contextReceiverTypeReferences,
ktClassOrObject.contextReceivers.mapNotNull { it.typeReference() },
primaryConstructorDescriptor
) { irConstructor ->
if (
@@ -254,7 +254,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
return declareConstructor(
ktConstructor,
ktConstructor,
ktClassOrObject.contextReceiverTypeReferences,
ktClassOrObject.contextReceivers.mapNotNull { it.typeReference() },
constructorDescriptor
) {
when {
@@ -422,12 +422,16 @@ class StatementGenerator(
generateThisReceiver(startOffset, endOffset, referenceTarget.thisAsReceiverParameter.type, referenceTarget)
is CallableDescriptor -> {
val extensionReceiver = referenceTarget.extensionReceiverParameter ?: TODO("No extension receiver: $referenceTarget")
val extensionReceiverType = extensionReceiver.type.toIrType()
val resolvedCall = getResolvedCall(expression)
val receivers = listOfNotNull(referenceTarget.extensionReceiverParameter) + referenceTarget.contextReceiverParameters
val receiver = receivers.find {
it == resolvedCall?.candidateDescriptor
} ?: referenceTarget.extensionReceiverParameter ?: TODO("No receiver: $referenceTarget")
val receiverType = receiver.type.toIrType()
IrGetValueImpl(
startOffset, endOffset,
extensionReceiverType,
context.symbolTable.referenceValueParameter(extensionReceiver)
receiverType,
context.symbolTable.referenceValueParameter(receiver)
)
}