Add "hasEnumEntries" class flag to kotlinx-metadata

^KT-53929 Fixed
This commit is contained in:
Roman Efremov
2023-01-03 12:32:47 +01:00
parent 14b4cdc7c4
commit 2dc3871954
10 changed files with 70 additions and 2 deletions
@@ -32,7 +32,7 @@ public class Flags {
public static final BooleanFlagField IS_EXPECT_CLASS = FlagField.booleanAfter(IS_EXTERNAL_CLASS);
public static final BooleanFlagField IS_VALUE_CLASS = FlagField.booleanAfter(IS_EXPECT_CLASS);
public static final BooleanFlagField IS_FUN_INTERFACE = FlagField.booleanAfter(IS_VALUE_CLASS);
private static final BooleanFlagField HAS_ENUM_ENTRIES = FlagField.booleanAfter(IS_FUN_INTERFACE);
public static final BooleanFlagField HAS_ENUM_ENTRIES = FlagField.booleanAfter(IS_FUN_INTERFACE);
// Constructors
@@ -23,6 +23,7 @@ public final class kotlinx/metadata/Flag {
}
public final class kotlinx/metadata/Flag$Class {
public static final field HAS_ENUM_ENTRIES Lkotlinx/metadata/Flag;
public static final field INSTANCE Lkotlinx/metadata/Flag$Class;
public static final field IS_ANNOTATION_CLASS Lkotlinx/metadata/Flag;
public static final field IS_CLASS Lkotlinx/metadata/Flag;
@@ -224,6 +224,13 @@ class Flag(private val offset: Int, private val bitWidth: Int, private val value
*/
@JvmField
val IS_FUN = Flag(F.IS_FUN_INTERFACE)
/**
* Signifies that the corresponding enum class has ".entries" property in bytecode.
* Always `false` for not enum classes.
*/
@JvmField
val HAS_ENUM_ENTRIES = Flag(F.HAS_ENUM_ENTRIES)
}
/**
@@ -501,6 +501,10 @@ class ClassPrinter(private val settings: KotlinpSettings) : AbstractPrinter<Kotl
supertypes.joinTo(result)
}
result.appendLine(" {")
if (Flag.Class.HAS_ENUM_ENTRIES(flags!!)) {
sb.appendLine()
sb.appendLine(" // has Enum.entries")
}
result.append(sb)
result.appendLine("}")
}
@@ -44,6 +44,11 @@ public class KotlinpTestGenerated extends AbstractKotlinpTest {
runTest("libraries/tools/kotlinp/testData/Contracts.kt");
}
@TestMetadata("EnumEntries.kt")
public void testEnumEntries() throws Exception {
runTest("libraries/tools/kotlinp/testData/EnumEntries.kt");
}
@TestMetadata("FunInterface.kt")
public void testFunInterface() throws Exception {
runTest("libraries/tools/kotlinp/testData/FunInterface.kt");
@@ -74,6 +79,11 @@ public class KotlinpTestGenerated extends AbstractKotlinpTest {
runTest("libraries/tools/kotlinp/testData/NestedClasses.kt");
}
@TestMetadata("NotEnumWithEnumEntriesEnabled.kt")
public void testNotEnumWithEnumEntriesEnabled() throws Exception {
runTest("libraries/tools/kotlinp/testData/NotEnumWithEnumEntriesEnabled.kt");
}
@TestMetadata("OptionalAnnotation.kt")
public void testOptionalAnnotation() throws Exception {
runTest("libraries/tools/kotlinp/testData/OptionalAnnotation.kt");
+5
View File
@@ -0,0 +1,5 @@
// !LANGUAGE: +EnumEntries
enum class MyEnum {
ONE, TWO
}
+19
View File
@@ -0,0 +1,19 @@
// MyEnum.class
// ------------------------------------------
public final enum class MyEnum : kotlin/Enum<MyEnum> {
// signature: <init>(Ljava/lang/String;I)V
private constructor()
ONE,
TWO,
// module name: test-module
// has Enum.entries
}
// META-INF/test-module.kotlin_module
// ------------------------------------------
module {
}
@@ -0,0 +1,5 @@
// !LANGUAGE: +EnumEntries
class UsualClass {
fun foo() {}
}
@@ -0,0 +1,16 @@
// UsualClass.class
// ------------------------------------------
public final class UsualClass : kotlin/Any {
// signature: <init>()V
public constructor()
// signature: foo()V
public final fun foo(): kotlin/Unit
// module name: test-module
}
// META-INF/test-module.kotlin_module
// ------------------------------------------
module {
}
@@ -1023,7 +1023,8 @@ class MetadataDeclarationsComparator private constructor(private val config: Con
Flag.Class::IS_EXTERNAL,
Flag.Class::IS_EXPECT,
Flag.Class::IS_VALUE,
Flag.Class::IS_FUN
Flag.Class::IS_FUN,
Flag.Class::HAS_ENUM_ENTRIES,
)
private val TYPE_ALIAS_FLAGS: Array<KProperty0<Flag>> = arrayOf(