Revert "[IrFakeOverrideBuilder] Support fake overrides for java static methods"

This reverts commit 15094eb03a.
This commit is contained in:
Kirill Rakhman
2024-01-31 16:41:26 +01:00
committed by Space Team
parent 7c4e43938b
commit 6271f5cbe5
4 changed files with 21 additions and 12 deletions
@@ -39,7 +39,7 @@ abstract class FakeOverrideBuilderStrategy(
* if no fake override should be created for this member
*/
fun fakeOverrideMember(superType: IrType, member: IrOverridableMember, clazz: IrClass): IrOverridableMember? {
return if (member.isOverridableMemberOrAccessor() && isVisibleForOverrideInClass(member, clazz))
return if (isVisibleForOverrideInClass(member, clazz))
buildFakeOverrideMember(superType, member, clazz, unimplementedOverridesStrategy)
else
null
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides
import org.jetbrains.kotlin.ir.util.fileOrNull
import org.jetbrains.kotlin.ir.util.isFromJava
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -69,15 +68,16 @@ class IrFakeOverrideBuilder(
val allFromSuper = clazz.superTypes.flatMap { superType ->
val superClass = superType.getClass() ?: error("Unexpected super type: $superType")
superClass.declarations
.filterIsInstance<IrOverridableMember>()
.filter { it.isOverridableMemberOrAccessor() }
.mapNotNull {
val fakeOverride = strategy.fakeOverrideMember(superType, it, clazz) ?: return@mapNotNull null
FakeOverride(fakeOverride, it)
val overriddenMember = it as IrOverridableMember
val fakeOverride = strategy.fakeOverrideMember(superType, overriddenMember, clazz) ?: return@mapNotNull null
FakeOverride(fakeOverride, overriddenMember)
}
}
val allFromSuperByName = allFromSuper.groupBy { it.override.name }
val allFromCurrentByName = clazz.declarations.filterIsInstance<IrOverridableMember>().groupBy { it.name }
val allFromCurrentByName = clazz.declarations.filterIsInstanceAnd<IrOverridableMember> { !it.isStaticMember }.groupBy { it.name }
allFromSuperByName.forEach { (name, superMembers) ->
generateOverridesInFunctionGroup(
@@ -110,7 +110,7 @@ class IrFakeOverrideBuilder(
val superClass = superType.getClass() ?: error("Unexpected super type: $superType")
superClass.declarations
.filterIsInstanceAnd<IrOverridableMember> {
it !in overriddenMembers && it.symbol !in ignoredParentSymbols
it !in overriddenMembers && it.symbol !in ignoredParentSymbols && !it.isStaticMember
}
.mapNotNull { overriddenMember ->
val fakeOverride = strategy.fakeOverrideMember(superType, overriddenMember, clazz) ?: return@mapNotNull null
@@ -126,6 +126,16 @@ class IrFakeOverrideBuilder(
return fakeOverrides
}
private val IrOverridableMember.isStaticMember: Boolean
get() = when (this) {
is IrFunction ->
dispatchReceiverParameter == null
is IrProperty ->
backingField?.isStatic == true ||
getter?.let { it.dispatchReceiverParameter == null } == true
else -> error("Unknown overridable member: ${render()}")
}
private fun generateOverridesInFunctionGroup(
membersFromSupertypes: List<FakeOverride>,
membersFromCurrent: List<IrOverridableMember>,
@@ -172,7 +182,7 @@ class IrFakeOverrideBuilder(
// because of binary incompatible changes, it's possible to have private member colliding with fake override
// In that case we shouldn't generate fake override, but also shouldn't mark them as overridden
if (fromCurrent.isOverridableMemberOrAccessor()) {
if (!DescriptorVisibilities.isPrivate(fromCurrent.visibility)) {
fromCurrent.overriddenSymbols = overridden.memoryOptimizedMap { it.original.symbol }
}
@@ -497,10 +507,10 @@ private val IrOverridableMember.returnType: IrType
}
fun IrSimpleFunction.isOverridableFunction(): Boolean =
!DescriptorVisibilities.isPrivate(visibility) && (hasDispatchReceiver || isFromJava())
!DescriptorVisibilities.isPrivate(visibility) && hasDispatchReceiver
fun IrProperty.isOverridableProperty(): Boolean =
!DescriptorVisibilities.isPrivate(visibility) && (getter.hasDispatchReceiver || setter.hasDispatchReceiver || isFromJava())
!DescriptorVisibilities.isPrivate(visibility) && (getter.hasDispatchReceiver || setter.hasDispatchReceiver)
fun IrDeclaration.isOverridableMemberOrAccessor(): Boolean = when (this) {
is IrSimpleFunction -> isOverridableFunction()
@@ -66,7 +66,6 @@ class IrOverrideChecker(
is IrSimpleFunction -> when {
subMember !is IrSimpleFunction -> return incompatible("Member kind mismatch")
superMember.hasExtensionReceiver != subMember.hasExtensionReceiver -> return incompatible("Receiver presence mismatch")
superMember.hasDispatchReceiver != subMember.hasDispatchReceiver -> return incompatible("Incompatible staticness")
superMember.isSuspend != subMember.isSuspend -> return incompatible("Incompatible suspendability")
checkIsInlineFlag && superMember.isInline -> return incompatible("Inline function can't be overridden")
@@ -80,7 +79,6 @@ class IrOverrideChecker(
is IrProperty -> when {
subMember !is IrProperty -> return incompatible("Member kind mismatch")
superMember.getter.hasExtensionReceiver != subMember.getter.hasExtensionReceiver -> return incompatible("Receiver presence mismatch")
superMember.getter.hasDispatchReceiver != subMember.getter.hasDispatchReceiver -> return incompatible("Incompatible staticness")
checkIsInlineFlag && superMember.isInline -> return incompatible("Inline property can't be overridden")
else -> {
@@ -1,4 +1,5 @@
// TARGET_BACKEND: JVM_IR
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-64150
// FILE: AbstractBlackBoxCodegenTest.java
public abstract class AbstractBlackBoxCodegenTest extends CodegenTestCase {}