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> { ): Set<IrOverridableMember> {
val visited = mutableSetOf<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) { fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
is IrSimpleFunction -> declaration.overriddenSymbols is IrSimpleFunction -> declaration.overriddenSymbols
@@ -69,7 +74,7 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
if (!visited.add(member) || filter(member)) return if (!visited.add(member) || filter(member)) return
if (member.isReal && !toSkip(member)) { if (member.isReal && !toSkip(member)) {
realOverrides += member realOverrides[member.toKey()] = member
} else { } else {
overriddenSymbols(member).forEach { collectRealOverrides(it.owner as IrOverridableMember) } overriddenSymbols(member).forEach { collectRealOverrides(it.owner as IrOverridableMember) }
} }
@@ -81,15 +86,16 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
if (!visited.add(member)) return if (!visited.add(member)) return
overriddenSymbols(member).forEach { overriddenSymbols(member).forEach {
realOverrides.remove(it.owner) val owner = it.owner as IrOverridableMember
excludeRepeated(it.owner as IrOverridableMember) realOverrides.remove(owner.toKey())
excludeRepeated(owner)
} }
} }
visited.clear() 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 // TODO: use this implementation instead of any other