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)