JVM IR: sort multifile part names in metadata

This commit is contained in:
Alexander Udalov
2020-10-13 11:44:40 +02:00
parent b257b03152
commit 1b39a235d8
7 changed files with 104 additions and 4 deletions
@@ -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");
@@ -91,7 +91,8 @@ private fun generateMultifileFacades(
shouldGeneratePartHierarchy: Boolean,
functionDelegates: MutableMap<IrSimpleFunction, IrSimpleFunction>
): List<IrFile> =
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>): IrClass {
val parts = unsortedParts.sortedBy(IrClass::name)
private fun modifyMultifilePartsForHierarchy(context: JvmBackendContext, parts: List<IrClass>): IrClass {
val superClasses = listOf(context.irBuiltIns.anyClass.owner) + parts.subList(0, parts.size - 1)
for ((klass, superClass) in parts.zip(superClasses)) {
@@ -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"
}
@@ -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"
}
@@ -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");
@@ -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");
@@ -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");