diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java index aaf2efd2904..afeb84369eb 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java @@ -46,15 +46,34 @@ public class OverridingUtil { private OverridingUtil() { } + private static enum Filtering { + RETAIN_OVERRIDING, + RETAIN_OVERRIDDEN + } + @NotNull public static Set filterOutOverridden(@NotNull Set candidateSet) { - return filterOutOverridden(candidateSet, Function.ID); + return filterOverrides(candidateSet, Function.ID, Filtering.RETAIN_OVERRIDING); + } + + @NotNull + public static Set filterOutOverriding(@NotNull Set candidateSet) { + return filterOverrides(candidateSet, Function.ID, Filtering.RETAIN_OVERRIDDEN); } @NotNull public static Set filterOutOverridden( @NotNull Set candidateSet, @NotNull Function transform + ) { + return filterOverrides(candidateSet, transform, Filtering.RETAIN_OVERRIDING); + } + + @NotNull + private static Set filterOverrides( + @NotNull Set candidateSet, + @NotNull Function transform, + @NotNull Filtering filtering ) { Set candidates = Sets.newLinkedHashSet(); outerLoop: @@ -63,8 +82,18 @@ public class OverridingUtil { for (D otherD : candidateSet) { CallableDescriptor other = transform.fun(otherD); if (me == other) continue; - if (overrides(other, me)) { - continue outerLoop; + if (filtering == Filtering.RETAIN_OVERRIDING) { + if (overrides(other, me)) { + continue outerLoop; + } + } + else if (filtering == Filtering.RETAIN_OVERRIDDEN) { + if (overrides(me, other)) { + continue outerLoop; + } + } + else { + throw new AssertionError("Unexpected Filtering object: " + filtering); } } for (D otherD : candidates) {