From 9fd057d7c309ea302784374f13b7b3069940294a Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Mon, 18 Sep 2023 12:39:49 +0200 Subject: [PATCH] [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 --- .../overrides/FakeOverrideBuilderStrategy.kt | 1 + .../kotlin/ir/overrides/IrOverridingUtil.kt | 43 ++++++++++--------- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 2 + .../backend/common/overrides/FakeOverrides.kt | 15 +++---- 4 files changed, 32 insertions(+), 29 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt index bb628aac301..f73b3372776 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/FakeOverrideBuilderStrategy.kt @@ -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) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt index 14d3c6c635f..e25ddfca3fd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt @@ -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() + val fromCurrent = clazz.declarations.filterIsInstance() - 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 + ) + } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index f408591b9b9..886cefbf76a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -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( diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt index 2b908f2ad4a..f08d3476ddc 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt @@ -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)