[IR] Simplify usage of IrOverrideUtil

It had some copy-pasted code for counting current file on each use-site.
Now it's encapsulated in strategy.

KT-61934
This commit is contained in:
Pavel Kunyavskiy
2023-09-18 12:39:49 +02:00
committed by Space Team
parent 2b8b6a2b21
commit 9fd057d7c3
4 changed files with 32 additions and 29 deletions
@@ -40,6 +40,7 @@ abstract class FakeOverrideBuilderStrategy(
else -> error("Unexpected fake override: $fakeOverride")
}
}
abstract fun inFile(file: IrFile?, block: () -> Unit)
protected abstract fun linkFunctionFakeOverride(function: IrFunctionWithLateBinding, manglerCompatibleMode: Boolean)
protected abstract fun linkPropertyFakeOverride(property: IrPropertyWithLateBinding, manglerCompatibleMode: Boolean)
@@ -14,6 +14,7 @@ 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.collectAndFilterRealOverrides
import org.jetbrains.kotlin.ir.util.fileOrNull
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo
import org.jetbrains.kotlin.types.AbstractTypeChecker
@@ -61,30 +62,32 @@ class IrOverridingUtil(
}
fun buildFakeOverridesForClass(clazz: IrClass, oldSignatures: Boolean) {
val superTypes = clazz.superTypes
fakeOverrideBuilder.inFile(clazz.fileOrNull) {
val superTypes = clazz.superTypes
val fromCurrent = clazz.declarations.filterIsInstance<IrOverridableMember>()
val fromCurrent = clazz.declarations.filterIsInstance<IrOverridableMember>()
val allFromSuper = superTypes.flatMap { superType ->
val superClass = superType.getClass() ?: error("Unexpected super type: $superType")
superClass.declarations
.filter { it.isOverridableMemberOrAccessor() }
.map {
val overriddenMember = it as IrOverridableMember
val fakeOverride = fakeOverrideBuilder.fakeOverrideMember(superType, overriddenMember, clazz)
FakeOverride(fakeOverride, overriddenMember)
}
}
val allFromSuper = superTypes.flatMap { superType ->
val superClass = superType.getClass() ?: error("Unexpected super type: $superType")
superClass.declarations
.filter { it.isOverridableMemberOrAccessor() }
.map {
val overriddenMember = it as IrOverridableMember
val fakeOverride = fakeOverrideBuilder.fakeOverrideMember(superType, overriddenMember, clazz)
FakeOverride(fakeOverride, overriddenMember)
}
}
val allFromSuperByName = allFromSuper.groupBy { it.override.name }
val allFromSuperByName = allFromSuper.groupBy { it.override.name }
allFromSuperByName.forEach { group ->
generateOverridesInFunctionGroup(
group.value,
fromCurrent.filter { it.name == group.key && !it.isStaticMember },
clazz,
oldSignatures
)
allFromSuperByName.forEach { group ->
generateOverridesInFunctionGroup(
group.value,
fromCurrent.filter { it.name == group.key && !it.isStaticMember },
clazz,
oldSignatures
)
}
}
}
@@ -1249,6 +1249,8 @@ private object BindToNewEmptySymbols : FakeOverrideBuilderStrategy(
linkFunctionFakeOverride(it as? IrFunctionWithLateBinding ?: error("Unexpected fake override setter: $it"), manglerCompatibleMode)
}
}
override fun inFile(file: IrFile?, block: () -> Unit) { block() }
}
fun IrClass.addFakeOverrides(
@@ -86,6 +86,11 @@ private class IrLinkerFakeOverrideBuilderStrategy(
friendModules = friendModules,
unimplementedOverridesStrategy = unimplementedOverridesStrategy
) {
override fun inFile(file: IrFile?, block: () -> Unit) {
fakeOverrideDeclarationTable.inFile(file, block)
}
override fun linkFunctionFakeOverride(function: IrFunctionWithLateBinding, manglerCompatibleMode: Boolean) {
val (signature, symbol) = computeFunctionFakeOverrideSymbol(function, manglerCompatibleMode)
@@ -286,19 +291,11 @@ class IrLinkerFakeOverrideProvider(
if (!platformSpecificClassFilter.needToConstructFakeOverrides(clazz)) return false
buildFakeOverridesForSingleClass(clazz, compatibilityMode)
irOverridingUtil.buildFakeOverridesForClass(clazz, compatibilityMode.oldSignatures)
return true
}
fun buildFakeOverridesForSingleClass(clazz: IrClass, compatibilityMode: CompatibilityMode) {
fakeOverrideDeclarationTable.run {
inFile(clazz.fileOrNull) {
irOverridingUtil.buildFakeOverridesForClass(clazz, compatibilityMode.oldSignatures)
}
}
}
fun provideFakeOverrides(klass: IrClass, compatibilityMode: CompatibilityMode) {
buildFakeOverrideChainsForClass(klass, compatibilityMode)
haveFakeOverrides.add(klass)