[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.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
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.declarations.IrOverridableMember
|
||||||
import org.jetbrains.kotlin.ir.linkage.partial.IrUnimplementedOverridesStrategy
|
import org.jetbrains.kotlin.ir.linkage.partial.IrUnimplementedOverridesStrategy
|
||||||
import org.jetbrains.kotlin.ir.linkage.partial.PartiallyLinkedDeclarationOrigin
|
import org.jetbrains.kotlin.ir.linkage.partial.PartiallyLinkedDeclarationOrigin
|
||||||
|
import org.jetbrains.kotlin.ir.types.isNothing
|
||||||
|
|
||||||
internal object ImplementAsErrorThrowingStubs : IrUnimplementedOverridesStrategy {
|
internal object ImplementAsErrorThrowingStubs : IrUnimplementedOverridesStrategy {
|
||||||
override fun <T : IrOverridableMember> computeCustomization(overridableMember: T, parent: IrClass) =
|
override fun <T : IrOverridableMember> computeCustomization(overridableMember: T, parent: IrClass) =
|
||||||
if (overridableMember.modality == Modality.ABSTRACT
|
if (overridableMember.isAbstract && parent.isConcrete && !parent.delegatesToNothing) {
|
||||||
&& parent.modality != Modality.ABSTRACT
|
|
||||||
&& parent.modality != Modality.SEALED
|
|
||||||
) {
|
|
||||||
IrUnimplementedOverridesStrategy.Customization(
|
IrUnimplementedOverridesStrategy.Customization(
|
||||||
origin = PartiallyLinkedDeclarationOrigin.UNIMPLEMENTED_ABSTRACT_CALLABLE_MEMBER,
|
origin = PartiallyLinkedDeclarationOrigin.UNIMPLEMENTED_ABSTRACT_CALLABLE_MEMBER,
|
||||||
modality = parent.modality // Use modality of class for implemented callable member.
|
modality = parent.modality // Use modality of class for implemented callable member.
|
||||||
)
|
)
|
||||||
} else
|
} else IrUnimplementedOverridesStrategy.Customization.NO
|
||||||
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