[IR] Fix serialization of ENUM_SPECIAL members
This commit is contained in:
+3
@@ -5,10 +5,13 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.common.serialization
|
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.backend.common.serialization.UniqIdKey
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.resolveFakeOverrideMaybeAbstract
|
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.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
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.isAccessor
|
||||||
import org.jetbrains.kotlin.ir.util.isGetter
|
import org.jetbrains.kotlin.ir.util.isGetter
|
||||||
import org.jetbrains.kotlin.ir.util.isSetter
|
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
|
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||||
|
|
||||||
|
|
||||||
@@ -18,6 +20,12 @@ open class DescriptorReferenceSerializer(
|
|||||||
val serializeString: (String) -> KotlinIr.String,
|
val serializeString: (String) -> KotlinIr.String,
|
||||||
mangler: KotlinMangler): KotlinMangler by mangler {
|
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.
|
// 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.
|
// 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
|
// 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 isAccessor = declaration.isAccessor
|
||||||
val isBackingField = declaration is IrField && declaration.correspondingProperty != null
|
val isBackingField = declaration is IrField && declaration.correspondingProperty != null
|
||||||
val isFakeOverride = declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE
|
val isFakeOverride = declaration.origin == IrDeclarationOrigin.FAKE_OVERRIDE
|
||||||
val isDefaultConstructor =
|
val isDefaultConstructor = descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && (containingDeclaration.kind == ClassKind.OBJECT)
|
||||||
descriptor is ClassConstructorDescriptor && containingDeclaration is ClassDescriptor && containingDeclaration.kind == ClassKind.OBJECT
|
|
||||||
val isEnumEntry = descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY
|
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
|
val isTypeParameter = declaration is IrTypeParameter && declaration.parent is IrClass
|
||||||
|
|
||||||
// The corresponding descriptor in deserialized metadata has constructors = emptyList() etc.
|
// 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");
|
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")
|
@TestMetadata("enumShort.kt")
|
||||||
public void testEnumShort() throws Exception {
|
public void testEnumShort() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
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");
|
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")
|
@TestMetadata("enumShort.kt")
|
||||||
public void testEnumShort() throws Exception {
|
public void testEnumShort() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
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");
|
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")
|
@TestMetadata("enumShort.kt")
|
||||||
public void testEnumShort() throws Exception {
|
public void testEnumShort() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
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");
|
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")
|
@TestMetadata("enumShort.kt")
|
||||||
public void testEnumShort() throws Exception {
|
public void testEnumShort() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
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");
|
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")
|
@TestMetadata("enumShort.kt")
|
||||||
public void testEnumShort() throws Exception {
|
public void testEnumShort() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
runTest("compiler/testData/codegen/box/enum/enumShort.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user