Extracted common function for creating fake overrides

This commit is contained in:
Igor Chevdar
2017-04-14 12:44:02 +03:00
parent 8a5659456c
commit 6c97044452
2 changed files with 27 additions and 29 deletions
@@ -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(
@@ -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