diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 4aff78a2599..1772a6f2914 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -210,21 +210,29 @@ public class ClosureCodegen extends MemberCodegen { //TODO: rewrite cause ugly hack if (samType != null) { - SimpleFunctionDescriptorImpl descriptorForBridges = SimpleFunctionDescriptorImpl - .create(funDescriptor.getContainingDeclaration(), funDescriptor.getAnnotations(), - erasedInterfaceFunction.getName(), - CallableMemberDescriptor.Kind.DECLARATION, funDescriptor.getSource()); - - descriptorForBridges - .initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(), - erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), - Modality.OPEN, erasedInterfaceFunction.getVisibility()); - - DescriptorUtilsKt.setSingleOverridden(descriptorForBridges, erasedInterfaceFunction); - functionCodegen.generateBridges(descriptorForBridges); + generateBridgesForSAM(erasedInterfaceFunction, funDescriptor, functionCodegen); } } + static void generateBridgesForSAM( + FunctionDescriptor erasedInterfaceFunction, + FunctionDescriptor descriptor, + FunctionCodegen codegen + ) { + SimpleFunctionDescriptorImpl descriptorForBridges = SimpleFunctionDescriptorImpl + .create(descriptor.getContainingDeclaration(), descriptor.getAnnotations(), + erasedInterfaceFunction.getName(), + CallableMemberDescriptor.Kind.DECLARATION, descriptor.getSource()); + + descriptorForBridges + .initialize(null, erasedInterfaceFunction.getDispatchReceiverParameter(), erasedInterfaceFunction.getTypeParameters(), + erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), + Modality.OPEN, erasedInterfaceFunction.getVisibility()); + + DescriptorUtilsKt.setSingleOverridden(descriptorForBridges, erasedInterfaceFunction); + codegen.generateBridges(descriptorForBridges); + } + @Override protected void generateKotlinMetadataAnnotation() { FunctionDescriptor frontendFunDescriptor = CodegenUtilKt.unwrapFrontendVersion(funDescriptor); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index c60b53b1d3c..0b35bbe007a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -24,14 +24,12 @@ import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl; -import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl; import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtFile; import org.jetbrains.kotlin.resolve.DescriptorUtils; -import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt; import org.jetbrains.kotlin.storage.LockBasedStorageManager; import org.jetbrains.kotlin.types.KotlinType; @@ -175,17 +173,7 @@ public class SamWrapperCodegen { // generate sam bridges // TODO: erasedInterfaceFunction is actually not an interface function, but function in generated class SimpleFunctionDescriptor originalInterfaceErased = samType.getOriginalAbstractMethod(); - 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()); - - DescriptorUtilsKt.setSingleOverridden(descriptorForBridges, originalInterfaceErased); - codegen.generateBridges(descriptorForBridges); + ClosureCodegen.generateBridgesForSAM(originalInterfaceErased, erasedInterfaceFunction, codegen); } @NotNull