Refactor and rename ExpressionCodegen#generateFromResolvedCall

This commit is contained in:
Alexander Udalov
2014-07-09 22:42:19 +04:00
parent c0d9bfe89f
commit 315b68ce56
2 changed files with 29 additions and 34 deletions
@@ -77,7 +77,8 @@ import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.JvmCodegenUtil.*; import static org.jetbrains.jet.codegen.JvmCodegenUtil.*;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.resolve.BindingContext.*;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.*; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.getNotNull;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.isVarCapturedInClosure;
import static org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage.*; import static org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage.*;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*;
import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass;
@@ -2167,41 +2168,36 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
(CallableMemberDescriptor) descriptor.getOriginal()), callElement); (CallableMemberDescriptor) descriptor.getOriginal()), callElement);
} }
public void generateFromResolvedCall(@NotNull ReceiverValue descriptor, @NotNull Type type) { public void generateReceiverValue(@NotNull ReceiverValue receiverValue, @NotNull Type type) {
if (descriptor instanceof ClassReceiver) { if (receiverValue instanceof ClassReceiver) {
Type exprType = asmType(descriptor.getType()); ClassDescriptor receiverDescriptor = ((ClassReceiver) receiverValue).getDeclarationDescriptor();
ClassReceiver classReceiver = (ClassReceiver) descriptor; if (DescriptorUtils.isClassObject(receiverDescriptor)) {
ClassDescriptor classReceiverDeclarationDescriptor = classReceiver.getDeclarationDescriptor(); CallableMemberDescriptor contextDescriptor = context.getContextDescriptor();
if (DescriptorUtils.isClassObject(classReceiverDeclarationDescriptor)) { if (contextDescriptor instanceof FunctionDescriptor && receiverDescriptor == contextDescriptor.getContainingDeclaration()) {
if (context.getContextDescriptor() instanceof FunctionDescriptor &&
classReceiverDeclarationDescriptor == context.getContextDescriptor().getContainingDeclaration()) {
v.load(0, OBJECT_TYPE); v.load(0, OBJECT_TYPE);
} }
else { else {
FieldInfo info = FieldInfo.createForSingleton(classReceiverDeclarationDescriptor, typeMapper); FieldInfo info = FieldInfo.createForSingleton(receiverDescriptor, typeMapper);
v.getstatic(info.getOwnerInternalName(), info.getFieldName(), info.getFieldType().getDescriptor()); v.getstatic(info.getOwnerInternalName(), info.getFieldName(), info.getFieldType().getDescriptor());
} }
StackValue.onStack(exprType).put(type, v); StackValue.onStack(asmType(receiverValue.getType())).put(type, v);
} }
else { else {
StackValue.thisOrOuter(this, classReceiverDeclarationDescriptor, false, false).put(type, v); StackValue.thisOrOuter(this, receiverDescriptor, false, false).put(type, v);
} }
} }
else if (descriptor instanceof ScriptReceiver) { else if (receiverValue instanceof ScriptReceiver) {
// SCRIPT: generate script // SCRIPT: generate script
generateScript((ScriptReceiver) descriptor); generateScript((ScriptReceiver) receiverValue);
} }
else if (descriptor instanceof ExtensionReceiver) { else if (receiverValue instanceof ExtensionReceiver) {
ExtensionReceiver extensionReceiver = (ExtensionReceiver) descriptor; generateReceiver(((ExtensionReceiver) receiverValue).getDeclarationDescriptor()).put(type, v);
generateReceiver(extensionReceiver.getDeclarationDescriptor()).put(type, v);
} }
else if (descriptor instanceof ExpressionReceiver) { else if (receiverValue instanceof ExpressionReceiver) {
ExpressionReceiver expressionReceiver = (ExpressionReceiver) descriptor; gen(((ExpressionReceiver) receiverValue).getExpression(), type);
JetExpression expr = expressionReceiver.getExpression();
gen(expr, type);
} }
else { else {
throw new UnsupportedOperationException("Unsupported receiver type: " + descriptor); throw new UnsupportedOperationException("Unsupported receiver value: " + receiverValue);
} }
} }
@@ -2214,12 +2210,13 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return null; return null;
} }
private StackValue generateReceiver(DeclarationDescriptor provided) { @NotNull
if (context.getCallableDescriptorWithReceiver() == provided) { private StackValue generateReceiver(@NotNull CallableDescriptor descriptor) {
if (context.getCallableDescriptorWithReceiver() == descriptor) {
return context.getReceiverExpression(typeMapper); return context.getReceiverExpression(typeMapper);
} }
return context.lookupInContext(provided, StackValue.local(0, OBJECT_TYPE), state, false); return context.lookupInContext(descriptor, StackValue.local(0, OBJECT_TYPE), state, false);
} }
// SCRIPT: generate script, move to ScriptingUtil // SCRIPT: generate script, move to ScriptingUtil
@@ -3403,12 +3400,10 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
if (descriptor instanceof ClassDescriptor) { if (descriptor instanceof ClassDescriptor) {
return StackValue.thisOrOuter(this, (ClassDescriptor) descriptor, false, true); return StackValue.thisOrOuter(this, (ClassDescriptor) descriptor, false, true);
} }
else { if (descriptor instanceof CallableDescriptor) {
if (descriptor instanceof CallableDescriptor) { return generateReceiver((CallableDescriptor) descriptor);
return generateReceiver(descriptor);
}
throw new UnsupportedOperationException("neither this nor receiver");
} }
throw new UnsupportedOperationException("Neither this nor receiver: " + descriptor);
} }
@Override @Override
@@ -723,7 +723,7 @@ public abstract class StackValue {
if (resolvedSetCall.getThisObject().exists()) { if (resolvedSetCall.getThisObject().exists()) {
if (resolvedSetCall.getReceiverArgument().exists()) { if (resolvedSetCall.getReceiverArgument().exists()) {
codegen.generateFromResolvedCall(resolvedSetCall.getThisObject(), OBJECT_TYPE); codegen.generateReceiverValue(resolvedSetCall.getThisObject(), OBJECT_TYPE);
} }
v.load(realReceiverIndex, realReceiverType); v.load(realReceiverIndex, realReceiverType);
} }
@@ -1137,7 +1137,7 @@ public abstract class StackValue {
callableMethod.getOwner() : callableMethod.getOwner() :
codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType()); codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType());
codegen.generateFromResolvedCall(thisObject, resultType); codegen.generateReceiverValue(thisObject, resultType);
} }
else { else {
genReceiver(v, thisObject, type, null, 0); genReceiver(v, thisObject, type, null, 0);
@@ -1173,11 +1173,11 @@ public abstract class StackValue {
if (receiver == StackValue.none()) { if (receiver == StackValue.none()) {
if (receiverParameter != null) { if (receiverParameter != null) {
Type receiverType = codegen.typeMapper.mapType(receiverParameter.getType()); Type receiverType = codegen.typeMapper.mapType(receiverParameter.getType());
codegen.generateFromResolvedCall(receiverArgument, receiverType); codegen.generateReceiverValue(receiverArgument, receiverType);
StackValue.onStack(receiverType).put(type, v); StackValue.onStack(receiverType).put(type, v);
} }
else { else {
codegen.generateFromResolvedCall(receiverArgument, type); codegen.generateReceiverValue(receiverArgument, type);
} }
} }
else { else {