From 027b1f861c1705013f9b9887659faf201aba7632 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 24 Oct 2022 18:10:51 +0300 Subject: [PATCH] [FIR] Update return type of delegated callables in ReturnTypeCalculator ^KT-54654 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../body/resolve/FirImplicitBodyResolve.kt | 6 ++++- .../codegen/box/delegation/kt54654.kt | 22 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/delegation/kt54654.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 5a0edd0160e..fe3e42ba101 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -15575,6 +15575,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/delegation/kt30102_comparable.kt"); } + @Test + @TestMetadata("kt54654.kt") + public void testKt54654() throws Exception { + runTest("compiler/testData/codegen/box/delegation/kt54654.kt"); + } + @Test @TestMetadata("kt8154.kt") public void testKt8154() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt index 3dc08e5d14e..f1c6decb800 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirImplicitBodyResolve.kt @@ -239,7 +239,11 @@ private class ReturnTypeCalculatorWithJump( val unwrappedDelegate = declaration.delegatedWrapperData?.wrapped if (unwrappedDelegate != null) { - return tryCalculateReturnType(unwrappedDelegate) + return tryCalculateReturnType(unwrappedDelegate).also { + if (declaration.returnTypeRef is FirImplicitTypeRef) { + declaration.replaceReturnTypeRef(it) + } + } } if (declaration.isSubstitutionOrIntersectionOverride) { diff --git a/compiler/testData/codegen/box/delegation/kt54654.kt b/compiler/testData/codegen/box/delegation/kt54654.kt new file mode 100644 index 00000000000..4a617f905a5 --- /dev/null +++ b/compiler/testData/codegen/box/delegation/kt54654.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM_IR +// ISSUE: KT-54654 + +fun accessProperty(b: B) = b.property +fun accessFunction(b: B) = b.function() + +fun getString_1(): String = "O" +fun getString_2(): String = "K" + +interface A { + val property get() = getString_1() + fun function() = getString_2() +} + +class B(val a: A) : A by a + +class C : A + +fun box(): String { + val b = B(C()) + return accessProperty(b) + accessFunction(b) +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 1f74efc7ede..5848cbab376 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -15575,6 +15575,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/delegation/kt30102_comparable.kt"); } + @Test + @TestMetadata("kt54654.kt") + public void testKt54654() throws Exception { + runTest("compiler/testData/codegen/box/delegation/kt54654.kt"); + } + @Test @TestMetadata("kt8154.kt") public void testKt8154() throws Exception {