From 34d8dd9127a1950d9863b2e86a28a07f9e7035db Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Mon, 1 Feb 2016 21:52:47 +0300 Subject: [PATCH] Add optimization for fake overrides creation. --- .../tests/regressions/kt1639-JFrame.txt | 6 ++++-- .../kotlin/resolve/OverridingUtil.java | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.txt b/compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.txt index 0835aa43840..1cf2b924d51 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.txt +++ b/compiler/testData/diagnostics/tests/regressions/kt1639-JFrame.txt @@ -558,12 +558,14 @@ package test { invisible_fake open override /*1*/ /*fake_override*/ fun reparentChild(/*0*/ p0: java.awt.Component!): kotlin.Unit invisible_fake open override /*1*/ /*fake_override*/ fun reparentTraverse(/*0*/ p0: [ERROR : Unresolved java classifier: ContainerPeer]!, /*1*/ p1: java.awt.Container!): kotlin.Unit public open override /*1*/ /*fake_override*/ fun requestFocus(): kotlin.Unit - public open override /*1*/ /*fake_override*/ fun requestFocus(/*0*/ p0: kotlin.Boolean): kotlin.Boolean + invisible_fake open override /*1*/ /*fake_override*/ fun requestFocus(/*0*/ p0: [ERROR : Unresolved java classifier: Cause]!): kotlin.Boolean + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun requestFocus(/*0*/ p0: kotlin.Boolean): kotlin.Boolean invisible_fake open override /*1*/ /*fake_override*/ fun requestFocus(/*0*/ p0: kotlin.Boolean, /*1*/ p1: [ERROR : Unresolved java classifier: Cause]!): kotlin.Boolean invisible_fake final override /*1*/ /*fake_override*/ fun requestFocusHelper(/*0*/ p0: kotlin.Boolean, /*1*/ p1: kotlin.Boolean): kotlin.Boolean invisible_fake final override /*1*/ /*fake_override*/ fun requestFocusHelper(/*0*/ p0: kotlin.Boolean, /*1*/ p1: kotlin.Boolean, /*2*/ p2: [ERROR : Unresolved java classifier: Cause]!): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun requestFocusInWindow(): kotlin.Boolean - public open override /*1*/ /*fake_override*/ fun requestFocusInWindow(/*0*/ p0: kotlin.Boolean): kotlin.Boolean + invisible_fake open override /*1*/ /*fake_override*/ fun requestFocusInWindow(/*0*/ p0: [ERROR : Unresolved java classifier: Cause]!): kotlin.Boolean + protected/*protected and package*/ open override /*1*/ /*fake_override*/ fun requestFocusInWindow(/*0*/ p0: kotlin.Boolean): kotlin.Boolean invisible_fake open override /*1*/ /*fake_override*/ fun requestFocusInWindow(/*0*/ p0: kotlin.Boolean, /*1*/ p1: [ERROR : Unresolved java classifier: Cause]!): kotlin.Boolean @kotlin.Deprecated(message = "Deprecated in Java") public open override /*1*/ /*fake_override*/ fun reshape(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int, /*3*/ p3: kotlin.Int): kotlin.Unit invisible_fake open override /*1*/ /*fake_override*/ fun reshapeNativePeer(/*0*/ p0: kotlin.Int, /*1*/ p1: kotlin.Int, /*2*/ p2: kotlin.Int, /*3*/ p3: kotlin.Int, /*4*/ p4: kotlin.Int): kotlin.Unit diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java index 0f58e054fca..2ca730dbe10 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java @@ -317,11 +317,32 @@ public class OverridingUtil { return bound; } + private static boolean allHasSameContainingDeclaration(@NotNull Collection notOverridden) { + if (notOverridden.size() < 2) return true; + + final DeclarationDescriptor containingDeclaration = notOverridden.iterator().next().getContainingDeclaration(); + return CollectionsKt.all(notOverridden, new Function1() { + @Override + public Boolean invoke(CallableMemberDescriptor descriptor) { + return descriptor.getContainingDeclaration() == containingDeclaration; + } + }); + } + private static void createAndBindFakeOverrides( @NotNull ClassDescriptor current, @NotNull Collection notOverridden, @NotNull DescriptorSink sink ) { + // Optimization: If all notOverridden descriptors have the same containing declaration, + // then we can just create fake overrides for them, because they should be matched correctly in their containing declaration + if (allHasSameContainingDeclaration(notOverridden)) { + for (CallableMemberDescriptor descriptor : notOverridden) { + createAndBindFakeOverride(Collections.singleton(descriptor), current, sink); + } + return; + } + Queue fromSuperQueue = new LinkedList(notOverridden); while (!fromSuperQueue.isEmpty()) { CallableMemberDescriptor notOverriddenFromSuper = VisibilityUtilKt.findMemberWithMaxVisibility(fromSuperQueue);