diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 5b87d5a8a35..92ec5751596 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -18481,6 +18481,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/multifileClasses/multifileClassWithPrivate.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/namesInMetadataAreSorted.kt"); + } + @TestMetadata("privateConstVal.kt") public void testPrivateConstVal() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/privateConstVal.kt"); @@ -18553,6 +18558,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/optimized/namesInMetadataAreSorted.kt"); + } + @TestMetadata("overlappingFuns.kt") public void testOverlappingFuns() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/optimized/overlappingFuns.kt"); diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt index fe99c8cd961..bbf6e838ece 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt @@ -91,7 +91,8 @@ private fun generateMultifileFacades( shouldGeneratePartHierarchy: Boolean, functionDelegates: MutableMap ): List = - context.multifileFacadesToAdd.map { (jvmClassName, partClasses) -> + context.multifileFacadesToAdd.map { (jvmClassName, unsortedPartClasses) -> + val partClasses = unsortedPartClasses.sortedBy(IrClass::name) val kotlinPackageFqName = partClasses.first().fqNameWhenAvailable!!.parent() if (!partClasses.all { it.fqNameWhenAvailable!!.parent() == kotlinPackageFqName }) { throw UnsupportedOperationException( @@ -120,7 +121,7 @@ private fun generateMultifileFacades( } if (shouldGeneratePartHierarchy) { val superClass = modifyMultifilePartsForHierarchy(context, partClasses) - superTypes += superClass.typeWith() + superTypes = listOf(superClass.typeWith()) addConstructor { visibility = DescriptorVisibilities.PRIVATE @@ -157,8 +158,7 @@ private fun generateMultifileFacades( // Changes supertypes of multifile part classes so that they inherit from each other, and returns the last part class. // The multifile facade should inherit from that part class. -private fun modifyMultifilePartsForHierarchy(context: JvmBackendContext, unsortedParts: List): IrClass { - val parts = unsortedParts.sortedBy(IrClass::name) +private fun modifyMultifilePartsForHierarchy(context: JvmBackendContext, parts: List): IrClass { val superClasses = listOf(context.irBuiltIns.anyClass.owner) + parts.subList(0, parts.size - 1) for ((klass, superClass) in parts.zip(superClasses)) { diff --git a/compiler/testData/codegen/box/multifileClasses/namesInMetadataAreSorted.kt b/compiler/testData/codegen/box/multifileClasses/namesInMetadataAreSorted.kt new file mode 100644 index 00000000000..463eb9b243d --- /dev/null +++ b/compiler/testData/codegen/box/multifileClasses/namesInMetadataAreSorted.kt @@ -0,0 +1,29 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME +// FILE: ccc.kt + +@file:JvmName("Facade") +@file:JvmMultifileClass +package test +fun ccc() {} + +// FILE: aaa.kt + +@file:JvmName("Facade") +@file:JvmMultifileClass +package test +fun aaa() {} + +// FILE: _b.kt + +@file:JvmName("Facade") +@file:JvmMultifileClass +package test +fun b() {} + +// FILE: test.kt + +fun box(): String { + val names = Class.forName("test.Facade").getAnnotation(Metadata::class.java).data1.toList() + return if (names == listOf("test/Facade__AaaKt", "test/Facade__CccKt", "test/Facade___bKt")) "OK" else "Fail: $names" +} diff --git a/compiler/testData/codegen/box/multifileClasses/optimized/namesInMetadataAreSorted.kt b/compiler/testData/codegen/box/multifileClasses/optimized/namesInMetadataAreSorted.kt new file mode 100644 index 00000000000..89188b029a3 --- /dev/null +++ b/compiler/testData/codegen/box/multifileClasses/optimized/namesInMetadataAreSorted.kt @@ -0,0 +1,31 @@ +// TARGET_BACKEND: JVM +// IGNORE_LIGHT_ANALYSIS +// WITH_RUNTIME +// !INHERIT_MULTIFILE_PARTS +// FILE: ccc.kt + +@file:JvmName("Facade") +@file:JvmMultifileClass +package test +fun ccc() {} + +// FILE: aaa.kt + +@file:JvmName("Facade") +@file:JvmMultifileClass +package test +fun aaa() {} + +// FILE: _b.kt + +@file:JvmName("Facade") +@file:JvmMultifileClass +package test +fun b() {} + +// FILE: test.kt + +fun box(): String { + val names = Class.forName("test.Facade").getAnnotation(Metadata::class.java).data1.toList() + return if (names == listOf("test/Facade__AaaKt", "test/Facade__CccKt", "test/Facade___bKt")) "OK" else "Fail: $names" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index a0b3a74565b..040500db971 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -19876,6 +19876,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multifileClasses/multifileClassWithPrivate.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/namesInMetadataAreSorted.kt"); + } + @TestMetadata("privateConstVal.kt") public void testPrivateConstVal() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/privateConstVal.kt"); @@ -19948,6 +19953,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/optimized/namesInMetadataAreSorted.kt"); + } + @TestMetadata("overlappingFuns.kt") public void testOverlappingFuns() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/optimized/overlappingFuns.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f96437334fd..c05a49f4f9e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -19876,6 +19876,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/multifileClasses/multifileClassWithPrivate.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/namesInMetadataAreSorted.kt"); + } + @TestMetadata("privateConstVal.kt") public void testPrivateConstVal() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/privateConstVal.kt"); @@ -19948,6 +19953,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/optimized/namesInMetadataAreSorted.kt"); + } + @TestMetadata("overlappingFuns.kt") public void testOverlappingFuns() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/optimized/overlappingFuns.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index ac8cda1e820..ac9ae534f92 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -18481,6 +18481,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multifileClasses/multifileClassWithPrivate.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/namesInMetadataAreSorted.kt"); + } + @TestMetadata("privateConstVal.kt") public void testPrivateConstVal() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/privateConstVal.kt"); @@ -18553,6 +18558,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multifileClasses/optimized/internalFunction.kt"); } + @TestMetadata("namesInMetadataAreSorted.kt") + public void testNamesInMetadataAreSorted() throws Exception { + runTest("compiler/testData/codegen/box/multifileClasses/optimized/namesInMetadataAreSorted.kt"); + } + @TestMetadata("overlappingFuns.kt") public void testOverlappingFuns() throws Exception { runTest("compiler/testData/codegen/box/multifileClasses/optimized/overlappingFuns.kt");