From 0db6e5c3f35ac4c90eec982c8bc27f169dfc9354 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 1 Dec 2017 15:32:25 +0300 Subject: [PATCH] Fix SAM wrapper generation in secondary constructor calls Should simply invoke 'checkSamCall' in corresponding visitor method to check if call arguments should be wrapped. --- .../binding/CodegenAnnotatingVisitor.java | 2 ++ .../adapters/superInSecondaryConstructor.kt | 24 +++++++++++++++++++ ...ackBoxAgainstJavaCodegenTestGenerated.java | 6 +++++ 3 files changed, 32 insertions(+) create mode 100644 compiler/testData/codegen/boxAgainstJava/sam/adapters/superInSecondaryConstructor.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java index d8c059410be..2515c5ba9da 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -648,6 +648,8 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { @Override public void visitConstructorDelegationCall(@NotNull KtConstructorDelegationCall call) { withinUninitializedClass(call, () -> super.visitConstructorDelegationCall(call)); + + checkSamCall(call); } private void withinUninitializedClass(@NotNull KtElement element, @NotNull Runnable operation) { diff --git a/compiler/testData/codegen/boxAgainstJava/sam/adapters/superInSecondaryConstructor.kt b/compiler/testData/codegen/boxAgainstJava/sam/adapters/superInSecondaryConstructor.kt new file mode 100644 index 00000000000..82f991af8bb --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/sam/adapters/superInSecondaryConstructor.kt @@ -0,0 +1,24 @@ +// FILE: test.kt +class Test : Base { + constructor(f: () -> String) : super(f) +} + +fun box() = Test({ "OK" }).get() + +// FILE: Supplier.java +public interface Supplier { + T get(); +} + +// FILE: Base.java +public class Base { + private final Supplier supplier; + + public Base(Supplier supplier) { + this.supplier = supplier; + } + + public String get() { + return supplier.get(); + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java index fa034000181..9ed28e3ad37 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -787,6 +787,12 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxAga doTest(fileName); } + @TestMetadata("superInSecondaryConstructor.kt") + public void testSuperInSecondaryConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/superInSecondaryConstructor.kt"); + doTest(fileName); + } + @TestMetadata("superconstructor.kt") public void testSuperconstructor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/sam/adapters/superconstructor.kt");