PSI2IR: KT-40499 Fix delegated property desugaring
No type arguments were provided for property reference inside delegated property accessors.
This commit is contained in:
+18
-19
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user