[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:
committed by
Space Team
parent
2b8b6a2b21
commit
9fd057d7c3
+1
@@ -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(
|
||||
|
||||
+6
-9
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user