[FIR2IR] Fix generation of Any method call on expect receiver
#KT-57583 Fixed
This commit is contained in:
committed by
Space Team
parent
ed99f8bcdd
commit
ee78c31174
+9
-1
@@ -1501,13 +1501,21 @@ class Fir2IrDeclarationStorage(
|
||||
): IrSymbol {
|
||||
val fir = firSymbol.fir as F
|
||||
val irParent by lazy { findIrParent(fir) }
|
||||
val signature by lazy { signatureComposer.composeSignature(fir, fakeOverrideOwnerLookupTag, forceTopLevelPrivate) }
|
||||
val signature by lazy {
|
||||
signatureComposer.composeSignature(
|
||||
fir,
|
||||
fakeOverrideOwnerLookupTag,
|
||||
forceTopLevelPrivate = forceTopLevelPrivate,
|
||||
forceExpect = fakeOverrideOwnerLookupTag?.toSymbol(session)?.isExpect == true
|
||||
)
|
||||
}
|
||||
synchronized(symbolTable.lock) {
|
||||
getCachedIrDeclaration(fir, fakeOverrideOwnerLookupTag.takeIf { it !is ConeClassLookupTagWithFixedSymbol }) {
|
||||
// Parent calculation provokes declaration calculation for some members from IrBuiltIns
|
||||
@Suppress("UNUSED_EXPRESSION") irParent
|
||||
signature
|
||||
}?.let { return it.symbol }
|
||||
|
||||
val parentOrigin = (irParent as? IrDeclaration)?.origin ?: IrDeclarationOrigin.DEFINED
|
||||
val declarationOrigin = computeDeclarationOrigin(firSymbol, parentOrigin)
|
||||
// TODO: package fragment members (?)
|
||||
|
||||
@@ -18,6 +18,7 @@ interface Fir2IrSignatureComposer {
|
||||
declaration: FirDeclaration,
|
||||
containingClass: ConeClassLikeLookupTag? = null,
|
||||
forceTopLevelPrivate: Boolean = false,
|
||||
forceExpect: Boolean = false,
|
||||
): IdSignature?
|
||||
|
||||
fun composeAccessorSignature(
|
||||
@@ -26,6 +27,7 @@ interface Fir2IrSignatureComposer {
|
||||
containingClass: ConeClassLikeLookupTag? = null,
|
||||
forceTopLevelPrivate: Boolean = false
|
||||
): IdSignature?
|
||||
|
||||
fun composeTypeParameterSignature(typeParameter: FirTypeParameter, index: Int, containerSignature: IdSignature?): IdSignature?
|
||||
fun withFileSignature(sig: IdSignature.FileSignature, body: () -> Unit)
|
||||
}
|
||||
|
||||
+6
-5
@@ -32,16 +32,16 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
||||
fileSignature = null
|
||||
}
|
||||
|
||||
private data class FirDeclarationWithParentId(val declaration: FirDeclaration, val classId: ClassId?)
|
||||
private data class FirDeclarationWithParentId(val declaration: FirDeclaration, val classId: ClassId?, val forceExpect: Boolean)
|
||||
|
||||
private val signatureCache = mutableMapOf<FirDeclarationWithParentId, IdSignature.CommonSignature>()
|
||||
|
||||
inner class SignatureBuilder : FirVisitor<Unit, Any?>() {
|
||||
inner class SignatureBuilder(private val forceExpect: Boolean) : FirVisitor<Unit, Any?>() {
|
||||
var hashId: Long? = null
|
||||
var mask = 0L
|
||||
|
||||
private fun setExpected(f: Boolean) {
|
||||
mask = mask or IdSignature.Flags.IS_EXPECT.encode(f)
|
||||
mask = mask or IdSignature.Flags.IS_EXPECT.encode(f || forceExpect)
|
||||
}
|
||||
|
||||
override fun visitElement(element: FirElement, data: Any?) {
|
||||
@@ -89,6 +89,7 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
||||
declaration: FirDeclaration,
|
||||
containingClass: ConeClassLikeLookupTag?,
|
||||
forceTopLevelPrivate: Boolean,
|
||||
forceExpect: Boolean,
|
||||
): IdSignature? {
|
||||
if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null
|
||||
if (declaration is FirRegularClass && declaration.classId.isLocal) return null
|
||||
@@ -98,7 +99,7 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
||||
if (declaration.dispatchReceiverClassLookupTagOrNull()?.classId?.isLocal == true || containingClass?.classId?.isLocal == true) return null
|
||||
}
|
||||
|
||||
val declarationWithParentId = FirDeclarationWithParentId(declaration, containingClass?.classId)
|
||||
val declarationWithParentId = FirDeclarationWithParentId(declaration, containingClass?.classId, forceExpect)
|
||||
val publicSignature = signatureCache.getOrPut(declarationWithParentId) {
|
||||
calculatePublicSignature(declarationWithParentId)
|
||||
}
|
||||
@@ -114,7 +115,7 @@ class FirBasedSignatureComposer(override val mangler: FirMangler) : Fir2IrSignat
|
||||
|
||||
private fun calculatePublicSignature(declarationWithParentId: FirDeclarationWithParentId): IdSignature.CommonSignature {
|
||||
val (declaration, containingClassId) = declarationWithParentId
|
||||
val builder = SignatureBuilder()
|
||||
val builder = SignatureBuilder(declarationWithParentId.forceExpect)
|
||||
try {
|
||||
declaration.accept(builder, null)
|
||||
} catch (t: Throwable) {
|
||||
|
||||
+6
@@ -33279,6 +33279,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -33279,6 +33279,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
// IGNORE_BACKEND_K1: ANY
|
||||
// !LANGUAGE: +MultiPlatformProjects
|
||||
|
||||
// MODULE: common
|
||||
// FILE: common.kt
|
||||
|
||||
expect class Runnable
|
||||
|
||||
fun foo(arg: Runnable) {
|
||||
arg.hashCode()
|
||||
}
|
||||
|
||||
// MODULE: main()()(common)
|
||||
// FILE: test.kt
|
||||
|
||||
actual class Runnable
|
||||
|
||||
fun box() = "OK"
|
||||
+6
@@ -31905,6 +31905,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -33279,6 +33279,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -33279,6 +33279,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+5
@@ -27187,6 +27187,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
|
||||
}
|
||||
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/correctParentForTypeParameter.kt");
|
||||
|
||||
+6
@@ -23111,6 +23111,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -23225,6 +23225,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -23225,6 +23225,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -23225,6 +23225,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -26651,6 +26651,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
+6
@@ -26348,6 +26348,12 @@ public class K1NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTes
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.NATIVE, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
|
||||
Generated
+5
@@ -20705,6 +20705,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/multiplatform/k2/basic"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.WASM, true);
|
||||
}
|
||||
|
||||
@TestMetadata("anyMethodInExpect.kt")
|
||||
public void testAnyMethodInExpect() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/anyMethodInExpect.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("correctParentForTypeParameter.kt")
|
||||
public void testCorrectParentForTypeParameter() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/correctParentForTypeParameter.kt");
|
||||
|
||||
Reference in New Issue
Block a user