Get rid of SAM_ADAPTER_FUNCTION_TO_ORIGINAL
Use SAM adapters hierarchy instead
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user