[IR] Fix serialization of ENUM_SPECIAL members
This commit is contained in:
+3
@@ -5,10 +5,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.common.serialization
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor
|
||||
import org.jetbrains.kotlin.backend.common.descriptors.WrappedSimpleFunctionDescriptor
|
||||
import org.jetbrains.kotlin.backend.common.serialization.UniqIdKey
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.backend.common.serialization.resolveFakeOverrideMaybeAbstract
|
||||
import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
+10
-3
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.util.isAccessor
|
||||
import org.jetbrains.kotlin.ir.util.isGetter
|
||||
import org.jetbrains.kotlin.ir.util.isSetter
|
||||
import org.jetbrains.kotlin.ir.util.nameForIrSerialization
|
||||
import org.jetbrains.kotlin.resolve.DescriptorFactory
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||
|
||||
|
||||
@@ -18,6 +20,12 @@ open class DescriptorReferenceSerializer(
|
||||
val serializeString: (String) -> KotlinIr.String,
|
||||
mangler: KotlinMangler): KotlinMangler by mangler {
|
||||
|
||||
private fun isEnumSpecialMember(descriptor: DeclarationDescriptor): Boolean {
|
||||
if (descriptor !is SimpleFunctionDescriptor) return false
|
||||
|
||||
return DescriptorFactory.isEnumValueOfMethod(descriptor) || DescriptorFactory.isEnumValuesMethod(descriptor)
|
||||
}
|
||||
|
||||
// Not all exported descriptors are deserialized, some a synthesized anew during metadata deserialization.
|
||||
// Those created descriptors can't carry the uniqIdIndex, since it is available only for deserialized descriptors.
|
||||
// So we record the uniq id of some other "discoverable" descriptor for which we know for sure that it will be
|
||||
@@ -51,10 +59,9 @@ open class DescriptorReferenceSerializer(
|
||||
val isAccessor = declaration.isAccessor
|
||||
val isBackingField = declaration is IrField && declaration.correspondingProperty != null
|
||||
val isFakeOverride = declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE
|
||||
val isDefaultConstructor =
|
||||
descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && containingDeclaration.kind == ClassKind.OBJECT
|
||||
val isDefaultConstructor = descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && (containingDeclaration.kind == ClassKind.OBJECT)
|
||||
val isEnumEntry = descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY
|
||||
val isEnumSpecial = declaration.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER
|
||||
val isEnumSpecial = isEnumSpecialMember(descriptor)
|
||||
val isTypeParameter = declaration is IrTypeParameter && declaration.parent is IrClass
|
||||
|
||||
// The corresponding descriptor in deserialized metadata has constructors = emptyList() etc.
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
// WITH_RUNTIME
|
||||
// MODULE: lib
|
||||
// FILE: common.kt
|
||||
|
||||
enum class FooEnum(val s: String) {
|
||||
O("O"),
|
||||
FAIL("FAIL"),
|
||||
K("K");
|
||||
}
|
||||
|
||||
|
||||
// MODULE: bar(lib)
|
||||
// FILE: second.kt
|
||||
|
||||
fun bar(): String = FooEnum.valueOf("O").s + FooEnum.values()[2].s
|
||||
|
||||
// MODULE: main(bar)
|
||||
// FILE: main.kt
|
||||
|
||||
fun box(): String {
|
||||
return bar()
|
||||
}
|
||||
+5
@@ -10199,6 +10199,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumMultiModule.kt")
|
||||
public void testEnumMultiModule() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumShort.kt")
|
||||
public void testEnumShort() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
||||
|
||||
+5
@@ -10199,6 +10199,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumMultiModule.kt")
|
||||
public void testEnumMultiModule() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumShort.kt")
|
||||
public void testEnumShort() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
||||
|
||||
+5
@@ -10199,6 +10199,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumMultiModule.kt")
|
||||
public void testEnumMultiModule() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumShort.kt")
|
||||
public void testEnumShort() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
||||
|
||||
Generated
+5
@@ -7904,6 +7904,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumMultiModule.kt")
|
||||
public void testEnumMultiModule() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumShort.kt")
|
||||
public void testEnumShort() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
||||
|
||||
+5
@@ -8989,6 +8989,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
runTest("compiler/testData/codegen/box/enum/enumInheritedFromTrait.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumMultiModule.kt")
|
||||
public void testEnumMultiModule() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumMultiModule.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("enumShort.kt")
|
||||
public void testEnumShort() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
||||
|
||||
Reference in New Issue
Block a user