IR: fix fake override computation

Due to IR copying in performByIrFile, we need to only distinguish
overrides up to their fqName.
This commit is contained in:
Georgy Bronnikov
2021-01-10 13:51:16 +03:00
parent d154c8d8e6
commit 54a76977db
@@ -55,7 +55,12 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
): Set<IrOverridableMember> {
val visited = mutableSetOf<IrOverridableMember>()
val realOverrides = mutableSetOf<IrOverridableMember>()
val realOverrides = mutableMapOf<Any, IrOverridableMember>()
/*
Due to IR copying in performByIrFile, overrides should only be distinguished up to their fqNames.
*/
fun IrOverridableMember.toKey(): Any = fqNameWhenAvailable ?: this
fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
is IrSimpleFunction -> declaration.overriddenSymbols
@@ -69,7 +74,7 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
if (!visited.add(member) || filter(member)) return
if (member.isReal && !toSkip(member)) {
realOverrides += member
realOverrides[member.toKey()] = member
} else {
overriddenSymbols(member).forEach { collectRealOverrides(it.owner as IrOverridableMember) }
}
@@ -81,15 +86,16 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
if (!visited.add(member)) return
overriddenSymbols(member).forEach {
realOverrides.remove(it.owner)
excludeRepeated(it.owner as IrOverridableMember)
val owner = it.owner as IrOverridableMember
realOverrides.remove(owner.toKey())
excludeRepeated(owner)
}
}
visited.clear()
realOverrides.toList().forEach { excludeRepeated(it) }
realOverrides.toList().forEach { excludeRepeated(it.second) }
return realOverrides
return realOverrides.values.toSet()
}
// TODO: use this implementation instead of any other