[PL] Fix: Don't try to implement non-implemented overridden callables in case of inheritance delegation to Nothing

This commit is contained in:
Dmitriy Dolovov
2023-04-16 21:40:08 +02:00
committed by Space Team
parent 16da1af525
commit dd8eedb8da
@@ -7,20 +7,28 @@ package org.jetbrains.kotlin.backend.common.linkage.partial
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrOverridableMember
import org.jetbrains.kotlin.ir.linkage.partial.IrUnimplementedOverridesStrategy
import org.jetbrains.kotlin.ir.linkage.partial.PartiallyLinkedDeclarationOrigin
import org.jetbrains.kotlin.ir.types.isNothing
internal object ImplementAsErrorThrowingStubs : IrUnimplementedOverridesStrategy {
override fun <T : IrOverridableMember> computeCustomization(overridableMember: T, parent: IrClass) =
if (overridableMember.modality == Modality.ABSTRACT
&& parent.modality != Modality.ABSTRACT
&& parent.modality != Modality.SEALED
) {
if (overridableMember.isAbstract && parent.isConcrete && !parent.delegatesToNothing) {
IrUnimplementedOverridesStrategy.Customization(
origin = PartiallyLinkedDeclarationOrigin.UNIMPLEMENTED_ABSTRACT_CALLABLE_MEMBER,
modality = parent.modality // Use modality of class for implemented callable member.
)
} else
IrUnimplementedOverridesStrategy.Customization.NO
} else IrUnimplementedOverridesStrategy.Customization.NO
private val IrOverridableMember.isAbstract: Boolean
get() = modality == Modality.ABSTRACT
private val IrClass.isConcrete: Boolean
get() = modality != Modality.ABSTRACT && modality != Modality.SEALED
private val IrClass.delegatesToNothing: Boolean
get() = declarations.any { it is IrField && it.origin == IrDeclarationOrigin.DELEGATE && it.type.isNothing() }
}