[PL] Fix: Don't try to implement non-implemented overridden callables in case of inheritance delegation to Nothing
This commit is contained in:
committed by
Space Team
parent
16da1af525
commit
dd8eedb8da
+14
-6
@@ -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() }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user