From f6413c41a0ddc1f44729f9f899ca9dca1b970a1f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 9 Aug 2021 17:47:52 +0300 Subject: [PATCH] FIR: fix serialization of JvmField-properties of local classes #KT-48175 Fixed --- .../fir/backend/jvm/FirJvmSerializerExtension.kt | 9 ++++----- .../codegen/FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../testData/codegen/box/fir/jvmFieldInLocalClass.kt | 11 +++++++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/fir/jvmFieldInLocalClass.kt diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt index 885494fb066..0cc75bfaa36 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmSerializerExtension.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.inference.isBuiltinFunctionalType +import org.jetbrains.kotlin.fir.resolve.toFirRegularClass import org.jetbrains.kotlin.fir.serialization.FirElementSerializer import org.jetbrains.kotlin.fir.serialization.FirSerializerExtension import org.jetbrains.kotlin.fir.types.* @@ -259,11 +260,9 @@ class FirJvmSerializerExtension( private fun FirProperty.isJvmFieldPropertyInInterfaceCompanion(): Boolean { if (!hasJvmFieldAnnotation) return false - val container = - dispatchReceiverType?.classId?.let { - session.firProvider.getFirClassifierByFqName(it) as? FirRegularClass - } - if (container == null || !container.isCompanion) { + val container = (dispatchReceiverType as? ConeClassLikeType)?.lookupTag?.toFirRegularClass(session) + // Note: companions are anyway forbidden in local classes + if (container == null || !container.isCompanion || container.isLocal) { return false } 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 761d1d9b219..db4ae21d82b 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 @@ -16034,6 +16034,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/fir/IrBuiltIns.kt"); } + @Test + @TestMetadata("jvmFieldInLocalClass.kt") + public void testJvmFieldInLocalClass() throws Exception { + runTest("compiler/testData/codegen/box/fir/jvmFieldInLocalClass.kt"); + } + @Test @TestMetadata("KotlinDocumentationProvider.kt") public void testKotlinDocumentationProvider() throws Exception { diff --git a/compiler/testData/codegen/box/fir/jvmFieldInLocalClass.kt b/compiler/testData/codegen/box/fir/jvmFieldInLocalClass.kt new file mode 100644 index 00000000000..480703085b3 --- /dev/null +++ b/compiler/testData/codegen/box/fir/jvmFieldInLocalClass.kt @@ -0,0 +1,11 @@ +// TARGET_BACKEND: JVM_IR +// WITH_RUNTIME + +fun box(): String { + class Bean { + @JvmField + val a: String = "OK" + } + + return Bean().a +} 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 3137e0fa81b..875cb8a38d0 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 @@ -16034,6 +16034,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/IrBuiltIns.kt"); } + @Test + @TestMetadata("jvmFieldInLocalClass.kt") + public void testJvmFieldInLocalClass() throws Exception { + runTest("compiler/testData/codegen/box/fir/jvmFieldInLocalClass.kt"); + } + @Test @TestMetadata("KotlinDocumentationProvider.kt") public void testKotlinDocumentationProvider() throws Exception {