IR: refactor resolveFakeOverride call sites

Split it to 4 functions for clarity: resolveFakeOverride,
resolveFakeOverrideOrFail, resolveFakeOverrideMaybeAbstract,
resolveFakeOverrideMaybeAbstractOrFail. Remove/inline duplicated
utilities and remove unused parameters.
This commit is contained in:
Alexander Udalov
2023-08-23 15:37:01 +02:00
committed by Space Team
parent e52529a1d1
commit b5ba9ee671
19 changed files with 72 additions and 80 deletions
@@ -778,7 +778,7 @@ private fun shouldDeclarationBeExported(declaration: IrDeclarationWithName, cont
fun IrOverridableDeclaration<*>.isAllowedFakeOverriddenDeclaration(context: JsIrBackendContext): Boolean {
val firstExportedRealOverride = runIf(isFakeOverride) {
resolveFakeOverrideOrNull(allowAbstract = true) { it === this || it.parentClassOrNull?.isExported(context) != true }
resolveFakeOverrideMaybeAbstract { it === this || it.parentClassOrNull?.isExported(context) != true }
}
if (firstExportedRealOverride?.parentClassOrNull.isExportedInterface(context)) {
@@ -6,14 +6,16 @@
package org.jetbrains.kotlin.ir.backend.js.ic
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.isFakeOverride
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.ir.util.resolveFakeOverride
import org.jetbrains.kotlin.ir.util.resolveFakeOverrideOrFail
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
@@ -35,12 +37,8 @@ internal class IdSignatureHashCalculator(private val icHasher: ICHasher) {
private val IrFunction.inlineFunctionFlatHash: ICHash
get() = inlineFunctionFlatHashes.getOrPut(this) {
val flatHash = if (isFakeOverride && this is IrSimpleFunction) {
resolveFakeOverride()?.let { icHasher.calculateIrFunctionHash(it) }
?: icError("can not resolve fake override for ${render()}")
} else {
icHasher.calculateIrFunctionHash(this)
}
val function = if (isFakeOverride && this is IrSimpleFunction) resolveFakeOverrideOrFail() else this
val flatHash = icHasher.calculateIrFunctionHash(function)
ICHash(symbol.calculateSymbolHash().hash.combineWith(flatHash.hash))
}
@@ -248,3 +248,9 @@ data class IrBasedFunctionHandle(val function: IrSimpleFunction) : FunctionHandl
override fun getOverridden() =
function.overriddenSymbols.map { IrBasedFunctionHandle(it.owner) }
}
private fun IrSimpleFunction.findInterfaceImplementation(): IrSimpleFunction? {
if (isReal) return null
return resolveFakeOverride()?.run { if (parentAsClass.isInterface) this else null }
}
@@ -195,7 +195,7 @@ fun translateCall(
expression.superQualifierSymbol?.let { superQualifier ->
val (target: IrSimpleFunction, klass: IrClass) = if (superQualifier.owner.isInterface) {
val impl = function.resolveFakeOverride()!!
val impl = function.resolveFakeOverrideOrFail()
Pair(impl, impl.parentAsClass)
} else {
Pair(function, superQualifier.owner)