Get rid of SAM_ADAPTER_FUNCTION_TO_ORIGINAL

Use SAM adapters hierarchy instead
This commit is contained in:
Alexander Udalov
2013-08-05 19:29:01 +04:00
parent f76942fd19
commit 4a620dfcbb
12 changed files with 142 additions and 81 deletions
@@ -2084,8 +2084,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return typeMapper.mapToFunctionInvokeCallableMethod(createInvoke(fd));
}
else {
SimpleFunctionDescriptor originalOfSamAdapter = (SimpleFunctionDescriptor) SamCodegenUtil
.getOriginalIfSamAdapter(bindingContext, fd);
SimpleFunctionDescriptor originalOfSamAdapter = (SimpleFunctionDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(fd);
return typeMapper.mapToCallableMethod(originalOfSamAdapter != null ? originalOfSamAdapter : fd, superCall,
isCallInsideSameClassAsDeclared(fd, context),
isCallInsideSameModuleAsDeclared(fd, context),
@@ -3289,8 +3288,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
//See StackValue.receiver for more info
pushClosureOnStack(closure, resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists());
ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil
.getOriginalIfSamAdapter(bindingContext, constructorDescriptor);
ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(constructorDescriptor);
CallableMethod method = typeMapper.mapToCallableMethod(originalOfSamAdapter == null ? constructorDescriptor : originalOfSamAdapter);
invokeMethodWithArguments(method, resolvedCall, null, StackValue.none());
@@ -18,30 +18,27 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.JavaBindingContext;
import org.jetbrains.jet.lang.resolve.java.descriptor.SamAdapterDescriptor;
public class SamCodegenUtil {
@Nullable
public static FunctionDescriptor getOriginalIfSamAdapter(@NotNull BindingContext bindingContext, @NotNull CallableDescriptor fun) {
if (!(fun instanceof FunctionDescriptor)) {
return null;
}
FunctionDescriptor original = ((FunctionDescriptor) fun).getOriginal();
if (original.getKind() == CallableMemberDescriptor.Kind.SYNTHESIZED) {
return bindingContext.get(JavaBindingContext.SAM_ADAPTER_FUNCTION_TO_ORIGINAL, original);
public static FunctionDescriptor getOriginalIfSamAdapter(@NotNull FunctionDescriptor fun) {
FunctionDescriptor original = fun.getOriginal();
if (original instanceof SamAdapterDescriptor<?>) {
return ((SamAdapterDescriptor) original).getDeclaration();
}
if (original.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
for (FunctionDescriptor overridden : original.getOverriddenDescriptors()) {
FunctionDescriptor originalIfSamAdapter = getOriginalIfSamAdapter(bindingContext, overridden);
FunctionDescriptor originalIfSamAdapter = getOriginalIfSamAdapter(overridden);
if (originalIfSamAdapter != null) {
return originalIfSamAdapter;
}
}
}
return null;
}
@@ -365,7 +365,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
if (!(descriptor instanceof FunctionDescriptor)) {
return;
}
FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(bindingContext, descriptor);
FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter((FunctionDescriptor) descriptor);
if (original == null) {
return;
@@ -396,7 +396,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
(FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference());
if (operationDescriptor == null) return;
FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(bindingContext, operationDescriptor);
FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(operationDescriptor);
if (original == null) return;
ClassDescriptorFromJvmBytecode samInterfaceOfParameter = getInterfaceIfSamType(original.getValueParameters().get(0).getType());
@@ -421,7 +421,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
}
boolean isSetter = operationDescriptor.getName().asString().equals("set");
FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(bindingContext, operationDescriptor);
FunctionDescriptor original = SamCodegenUtil.getOriginalIfSamAdapter(operationDescriptor);
if (original == null) {
return;
}