From 6c970444527cd73a2e309ffe5b5bedcee814d660 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Fri, 14 Apr 2017 12:44:02 +0300 Subject: [PATCH] Extracted common function for creating fake overrides --- .../kotlin/backend/konan/ir/IrUtils.kt | 28 +++++++++++++++++-- .../backend/konan/lower/EnumClassLowering.kt | 28 ++----------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/IrUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/IrUtils.kt index c729170c90e..f3898d121e2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/IrUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/IrUtils.kt @@ -17,9 +17,7 @@ package org.jetbrains.kotlin.backend.konan.ir import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.SourceElement +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation @@ -50,6 +48,30 @@ fun ir2stringWhole(ir: IrElement?, withDescriptors: Boolean = false): String { return strWriter.toString() } +internal fun DeclarationDescriptor.createFakeOverrideDescriptor(owner: ClassDescriptor): DeclarationDescriptor? { + // We need to copy descriptors for vtable building, thus take only functions and properties. + return when (this) { + is FunctionDescriptor -> + newCopyBuilder() + .setOwner(owner) + .setKind(CallableMemberDescriptor.Kind.FAKE_OVERRIDE) + .setCopyOverrides(true) + .build()!!.apply { + overriddenDescriptors += this@createFakeOverrideDescriptor + } + is PropertyDescriptor -> + copy( + /* newOwner = */ owner, + /* modality = */ modality, + /* visibility = */ visibility, + /* kind = */ CallableMemberDescriptor.Kind.FAKE_OVERRIDE, + /* copyOverrides = */ true).apply { + overriddenDescriptors += this@createFakeOverrideDescriptor + } + else -> null + } +} + internal fun ClassDescriptor.createSimpleDelegatingConstructorDescriptor(superConstructorDescriptor: ClassConstructorDescriptor, isPrimary: Boolean = false) : ClassConstructorDescriptor { val constructorDescriptor = ClassConstructorDescriptorImpl.createSynthesized( 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 b093c7142dd..9f126e3cf70 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 @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.getKonanInternalFunctions import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName import org.jetbrains.kotlin.backend.konan.ir.createArrayOfExpression +import org.jetbrains.kotlin.backend.konan.ir.createFakeOverrideDescriptor import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructor import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructorDescriptor import org.jetbrains.kotlin.descriptors.* @@ -271,7 +272,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { val contributedDescriptors = irClass.descriptor.unsubstitutedMemberScope .getContributedDescriptors() - .map { createFakeOverrideDescriptor(defaultClassDescriptor, it) } + .map { it.createFakeOverrideDescriptor(defaultClassDescriptor) } .filterNotNull() .toList() defaultClassDescriptor.initialize(SimpleMemberScope(contributedDescriptors), constructors, null) @@ -279,31 +280,6 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { 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