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
|
package org.jetbrains.kotlin.backend.konan.ir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
@@ -50,6 +48,30 @@ fun ir2stringWhole(ir: IrElement?, withDescriptors: Boolean = false): String {
|
|||||||
return strWriter.toString()
|
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)
|
internal fun ClassDescriptor.createSimpleDelegatingConstructorDescriptor(superConstructorDescriptor: ClassConstructorDescriptor, isPrimary: Boolean = false)
|
||||||
: ClassConstructorDescriptor {
|
: ClassConstructorDescriptor {
|
||||||
val constructorDescriptor = ClassConstructorDescriptorImpl.createSynthesized(
|
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.getKonanInternalFunctions
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
|
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.createArrayOfExpression
|
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.createSimpleDelegatingConstructor
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructorDescriptor
|
import org.jetbrains.kotlin.backend.konan.ir.createSimpleDelegatingConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
@@ -271,7 +272,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass {
|
|||||||
|
|
||||||
val contributedDescriptors = irClass.descriptor.unsubstitutedMemberScope
|
val contributedDescriptors = irClass.descriptor.unsubstitutedMemberScope
|
||||||
.getContributedDescriptors()
|
.getContributedDescriptors()
|
||||||
.map { createFakeOverrideDescriptor(defaultClassDescriptor, it) }
|
.map { it.createFakeOverrideDescriptor(defaultClassDescriptor) }
|
||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
.toList()
|
.toList()
|
||||||
defaultClassDescriptor.initialize(SimpleMemberScope(contributedDescriptors), constructors, null)
|
defaultClassDescriptor.initialize(SimpleMemberScope(contributedDescriptors), constructors, null)
|
||||||
@@ -279,31 +280,6 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass {
|
|||||||
return defaultClass
|
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() {
|
private fun createImplObject() {
|
||||||
val startOffset = irClass.startOffset
|
val startOffset = irClass.startOffset
|
||||||
val endOffset = irClass.endOffset
|
val endOffset = irClass.endOffset
|
||||||
|
|||||||
Reference in New Issue
Block a user