[PSI, FE, PSI2IR] Use labels for referencing specific receiver
This commit is contained in:
committed by
TeamCityServer
parent
aaabf5e1ca
commit
1bcaeabd84
+4
-4
@@ -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 {
|
||||
|
||||
+8
-4
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user