From 7f4740130e7c6049d6d9c95f546194599333cbc9 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 29 Mar 2017 15:11:12 +0300 Subject: [PATCH] Use cloned descriptors for default enum entry --- .../backend/konan/lower/EnumClassLowering.kt | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt index 99a172d4d6d..bd4f4899b95 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt @@ -266,12 +266,41 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { } } - val memberScope = SimpleMemberScope(irClass.descriptor.unsubstitutedMemberScope.getContributedDescriptors().toList()) - defaultClassDescriptor.initialize(memberScope, constructors, null) + val contributedDescriptors = irClass.descriptor.unsubstitutedMemberScope + .getContributedDescriptors() + .map { createFakeOverrideDescriptor(defaultClassDescriptor, it) } + .filterNotNull() + .toList() + defaultClassDescriptor.initialize(SimpleMemberScope(contributedDescriptors), constructors, null) return defaultClass } + private fun createFakeOverrideDescriptor(owner: ClassDescriptor, descriptor: DeclarationDescriptor): DeclarationDescriptor? { + // We need to copy descriptors for vtable building, thus take only functions and properties. + return when (descriptor) { + is FunctionDescriptor -> + descriptor + .newCopyBuilder() + .setOwner(owner) + .setKind(CallableMemberDescriptor.Kind.FAKE_OVERRIDE) + .setCopyOverrides(true) + .build()!!.apply { + overriddenDescriptors += descriptor + } + is PropertyDescriptor -> + descriptor.copy( + /* newOwner = */ owner, + /* modality = */ descriptor.modality, + /* visibility = */ descriptor.visibility, + /* kind = */ CallableMemberDescriptor.Kind.FAKE_OVERRIDE, + /* copyOverrides = */ true).apply { + overriddenDescriptors += descriptor + } + else -> null + } + } + private fun createImplObject() { val startOffset = irClass.startOffset val endOffset = irClass.endOffset