From 38ab37d7eb2270ed4a06b465ca150bb978affe58 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 25 Mar 2021 11:38:28 +0300 Subject: [PATCH] [FIR2IR] Properly handle callable references to static functions --- .../fir/backend/generators/AdapterGenerator.kt | 2 +- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../box/fir/callableReferenceToStaticFunction.kt | 12 ++++++++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.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 8c87459170a..37be5719559 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 @@ -292,7 +292,7 @@ internal class AdapterGenerator( boundDispatchReceiver != null -> irCall.dispatchReceiver = receiverValue boundExtensionReceiver != null -> irCall.extensionReceiver = receiverValue } - } else if (callableReferenceAccess.explicitReceiver is FirResolvedQualifier) { + } else if (callableReferenceAccess.explicitReceiver is FirResolvedQualifier && ((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/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index aafc9b58bb7..78e15ced947 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 @@ -15098,6 +15098,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/fir"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("callableReferenceToStaticFunction.kt") + public void testCallableReferenceToStaticFunction() throws Exception { + runTest("compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.kt"); + } + @Test @TestMetadata("ClassBuilder.kt") public void testClassBuilder() throws Exception { diff --git a/compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.kt b/compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.kt new file mode 100644 index 00000000000..87ae7b85ae1 --- /dev/null +++ b/compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.kt @@ -0,0 +1,12 @@ +// TARGET_BACKEND: JVM_IR +// FULL_JDK +// WITH_STDLIB + +import java.nio.file.Files +import java.nio.file.Path + +fun test(path: Path): Path? { + return path.takeIf(Files::exists) +} + +fun box() = "OK" 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 ecd12ebc627..b22859eb5d5 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 @@ -15098,6 +15098,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/fir"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true); } + @Test + @TestMetadata("callableReferenceToStaticFunction.kt") + public void testCallableReferenceToStaticFunction() throws Exception { + runTest("compiler/testData/codegen/box/fir/callableReferenceToStaticFunction.kt"); + } + @Test @TestMetadata("ClassBuilder.kt") public void testClassBuilder() throws Exception {