Skip to content

Commit dc1d928

Browse files
committed
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).
1 parent c92f118 commit dc1d928

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegationResolver.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,14 @@ class DelegationResolver<T : CallableMemberDescriptor> private constructor(
7070
getDelegatableMembers(delegatedInterfaceType).map { memberDescriptor ->
7171
val newModality = if (memberDescriptor.modality == Modality.ABSTRACT) Modality.OPEN else memberDescriptor.modality
7272
@Suppress("UNCHECKED_CAST")
73-
(memberDescriptor.copy(ownerDescriptor, newModality, Visibilities.INHERITED, DELEGATION, false) as T)
73+
memberDescriptor.newCopyBuilder()
74+
.setOwner(ownerDescriptor)
75+
.setDispatchReceiverParameter(ownerDescriptor.thisAsReceiverParameter)
76+
.setModality(newModality)
77+
.setVisibility(Visibilities.INHERITED)
78+
.setKind(DELEGATION)
79+
.setCopyOverrides(false)
80+
.build() as T
7481
}
7582

7683
private fun checkClashWithOtherDelegatedMember(candidate: T, delegatedMembers: Collection<T>): Boolean {

compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,14 @@ class ClassGenerator(val declarationGenerator: DeclarationGenerator) : Generator
168168
private fun generateDelegateFunctionBody(irDelegate: IrFieldImpl, delegated: FunctionDescriptor, overridden: FunctionDescriptor): IrBlockBodyImpl {
169169
val startOffset = irDelegate.startOffset
170170
val endOffset = irDelegate.endOffset
171-
val classOwner = delegated.containingDeclaration.assertedCast<ClassDescriptor> { "Class member expected: $delegated" }
171+
val dispatchReceiver = delegated.dispatchReceiverParameter ?:
172+
throw AssertionError("Delegated member should have a dispatch receiver: $delegated")
172173

173174
val irBlockBody = IrBlockBodyImpl(startOffset, endOffset)
174175
val returnType = overridden.returnType!!
175176
val irCall = IrCallImpl(startOffset, endOffset, returnType, overridden, null)
176177
irCall.dispatchReceiver = IrGetFieldImpl(startOffset, endOffset, irDelegate.descriptor,
177-
IrGetValueImpl(startOffset, endOffset, classOwner.thisAsReceiverParameter)
178+
IrGetValueImpl(startOffset, endOffset, dispatchReceiver)
178179
)
179180
irCall.extensionReceiver = delegated.extensionReceiverParameter?.let { extensionReceiver ->
180181
IrGetValueImpl(startOffset, endOffset, extensionReceiver)

0 commit comments

Comments
 (0)