From 72f96cd55c1814b9a1ae286fccf8ad23274e0c81 Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Wed, 1 Oct 2014 22:28:58 +0400 Subject: [PATCH] Generate bridges when creating SAM wrapper not from closure. --- .../jetbrains/jet/codegen/SamWrapperCodegen.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/SamWrapperCodegen.java index 8af1d9cdf97..97eba79450e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/SamWrapperCodegen.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.impl.ClassDescriptorImpl; +import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; @@ -149,6 +150,21 @@ public class SamWrapperCodegen { .getFunctions(Name.identifier("invoke")).iterator().next().getOriginal(); StackValue functionField = StackValue.field(functionType, ownerType, FUNCTION_FIELD_NAME, false); codegen.genDelegate(erasedInterfaceFunction, invokeFunction, functionField); + + // generate sam bridges + // TODO: erasedInterfaceFunction is actually not an interface function, but function in generated class + SimpleFunctionDescriptor originalInterfaceErased = samType.getAbstractMethod().getOriginal(); + SimpleFunctionDescriptorImpl descriptorForBridges = SimpleFunctionDescriptorImpl + .create(erasedInterfaceFunction.getContainingDeclaration(), erasedInterfaceFunction.getAnnotations(), originalInterfaceErased.getName(), + CallableMemberDescriptor.Kind.DECLARATION, erasedInterfaceFunction.getSource()); + + descriptorForBridges + .initialize(null, originalInterfaceErased.getDispatchReceiverParameter(), originalInterfaceErased.getTypeParameters(), + originalInterfaceErased.getValueParameters(), originalInterfaceErased.getReturnType(), Modality.OPEN, + originalInterfaceErased.getVisibility()); + + descriptorForBridges.addOverriddenDescriptor(originalInterfaceErased); + codegen.generateBridges(descriptorForBridges); } @NotNull