From dc1d92855da8830e1676e4f1efa23757fc8feaea Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 1 Mar 2017 15:47:29 +0300 Subject: [PATCH] KT-16438 Strange dispatch receiver for descriptors of delegated members Provide proper dispatch receiver parameter for delegated members. Use dispatch receiver parameter for delegated members in IR generation for delegated member body (and check that the receiver has corresponding type). --- .../org/jetbrains/kotlin/resolve/DelegationResolver.kt | 9 ++++++++- .../jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt | 5 +++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt index 78915ba888a..e9edba8397b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt @@ -70,7 +70,14 @@ class DelegationResolver private constructor( getDelegatableMembers(delegatedInterfaceType).map { memberDescriptor -> val newModality = if (memberDescriptor.modality == Modality.ABSTRACT) Modality.OPEN else memberDescriptor.modality @Suppress("UNCHECKED_CAST") - (memberDescriptor.copy(ownerDescriptor, newModality, Visibilities.INHERITED, DELEGATION, false) as T) + memberDescriptor.newCopyBuilder() + .setOwner(ownerDescriptor) + .setDispatchReceiverParameter(ownerDescriptor.thisAsReceiverParameter) + .setModality(newModality) + .setVisibility(Visibilities.INHERITED) + .setKind(DELEGATION) + .setCopyOverrides(false) + .build() as T } private fun checkClashWithOtherDelegatedMember(candidate: T, delegatedMembers: Collection): Boolean { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 08d09eb2d9e..223c7f8d629 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -168,13 +168,14 @@ class ClassGenerator(val declarationGenerator: DeclarationGenerator) : Generator private fun generateDelegateFunctionBody(irDelegate: IrFieldImpl, delegated: FunctionDescriptor, overridden: FunctionDescriptor): IrBlockBodyImpl { val startOffset = irDelegate.startOffset val endOffset = irDelegate.endOffset - val classOwner = delegated.containingDeclaration.assertedCast { "Class member expected: $delegated" } + val dispatchReceiver = delegated.dispatchReceiverParameter ?: + throw AssertionError("Delegated member should have a dispatch receiver: $delegated") val irBlockBody = IrBlockBodyImpl(startOffset, endOffset) val returnType = overridden.returnType!! val irCall = IrCallImpl(startOffset, endOffset, returnType, overridden, null) irCall.dispatchReceiver = IrGetFieldImpl(startOffset, endOffset, irDelegate.descriptor, - IrGetValueImpl(startOffset, endOffset, classOwner.thisAsReceiverParameter) + IrGetValueImpl(startOffset, endOffset, dispatchReceiver) ) irCall.extensionReceiver = delegated.extensionReceiverParameter?.let { extensionReceiver -> IrGetValueImpl(startOffset, endOffset, extensionReceiver)