From c4255cdb0ffd73c2ea144e3875632322d7a8026a Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 6 Mar 2023 17:12:40 +0100 Subject: [PATCH] [FIR2IR] Fix adapted callable reference to nested class constructor ^KT-56829 Fixed --- .../fir/backend/generators/AdapterGenerator.kt | 14 +++++++++----- .../FirLightTreeBlackBoxCodegenTestGenerated.java | 6 ++++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++++++ .../nestedClassConstructorWithDefault.kt | 13 +++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../kotlin/js/test/JsCodegenBoxTestGenerated.java | 6 ++++++ .../js/test/fir/FirJsCodegenBoxTestGenerated.java | 6 ++++++ .../js/test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++++++ .../js/test/ir/IrJsES6CodegenBoxTestGenerated.java | 6 ++++++ .../K2NativeCodegenBoxTestGenerated.java | 6 ++++++ .../NativeCodegenBoxTestGenerated.java | 6 ++++++ .../wasm/test/IrCodegenBoxWasmTestGenerated.java | 5 +++++ 14 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt index b3ca25031a4..155d4a59055 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/AdapterGenerator.kt @@ -8,10 +8,8 @@ package org.jetbrains.kotlin.fir.backend.generators import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.backend.* -import org.jetbrains.kotlin.fir.declarations.FirFunction -import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner -import org.jetbrains.kotlin.fir.declarations.FirValueParameter +import org.jetbrains.kotlin.fir.containingClassLookupTag +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression @@ -24,6 +22,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.getExpectedType import org.jetbrains.kotlin.fir.resolve.calls.isFunctional import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag @@ -324,7 +323,12 @@ internal class AdapterGenerator( ) if (boundDispatchReceiver != null) irCall.dispatchReceiver = receiverValue else irCall.extensionReceiver = receiverValue - } else if (callableReferenceAccess.explicitReceiver is FirResolvedQualifier && ((firAdaptee as? FirMemberDeclaration)?.isStatic != true)) { + } else if ( + callableReferenceAccess.explicitReceiver is FirResolvedQualifier && + (firAdaptee !is FirConstructor || + firAdaptee.containingClassLookupTag()?.toFirRegularClassSymbol(session)?.isInner == true) && + ((firAdaptee as? FirMemberDeclaration)?.isStatic != true) + ) { // Unbound callable reference 'A::foo' val adaptedReceiverParameter = adapterFunction.valueParameters[0] val adaptedReceiverValue = IrGetValueImpl( diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index a87495ca7ec..58849613b62 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -3402,6 +3402,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt") public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 20838218147..8f2064bdac8 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -3402,6 +3402,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt") public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception { diff --git a/compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt b/compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt new file mode 100644 index 00000000000..82c6c707b98 --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt @@ -0,0 +1,13 @@ +class Command { + class Add(val arg: String? = "OK") + inner class InnerAdd(val arg: String? = "OK") +} + +fun execute(func: () -> Command.Add) = func() +fun execute(c: Command, func: (Command) -> Command.InnerAdd) = func(c) + +fun box(): String { + if (execute(Command::Add).arg != "OK") return "FAIL 1" + if (execute(Command(), Command::InnerAdd).arg != "OK") return "FAIL 2" + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index c0709c167e7..90475cc46da 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -3258,6 +3258,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt") public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception { 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 28b81c84eab..af77af92a35 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 @@ -3402,6 +3402,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt") public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 22aa7127ec2..602807b4e06 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2850,6 +2850,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @TestMetadata("noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt") public void testNoAdaptedReferencesIfNoOptimizedReferencesEnabled() throws Exception { runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/noAdaptedReferencesIfNoOptimizedReferencesEnabled.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index c0d77ef1e68..3fdad673f8e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -2124,6 +2124,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noNameClashForReferencesToSameFunction.kt") public void testNoNameClashForReferencesToSameFunction() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 3f973eeb91f..2cec136283f 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -2178,6 +2178,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noNameClashForReferencesToSameFunction.kt") public void testNoNameClashForReferencesToSameFunction() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 79aa547c7e1..dd117e346aa 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -2178,6 +2178,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noNameClashForReferencesToSameFunction.kt") public void testNoNameClashForReferencesToSameFunction() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java index e519b2ec6f0..58e1769b1d9 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsES6CodegenBoxTestGenerated.java @@ -2178,6 +2178,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noNameClashForReferencesToSameFunction.kt") public void testNoNameClashForReferencesToSameFunction() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java index d1c4e14a088..642a4cacc3e 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K2NativeCodegenBoxTestGenerated.java @@ -2261,6 +2261,12 @@ public class K2NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTes runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noNameClashForReferencesToSameFunction.kt") public void testNoNameClashForReferencesToSameFunction() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 96551b1c510..af7e77df99c 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -2232,6 +2232,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @Test + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @Test @TestMetadata("noNameClashForReferencesToSameFunction.kt") public void testNoNameClashForReferencesToSameFunction() throws Exception { diff --git a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java index c80d55ab159..40aa987d27e 100644 --- a/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java +++ b/wasm/wasm.tests/tests-gen/org/jetbrains/kotlin/wasm/test/IrCodegenBoxWasmTestGenerated.java @@ -1940,6 +1940,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/manyDefaultsAndVararg.kt"); } + @TestMetadata("nestedClassConstructorWithDefault.kt") + public void testNestedClassConstructorWithDefault() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/nestedClassConstructorWithDefault.kt"); + } + @TestMetadata("noNameClashForReferencesToSameFunction.kt") public void testNoNameClashForReferencesToSameFunction() throws Exception { runTest("compiler/testData/codegen/box/callableReference/adaptedReferences/noNameClashForReferencesToSameFunction.kt");