Minor, beautify code in StackValue.CallReceiver
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user