PSI2IR: KT-40499 Fix delegated property desugaring

No type arguments were provided for property reference inside delegated
property accessors.
This commit is contained in:
Dmitry Petrov
2020-07-30 13:18:36 +03:00
parent bff36e0199
commit 46fccae7d1
8 changed files with 200 additions and 19 deletions
@@ -62,6 +62,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
val irDelegate = irProperty.backingField!!
val propertyTypeArguments = propertyDescriptor.typeParameters.associateWith { it.defaultType }
val thisClass = propertyDescriptor.containingDeclaration as? ClassDescriptor
val delegateReceiverValue = createBackingFieldValueForDelegate(irDelegate.symbol, thisClass, ktDelegate, propertyDescriptor)
val getterDescriptor = propertyDescriptor.getter!!
@@ -69,7 +70,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
generateDelegatedPropertyGetterBody(
irGetter,
ktDelegate, getterDescriptor, delegateReceiverValue,
createCallableReference(ktDelegate, kPropertyType, propertyDescriptor, irGetter.symbol)
createPropertyReference(ktDelegate, kPropertyType, propertyDescriptor, irGetter.symbol, propertyTypeArguments)
)
}
@@ -79,7 +80,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
generateDelegatedPropertySetterBody(
irSetter,
ktDelegate, setterDescriptor, delegateReceiverValue,
createCallableReference(ktDelegate, kPropertyType, propertyDescriptor, irSetter.symbol)
createPropertyReference(ktDelegate, kPropertyType, propertyDescriptor, irSetter.symbol, propertyTypeArguments)
)
}
}
@@ -161,7 +162,12 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
val statementGenerator = createBodyGenerator(scopeOwner).createStatementGenerator()
val provideDelegateCall = statementGenerator.pregenerateCall(provideDelegateResolvedCall)
provideDelegateCall.setExplicitReceiverValue(OnceExpressionValue(irDelegateInitializer.expression))
provideDelegateCall.irValueArgumentsByIndex[1] = createCallableReference(ktDelegate, kPropertyType, property, scopeOwner)
provideDelegateCall.irValueArgumentsByIndex[1] =
createPropertyReference(
ktDelegate, kPropertyType, property, scopeOwner,
null // we don't know type arguments at this time; see also KT-24643.
)
val irProvideDelegate = CallGenerator(statementGenerator).generateCall(
ktDelegate.startOffsetSkippingComments, ktDelegate.endOffset, provideDelegateCall
)
@@ -200,27 +206,20 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
}
}
private fun createCallableReference(
ktElement: KtElement,
type: KotlinType,
referencedDescriptor: CallableDescriptor,
statementGenerator: StatementGenerator
): IrCallableReference<*> =
ReflectionReferencesGenerator(statementGenerator).generateCallableReference(
ktElement, type,
referencedDescriptor,
null, IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE
)
private fun createCallableReference(
private fun createPropertyReference(
ktElement: KtElement,
type: KotlinType,
referencedDescriptor: VariableDescriptorWithAccessors,
scopeOwner: IrSymbol
scopeOwner: IrSymbol,
typeArguments: Map<TypeParameterDescriptor, KotlinType>?
): IrCallableReference<*> =
createCallableReference(
ktElement, type, referencedDescriptor,
ReflectionReferencesGenerator(
createBodyGenerator(scopeOwner).createStatementGenerator()
).generateCallableReference(
ktElement, type,
referencedDescriptor,
typeArguments,
IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE
)
private fun createLocalDelegatedPropertyReference(