[FIR2IR] Properly handle error references in generation of receivers

^KT-53698 Fixed
This commit is contained in:
Dmitriy Novozhilov
2022-12-05 10:01:19 +02:00
committed by Space Team
parent f3da26946b
commit 9946bfcdfd
5 changed files with 40 additions and 9 deletions
@@ -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,
@@ -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 {
@@ -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()
}
@@ -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"
}
}
@@ -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 {