Extracted common function for creating fake overrides
This commit is contained in:
+25
-3
@@ -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(
|
||||
|
||||
+2
-26
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user