Minor, beautify code in StackValue.CallReceiver

This commit is contained in:
Alexander Udalov
2014-07-09 20:38:23 +04:00
parent f1b199f6c4
commit 242376550c
@@ -17,6 +17,7 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod; import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
@@ -337,6 +338,7 @@ public abstract class StackValue {
return receiver; return receiver;
} }
@Contract("null -> false")
private static boolean isLocalFunCall(@Nullable CallableMethod callableMethod) { private static boolean isLocalFunCall(@Nullable CallableMethod callableMethod) {
return callableMethod != null && callableMethod.getGenerateCalleeType() != null; return callableMethod != null && callableMethod.getGenerateCalleeType() != null;
} }
@@ -1078,19 +1080,19 @@ public abstract class StackValue {
public static class CallReceiver extends StackValue { public static class CallReceiver extends StackValue {
private final ResolvedCall<?> resolvedCall; private final ResolvedCall<?> resolvedCall;
final StackValue receiver; private final StackValue receiver;
private final ExpressionCodegen codegen; private final ExpressionCodegen codegen;
private final CallableMethod callableMethod; private final CallableMethod callableMethod;
private final boolean putReceiverArgumentOnStack; private final boolean putReceiverArgumentOnStack;
public CallReceiver( public CallReceiver(
ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
StackValue receiver, @NotNull StackValue receiver,
ExpressionCodegen codegen, @NotNull ExpressionCodegen codegen,
CallableMethod callableMethod, @Nullable CallableMethod callableMethod,
boolean putReceiverArgumentOnStack boolean putReceiverArgumentOnStack
) { ) {
super(calcType(resolvedCall, codegen, callableMethod)); super(calcType(resolvedCall, codegen.typeMapper, callableMethod));
this.resolvedCall = resolvedCall; this.resolvedCall = resolvedCall;
this.receiver = receiver; this.receiver = receiver;
this.codegen = codegen; this.codegen = codegen;
@@ -1098,33 +1100,27 @@ public abstract class StackValue {
this.putReceiverArgumentOnStack = putReceiverArgumentOnStack; this.putReceiverArgumentOnStack = putReceiverArgumentOnStack;
} }
private static Type calcType(ResolvedCall<?> resolvedCall, ExpressionCodegen codegen, CallableMethod callableMethod) { private static Type calcType(
ReceiverValue thisObject = resolvedCall.getThisObject(); @NotNull ResolvedCall<?> resolvedCall,
ReceiverValue receiverArgument = resolvedCall.getReceiverArgument(); @NotNull JetTypeMapper typeMapper,
@Nullable CallableMethod callableMethod
) {
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
if (receiverArgument.exists()) { ReceiverParameterDescriptor expectedThisObject = descriptor.getExpectedThisObject();
if (callableMethod != null) { ReceiverParameterDescriptor receiverParameter = descriptor.getReceiverParameter();
return callableMethod.getReceiverClass();
} if (receiverParameter != null) {
else { return callableMethod != null ? callableMethod.getReceiverClass() : typeMapper.mapType(receiverParameter.getType());
return codegen.typeMapper.mapType(descriptor.getReceiverParameter().getType()); }
} else if (expectedThisObject != null) {
} else if (thisObject.exists()) { return callableMethod != null ? callableMethod.getThisType() : typeMapper.mapType(expectedThisObject.getType());
if (callableMethod != null) {
return callableMethod.getThisType();
}
else {
return codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType());
}
} }
else if (isLocalFunCall(callableMethod)) { else if (isLocalFunCall(callableMethod)) {
return callableMethod.getGenerateCalleeType(); return callableMethod.getGenerateCalleeType();
} }
else {
return Type.VOID_TYPE; return Type.VOID_TYPE;
}
} }
@Override @Override
@@ -1136,8 +1132,11 @@ public abstract class StackValue {
int depth; int depth;
if (thisObject.exists()) { if (thisObject.exists()) {
if (receiverArgument.exists()) { if (receiverArgument.exists()) {
Type resultType = callableMethod != null ? callableMethod.getOwner() : codegen.typeMapper //noinspection ConstantConditions
.mapType(descriptor.getExpectedThisObject().getType()); Type resultType =
callableMethod != null ?
callableMethod.getOwner() :
codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType());
codegen.generateFromResolvedCall(thisObject, resultType); codegen.generateFromResolvedCall(thisObject, resultType);
} }
@@ -1146,8 +1145,10 @@ public abstract class StackValue {
} }
depth = 1; depth = 1;
} else if (isLocalFunCall(callableMethod)) { }
assert receiver == none() || receiverArgument.exists(): "Receiver should be present only for local extension function: " + callableMethod; else if (isLocalFunCall(callableMethod)) {
assert receiver == none() || receiverArgument.exists() :
"Receiver should be present only for local extension function: " + callableMethod;
StackValue value = codegen.findLocalOrCapturedValue(descriptor.getOriginal()); StackValue value = codegen.findLocalOrCapturedValue(descriptor.getOriginal());
assert value != null : "Local fun should be found in locals or in captured params: " + resolvedCall; assert value != null : "Local fun should be found in locals or in captured params: " + resolvedCall;
value.put(callableMethod.getGenerateCalleeType(), v); value.put(callableMethod.getGenerateCalleeType(), v);
@@ -1164,8 +1165,11 @@ public abstract class StackValue {
} }
private void genReceiver( private void genReceiver(
InstructionAdapter v, ReceiverValue receiverArgument, Type type, @NotNull InstructionAdapter v,
@Nullable ReceiverParameterDescriptor receiverParameter, int depth @NotNull ReceiverValue receiverArgument,
@NotNull Type type,
@Nullable ReceiverParameterDescriptor receiverParameter,
int depth
) { ) {
if (receiver == StackValue.none()) { if (receiver == StackValue.none()) {
if (receiverParameter != null) { if (receiverParameter != null) {