diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index f899f8bd6e2..f56c63ce151 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -32,7 +32,10 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor; import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityUtilsKt; import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping; import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.psi.*; +import org.jetbrains.kotlin.psi.KtCodeFragment; +import org.jetbrains.kotlin.psi.KtFile; +import org.jetbrains.kotlin.psi.KtFunction; +import org.jetbrains.kotlin.psi.KtSuperTypeListEntry; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -53,8 +56,9 @@ import static org.jetbrains.kotlin.codegen.coroutines.CoroutineCodegenUtilKt.SUS import static org.jetbrains.kotlin.descriptors.ClassKind.ANNOTATION_CLASS; import static org.jetbrains.kotlin.descriptors.ClassKind.INTERFACE; import static org.jetbrains.kotlin.descriptors.Modality.FINAL; -import static org.jetbrains.kotlin.resolve.BindingContext.DELEGATED_PROPERTY_CALL; +import static org.jetbrains.kotlin.resolve.BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject; +import static org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.NO_EXPLICIT_RECEIVER; import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.hasJvmDefaultAnnotation; import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.hasJvmFieldAnnotation; @@ -296,10 +300,16 @@ public class JvmCodegenUtil { ) { VariableAccessorDescriptor getter = descriptor.getGetter(); if (getter != null) { - Call call = bindingContext.get(DELEGATED_PROPERTY_CALL, getter); + ResolvedCall call = bindingContext.get(DELEGATED_PROPERTY_RESOLVED_CALL, getter); if (call != null) { - assert call.getExplicitReceiver() != null : "No explicit receiver for call:" + call; - return ((ReceiverValue) call.getExplicitReceiver()).getType(); + assert call.getExplicitReceiverKind() != NO_EXPLICIT_RECEIVER : "No explicit receiver for call:" + call; + ReceiverValue extensionReceiver = call.getExtensionReceiver(); + if (extensionReceiver != null) return extensionReceiver.getType(); + + ReceiverValue dispatchReceiver = call.getDispatchReceiver(); + if (dispatchReceiver != null) return dispatchReceiver.getType(); + + return null; } } return null; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java index 6ea918ff734..d694904da69 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BindingContext.java @@ -142,6 +142,8 @@ public interface BindingContext { WritableSlice ENCLOSING_SUSPEND_FUNCTION_FOR_SUSPEND_FUNCTION_CALL = Slices.createSimpleSlice(); WritableSlice> DELEGATED_PROPERTY_RESOLVED_CALL = Slices.createSimpleSlice(); + + // Please consider using DELEGATED_PROPERTY_RESOLVED_CALL as it contains fully substituted types WritableSlice DELEGATED_PROPERTY_CALL = Slices.createSimpleSlice(); WritableSlice> PROVIDE_DELEGATE_RESOLVED_CALL = Slices.createSimpleSlice(); WritableSlice PROVIDE_DELEGATE_CALL = Slices.createSimpleSlice();