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 959af81e15f..2abd3a2743b 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 @@ -24010,6 +24010,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/multifileClasses/kt16077.kt"); } + @Test + @TestMetadata("metadataFlag.kt") + public void testMetadataFlag() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/metadataFlag.kt"); + } + @Test @TestMetadata("multifileClassPartsInitialization.kt") public void testMultifileClassPartsInitialization() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 13bc92b485f..705ad911636 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -10,8 +10,12 @@ import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry import org.jetbrains.kotlin.backend.jvm.lower.buildAssertionsDisabledField import org.jetbrains.kotlin.backend.jvm.lower.hasAssertionsDisabledField -import org.jetbrains.kotlin.codegen.* +import org.jetbrains.kotlin.codegen.DescriptorAsmUtil +import org.jetbrains.kotlin.codegen.VersionIndependentOpcodes +import org.jetbrains.kotlin.codegen.addRecordComponent import org.jetbrains.kotlin.codegen.inline.* +import org.jetbrains.kotlin.codegen.writeKotlinMetadata +import org.jetbrains.kotlin.config.JvmAnalysisFlags import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.DescriptorVisibilities @@ -194,9 +198,6 @@ class ClassCodegen private constructor( ) private fun generateKotlinMetadataAnnotation() { - // TODO: if `-Xmultifile-parts-inherit` is enabled, write the corresponding flag for parts and facades to [Metadata.extraInt]. - val extraFlags = context.backendExtension.generateMetadataExtraFlags(state.abiStability) - val facadeClassName = context.multifileFacadeForPart[irClass.attributeOwnerId] val metadata = irClass.metadata val entry = irClass.fileParent.fileEntry @@ -208,6 +209,14 @@ class ClassCodegen private constructor( entry is MultifileFacadeFileEntry -> KotlinClassHeader.Kind.MULTIFILE_CLASS else -> KotlinClassHeader.Kind.SYNTHETIC_CLASS } + + val isMultifileClassOrPart = kind == KotlinClassHeader.Kind.MULTIFILE_CLASS || kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART + + var extraFlags = context.backendExtension.generateMetadataExtraFlags(state.abiStability) + if (isMultifileClassOrPart && state.languageVersionSettings.getFlag(JvmAnalysisFlags.inheritMultifileParts)) { + extraFlags = extraFlags or JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG + } + writeKotlinMetadata(visitor, state, kind, extraFlags) { if (metadata != null) { metadataSerializer.serialize(metadata)?.let { (proto, stringTable) -> @@ -229,9 +238,7 @@ class ClassCodegen private constructor( } if (irClass in context.classNameOverride) { - val isFileClass = kind == KotlinClassHeader.Kind.MULTIFILE_CLASS || - kind == KotlinClassHeader.Kind.MULTIFILE_CLASS_PART || - kind == KotlinClassHeader.Kind.FILE_FACADE + val isFileClass = isMultifileClassOrPart || kind == KotlinClassHeader.Kind.FILE_FACADE assert(isFileClass) { "JvmPackageName is not supported for classes: ${irClass.render()}" } it.visit(JvmAnnotationNames.METADATA_PACKAGE_NAME_FIELD_NAME, irClass.fqNameWhenAvailable!!.parent().asString()) } diff --git a/compiler/testData/codegen/box/multifileClasses/metadataFlag.kt b/compiler/testData/codegen/box/multifileClasses/metadataFlag.kt new file mode 100644 index 00000000000..7e0ee954544 --- /dev/null +++ b/compiler/testData/codegen/box/multifileClasses/metadataFlag.kt @@ -0,0 +1,50 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +// FIR reports unresolved reference on `extraInt`. +// IGNORE_BACKEND_FIR: JVM_IR + +// MODULE: optimized +// !INHERIT_MULTIFILE_PARTS +// FILE: optimized.kt + +@file:JvmMultifileClass +@file:JvmName("Optimized") +package optimized + +fun test() {} + +class RandomClass + +// MODULE: main(optimized) +// FILE: default.kt + +@file:JvmMultifileClass +@file:JvmName("Default") +package default + +fun test() {} + +// FILE: box.kt + +fun isFlagSet(className: String): Boolean { + val extraInt = Class.forName(className).getAnnotation(Metadata::class.java).extraInt + return (extraInt and (1 shl 0)) != 0 +} + +fun box(): String { + if (isFlagSet("default.Default")) + return "Fail: inherited multifile parts flag should NOT be set by default for the facade" + if (isFlagSet("default.Default__DefaultKt")) + return "Fail: inherited multifile parts flag should NOT be set by default for the part" + + if (!isFlagSet("optimized.Optimized")) + return "Fail: inherited multifile parts flag SHOULD be set by default for the facade" + if (!isFlagSet("optimized.Optimized__OptimizedKt")) + return "Fail: inherited multifile parts flag SHOULD be set by default for the part" + + if (isFlagSet("optimized.RandomClass")) + return "Fail: inherited multifile parts flag should NOT be set by default for some random class if -Xmultifile-part-inherit is enabled" + + return "OK" +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 1261d8e2386..a54c619c34d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -24010,6 +24010,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multifileClasses/kt16077.kt"); } + @Test + @TestMetadata("metadataFlag.kt") + public void testMetadataFlag() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/metadataFlag.kt"); + } + @Test @TestMetadata("multifileClassPartsInitialization.kt") public void testMultifileClassPartsInitialization() throws Exception { 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 6968dda1cf0..b145c3735d4 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 @@ -24010,6 +24010,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multifileClasses/kt16077.kt"); } + @Test + @TestMetadata("metadataFlag.kt") + public void testMetadataFlag() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/metadataFlag.kt"); + } + @Test @TestMetadata("multifileClassPartsInitialization.kt") public void testMultifileClassPartsInitialization() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 79bd3056596..5f14b1c8bea 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -20367,6 +20367,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/multifileClasses/kt16077.kt"); } + @TestMetadata("metadataFlag.kt") + public void testMetadataFlag() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/metadataFlag.kt"); + } + @TestMetadata("multifileClassPartsInitialization.kt") public void testMultifileClassPartsInitialization() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/multifileClassPartsInitialization.kt");