From 656cc16a810fca264020bdb24e79fb742b00a48e Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 10 Dec 2013 13:46:23 +0400 Subject: [PATCH] fixed: explicit receiver kind for resolved call shouldn't be used as expected receiver kind for function --- .../jet/codegen/ExpressionCodegen.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 54ee0f01032..1f1ab378e31 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -75,8 +75,6 @@ import static org.jetbrains.jet.codegen.FunctionTypesUtil.getFunctionImplType; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.getNotNull; -import static org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind.RECEIVER_ARGUMENT; -import static org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind.THIS_OBJECT; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue.NO_RECEIVER; @@ -2487,20 +2485,21 @@ public class ExpressionCodegen extends JetVisitor implem JetCallExpression fakeExpression = constructFakeFunctionCall(referencedFunction); final List fakeArguments = fakeExpression.getValueArguments(); - final ReceiverValue receiverValue = computeAndSaveReceiver(signature, codegen); + final ReceiverValue thisObject = computeAndSaveReceiver(signature, codegen, referencedFunction.getExpectedThisObject()); + final ReceiverValue extensionReceiver = computeAndSaveReceiver(signature, codegen, referencedFunction.getReceiverParameter()); computeAndSaveArguments(codegen.myFrameMap, fakeArguments, codegen); ResolvedCall fakeResolvedCall = new DelegatingResolvedCall(resolvedCall) { @NotNull @Override public ReceiverValue getReceiverArgument() { - return resolvedCall.getExplicitReceiverKind() == RECEIVER_ARGUMENT ? receiverValue : NO_RECEIVER; + return extensionReceiver; } @NotNull @Override public ReceiverValue getThisObject() { - return resolvedCall.getExplicitReceiverKind() == THIS_OBJECT ? receiverValue : NO_RECEIVER; + return thisObject; } @NotNull @@ -2565,19 +2564,12 @@ public class ExpressionCodegen extends JetVisitor implem } @NotNull - private ReceiverValue computeAndSaveReceiver(@NotNull JvmMethodSignature signature, @NotNull ExpressionCodegen codegen) { - CallableDescriptor referencedFunction = resolvedCall.getCandidateDescriptor(); - - ReceiverParameterDescriptor receiverParameter = referencedFunction.getReceiverParameter(); - ReceiverParameterDescriptor expectedThisObject = referencedFunction.getExpectedThisObject(); - assert receiverParameter == null || expectedThisObject == null : - "Extensions in classes can't be referenced via callable reference expressions: " + referencedFunction; - - ReceiverParameterDescriptor receiver = receiverParameter != null ? receiverParameter : expectedThisObject; - - if (receiver == null) { - return NO_RECEIVER; - } + private ReceiverValue computeAndSaveReceiver( + @NotNull JvmMethodSignature signature, + @NotNull ExpressionCodegen codegen, + @Nullable ReceiverParameterDescriptor receiver + ) { + if (receiver == null) return NO_RECEIVER; JetExpression receiverExpression = JetPsiFactory.createExpression(state.getProject(), "callableReferenceFakeReceiver");