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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user