diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt index 5639181114c..02e4499893c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt @@ -55,7 +55,12 @@ fun Collection.collectAndFilterRealOverrides( ): Set { val visited = mutableSetOf() - val realOverrides = mutableSetOf() + val realOverrides = mutableMapOf() + + /* + 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.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.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