From 9150c53832a4809f51efca611f5bcc7271988db6 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 29 Jul 2015 23:22:15 +0300 Subject: [PATCH] Fixed codegen for non-public SAM-adapters --- .../jetbrains/kotlin/codegen/ExpressionCodegen.java | 4 ++++ .../sam/adapters/protectedFromBase.java | 5 +++++ .../sam/adapters/protectedFromBase.kt | 13 +++++++++++++ .../BlackBoxAgainstJavaCodegenTestGenerated.java | 6 ++++++ 4 files changed, 28 insertions(+) create mode 100644 compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.java create mode 100644 compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 9dacfd896b1..347a59ea3f9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2329,6 +2329,10 @@ public class ExpressionCodegen extends JetVisitor implem @NotNull private FunctionDescriptor accessibleFunctionDescriptor(@NotNull ResolvedCall resolvedCall) { FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); + FunctionDescriptor originalIfSamAdapter = SamCodegenUtil.getOriginalIfSamAdapter(descriptor); + if (originalIfSamAdapter != null) { + descriptor = originalIfSamAdapter; + } // $default method is not private, so you need no accessor to call it return usesDefaultArguments(resolvedCall) ? descriptor : context.accessibleFunctionDescriptor(descriptor); } diff --git a/compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.java b/compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.java new file mode 100644 index 00000000000..7a4138f5886 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.java @@ -0,0 +1,5 @@ +class JavaClass { + protected void execute(T t, Runnable r) { + r.run(); + } +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.kt b/compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.kt new file mode 100644 index 00000000000..9a2b91ca11e --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.kt @@ -0,0 +1,13 @@ +class KotlinClass : JavaClass() { + fun doIt(): String { + var result = "" + execute("") { + result = "OK" + } + return result + } +} + +fun box(): String { + return KotlinClass().doIt() +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 466389a6df4..6a7c85ce297 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -705,6 +705,12 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod doTestAgainstJava(fileName); } + @TestMetadata("protectedFromBase.kt") + public void testProtectedFromBase() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/protectedFromBase.kt"); + doTestAgainstJava(fileName); + } + @TestMetadata("severalSamParameters.kt") public void testSeveralSamParameters() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/severalSamParameters.kt");