[IR] Fix serialization of ENUM_SPECIAL members

This commit is contained in:
Roman Artemev
2019-06-03 19:05:10 +03:00
committed by romanart
parent e32bbcecc2
commit efaf5a9947
8 changed files with 60 additions and 3 deletions
@@ -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,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.
+22
View File
@@ -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()
}
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");