IR: remove isFromJava check from isOverridableMemberOrAccessor
This is needed because in case a static member is inherited via a Kotlin class (class C in the newly added test), its origin becomes FAKE_OVERRIDE which is technically not Java anymore. After this change, we'll build fake overrides for static members from superclasses regardless of whether they come from Java or Kotlin. Also, move the previous logic of isOverridableFunction/isOverridableProperty to the only call site at IdSignatureFactory. #KT-65589 Fixed
This commit is contained in:
committed by
Space Team
parent
03418c11c3
commit
b72effab98
+5
-3
@@ -5,13 +5,15 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.overrides
|
||||
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.types.IrSimpleType
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.IrTypeProjection
|
||||
import org.jetbrains.kotlin.ir.types.extractTypeParameters
|
||||
import org.jetbrains.kotlin.ir.util.getPackageFragment
|
||||
import org.jetbrains.kotlin.ir.util.hasAnnotation
|
||||
import org.jetbrains.kotlin.ir.util.render
|
||||
@@ -39,7 +41,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
|
||||
|
||||
@@ -13,7 +13,10 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides
|
||||
import org.jetbrains.kotlin.ir.util.fileOrNull
|
||||
import org.jetbrains.kotlin.ir.util.isClass
|
||||
import org.jetbrains.kotlin.ir.util.render
|
||||
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
import org.jetbrains.kotlin.types.TypeCheckerState
|
||||
@@ -204,7 +207,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 }
|
||||
}
|
||||
|
||||
@@ -527,15 +530,3 @@ private val IrOverridableMember.returnType: IrType
|
||||
is IrProperty -> getter!!.returnType
|
||||
else -> error("Unexpected type of declaration: ${this::class.java}, $this")
|
||||
}
|
||||
|
||||
fun IrSimpleFunction.isOverridableFunction(): Boolean =
|
||||
!DescriptorVisibilities.isPrivate(visibility) && (hasDispatchReceiver || isFromJava())
|
||||
|
||||
fun IrProperty.isOverridableProperty(): Boolean =
|
||||
!DescriptorVisibilities.isPrivate(visibility) && (getter.hasDispatchReceiver || setter.hasDispatchReceiver || isFromJava())
|
||||
|
||||
fun IrDeclaration.isOverridableMemberOrAccessor(): Boolean = when (this) {
|
||||
is IrSimpleFunction -> isOverridableFunction()
|
||||
is IrProperty -> isOverridableProperty()
|
||||
else -> false
|
||||
}
|
||||
|
||||
@@ -191,9 +191,6 @@ class IrOverrideChecker(
|
||||
private val IrSimpleFunction?.hasExtensionReceiver: Boolean
|
||||
get() = this?.extensionReceiverParameter != null
|
||||
|
||||
internal val IrSimpleFunction?.hasDispatchReceiver: Boolean
|
||||
get() = this?.dispatchReceiverParameter != null
|
||||
|
||||
private val IrSimpleFunction.compiledValueParameters: List<IrValueParameter>
|
||||
get() = ArrayList<IrValueParameter>(valueParameters.size + 1).apply {
|
||||
extensionReceiverParameter?.let(::add)
|
||||
|
||||
+10
-6
@@ -11,13 +11,8 @@ import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.overrides.isOverridableFunction
|
||||
import org.jetbrains.kotlin.ir.overrides.isOverridableProperty
|
||||
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
||||
import org.jetbrains.kotlin.ir.util.isFacadeClass
|
||||
import org.jetbrains.kotlin.ir.util.render
|
||||
import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
|
||||
@@ -277,4 +272,13 @@ class IdSignatureFactory(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun IrSimpleFunction.isOverridableFunction(): Boolean =
|
||||
!DescriptorVisibilities.isPrivate(visibility) && (hasDispatchReceiver || isFromJava())
|
||||
|
||||
private fun IrProperty.isOverridableProperty(): Boolean =
|
||||
!DescriptorVisibilities.isPrivate(visibility) && (getter.hasDispatchReceiver || setter.hasDispatchReceiver || isFromJava())
|
||||
|
||||
private val IrSimpleFunction?.hasDispatchReceiver: Boolean
|
||||
get() = this?.dispatchReceiverParameter != null
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user