From 9946bfcdfd0ffc1739120ecc6dd3162b2befeb71 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 5 Dec 2022 10:01:19 +0200 Subject: [PATCH] [FIR2IR] Properly handle error references in generation of receivers ^KT-53698 Fixed --- .../generators/CallAndReferenceGenerator.kt | 13 ++++++------ .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ ...visibleFunctionWithReceiverWithSuppress.kt | 20 +++++++++++++++++++ .../box/coroutines/debug/debuggerMetadata.kt | 4 +--- .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 5 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/box/annotations/invisibleFunctionWithReceiverWithSuppress.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 9f0496f86b8..6d8dc594862 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -13,10 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isCompanion import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.buildAnnotationCall import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression -import org.jetbrains.kotlin.fir.references.FirDelegateFieldReference -import org.jetbrains.kotlin.fir.references.FirReference -import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference -import org.jetbrains.kotlin.fir.references.FirSuperReference +import org.jetbrains.kotlin.fir.references.* import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol import org.jetbrains.kotlin.fir.resolve.fullyExpandedType @@ -1069,8 +1066,12 @@ class CallAndReferenceGenerator( } if (ownerFunction?.extensionReceiverParameter != null) { extensionReceiver = qualifiedAccess.findIrExtensionReceiver(explicitReceiverExpression)?.let { - ((qualifiedAccess.calleeReference as FirResolvedNamedReference) - .resolvedSymbol.fir as? FirCallableDeclaration)?.receiverParameter?.typeRef?.let { receiverType -> + val symbol = when (val reference = qualifiedAccess.calleeReference) { + is FirResolvedNamedReference -> reference.resolvedSymbol + is FirErrorNamedReference -> reference.candidateSymbol + else -> null + } ?: error("Symbol for call ${qualifiedAccess.render()} not found") + (symbol.fir as? FirCallableDeclaration)?.receiverParameter?.typeRef?.let { receiverType -> with(visitor.implicitCastInserter) { it.cast( qualifiedAccess.extensionReceiver, 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 ae99979c420..e972e04f848 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 @@ -167,6 +167,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/annotations/genericAnnotations.kt"); } + @Test + @TestMetadata("invisibleFunctionWithReceiverWithSuppress.kt") + public void testInvisibleFunctionWithReceiverWithSuppress() throws Exception { + runTest("compiler/testData/codegen/box/annotations/invisibleFunctionWithReceiverWithSuppress.kt"); + } + @Test @TestMetadata("javaAnnotationArrayValueDefault.kt") public void testJavaAnnotationArrayValueDefault() throws Exception { diff --git a/compiler/testData/codegen/box/annotations/invisibleFunctionWithReceiverWithSuppress.kt b/compiler/testData/codegen/box/annotations/invisibleFunctionWithReceiverWithSuppress.kt new file mode 100644 index 00000000000..1dc79bc5f5d --- /dev/null +++ b/compiler/testData/codegen/box/annotations/invisibleFunctionWithReceiverWithSuppress.kt @@ -0,0 +1,20 @@ +// TARGET_BACKEND: JVM_IR +// ISSUE: KT-53698 +// MODULE: lib +package foo + +class Some(val s: String) + +internal fun Some.foo(): String = s + +// MODULE: main(lib) +@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") +package bar + +import foo.Some +import foo.foo + +fun box(): String { + val some = Some("OK") + return some.foo() +} diff --git a/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt b/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt index e91fbfec15b..f2d2c454b54 100644 --- a/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt +++ b/compiler/testData/codegen/box/coroutines/debug/debuggerMetadata.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND_K2: JVM_IR, JS_IR -// FIR status: some error in resolve (FirErrorNamedReferenceImpl in FIR) // TARGET_BACKEND: JVM // WITH_STDLIB // WITH_COROUTINES @@ -110,4 +108,4 @@ fun box(): String { } return "OK" -} \ No newline at end of file +} 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 7ef16a6aee0..73b01c859ae 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 @@ -167,6 +167,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/annotations/genericAnnotations.kt"); } + @Test + @TestMetadata("invisibleFunctionWithReceiverWithSuppress.kt") + public void testInvisibleFunctionWithReceiverWithSuppress() throws Exception { + runTest("compiler/testData/codegen/box/annotations/invisibleFunctionWithReceiverWithSuppress.kt"); + } + @Test @TestMetadata("javaAnnotationArrayValueDefault.kt") public void testJavaAnnotationArrayValueDefault() throws Exception {