Debugger: Handle closure receivers came from outer callables properly (KT-31709)
This commit is contained in:
@@ -1118,9 +1118,20 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
||||
|
||||
KotlinType captureReceiver = closure.getCapturedReceiverFromOuterContext();
|
||||
if (captureReceiver != null) {
|
||||
StackValue capturedReceiver =
|
||||
functionReferenceReceiver != null ? functionReferenceReceiver :
|
||||
generateExtensionReceiver(unwrapOriginalReceiverOwnerForSuspendLambda(context));
|
||||
StackValue capturedReceiver = functionReferenceReceiver;
|
||||
if (capturedReceiver == null) {
|
||||
CallableDescriptor descriptor = unwrapOriginalReceiverOwnerForSuspendLambda(context);
|
||||
if (descriptor.getExtensionReceiverParameter() != null) {
|
||||
capturedReceiver = generateExtensionReceiver(descriptor);
|
||||
}
|
||||
}
|
||||
if (capturedReceiver == null) {
|
||||
CallableDescriptor descriptor = closure.getEnclosingCallableDescriptorWithReceiver();
|
||||
if (descriptor != null) {
|
||||
capturedReceiver = generateExtensionReceiver(descriptor);
|
||||
}
|
||||
}
|
||||
assert capturedReceiver != null : "Captured receiver is null for closure " + closure;
|
||||
callGenerator.putCapturedValueOnStack(capturedReceiver, capturedReceiver.type, paramIndex++);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.codegen.context.EnclosedValueDescriptor;
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings;
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||
@@ -52,4 +53,7 @@ public interface CalculatedClosure {
|
||||
boolean isSuspend();
|
||||
|
||||
boolean isSuspendLambda();
|
||||
|
||||
@Nullable
|
||||
CallableDescriptor getEnclosingCallableDescriptorWithReceiver();
|
||||
}
|
||||
|
||||
@@ -92,7 +92,9 @@ public final class MutableClosure implements CalculatedClosure {
|
||||
}
|
||||
|
||||
if (captureEnclosingReceiver) {
|
||||
ReceiverParameterDescriptor parameter = getEnclosingReceiverDescriptor();
|
||||
CallableDescriptor descriptor = getEnclosingCallableDescriptorWithReceiver();
|
||||
assert descriptor != null : "Receiver callable descriptor should exist";
|
||||
ReceiverParameterDescriptor parameter = descriptor.getExtensionReceiverParameter();
|
||||
assert parameter != null : "Receiver parameter should exist in " + enclosingFunWithReceiverDescriptor;
|
||||
return parameter.getType();
|
||||
}
|
||||
@@ -190,7 +192,8 @@ public final class MutableClosure implements CalculatedClosure {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ReceiverParameterDescriptor getEnclosingReceiverDescriptor() {
|
||||
return enclosingFunWithReceiverDescriptor != null ? enclosingFunWithReceiverDescriptor.getExtensionReceiverParameter() : null;
|
||||
@Override
|
||||
public CallableDescriptor getEnclosingCallableDescriptorWithReceiver() {
|
||||
return enclosingFunWithReceiverDescriptor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,7 +138,10 @@ public interface LocalLookup {
|
||||
MutableClosure closure,
|
||||
Type classType
|
||||
) {
|
||||
ReceiverParameterDescriptor enclosingReceiverDescriptor = closure.getEnclosingReceiverDescriptor();
|
||||
CallableDescriptor enclosingCallableWithReceiver = closure.getEnclosingCallableDescriptorWithReceiver();
|
||||
ReceiverParameterDescriptor enclosingReceiverDescriptor =
|
||||
enclosingCallableWithReceiver != null ? enclosingCallableWithReceiver.getExtensionReceiverParameter() : null;
|
||||
|
||||
if (enclosingReceiverDescriptor != d) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user