From cfa8b36d2463156f2321bb0c44ddb582aa3c134c Mon Sep 17 00:00:00 2001 From: Kirill Berezin Date: Tue, 11 Sep 2012 22:45:13 +0400 Subject: [PATCH] KT-2477 generate fake overrides for members with wider access level first #KT-2477 Fixed --- .../jet/lang/resolve/OverrideResolver.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index a8574ae7f30..f6438bca5a4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -240,12 +240,24 @@ public class OverrideResolver { ) { Queue fromSuperQueue = new LinkedList(notOverridden); while (!fromSuperQueue.isEmpty()) { - CallableMemberDescriptor notOverriddenFromSuper = fromSuperQueue.remove(); + CallableMemberDescriptor notOverriddenFromSuper = findMemberWithMaxVisibility(fromSuperQueue); Collection overridables = extractMembersOverridableBy(notOverriddenFromSuper, fromSuperQueue, sink); createAndBindFakeOverride(notOverriddenFromSuper, overridables, current, sink); } } + @NotNull + private static CallableMemberDescriptor findMemberWithMaxVisibility(@NotNull Queue descriptors) { + CallableMemberDescriptor descriptor = descriptors.element(); + for (CallableMemberDescriptor candidate : descriptors) { + Integer result = Visibilities.compare(descriptor.getVisibility(), candidate.getVisibility()); + if (result != null && result < 0) { + descriptor = candidate; + } + } + return descriptor; + } + private static void createAndBindFakeOverride( @NotNull CallableMemberDescriptor notOverriddenFromSuper, @NotNull Collection overridables, @@ -299,6 +311,11 @@ public class OverrideResolver { overridable.add(overrider); for (Iterator iterator = extractFrom.iterator(); iterator.hasNext(); ) { CallableMemberDescriptor candidate = iterator.next(); + if (overrider == candidate) { + iterator.remove(); + continue; + } + OverridingUtil.OverrideCompatibilityInfo.Result result = OverridingUtil.isOverridableBy(candidate, overrider).getResult(); switch (result) {