Add optimization for fake overrides creation.

This commit is contained in:
Stanislav Erokhin
2016-02-01 21:52:47 +03:00
parent ec991b4ced
commit 34d8dd9127
2 changed files with 25 additions and 2 deletions
@@ -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
@@ -317,11 +317,32 @@ public class OverridingUtil {
return bound;
}
private static boolean allHasSameContainingDeclaration(@NotNull Collection<CallableMemberDescriptor> notOverridden) {
if (notOverridden.size() < 2) return true;
final DeclarationDescriptor containingDeclaration = notOverridden.iterator().next().getContainingDeclaration();
return CollectionsKt.all(notOverridden, new Function1<CallableMemberDescriptor, Boolean>() {
@Override
public Boolean invoke(CallableMemberDescriptor descriptor) {
return descriptor.getContainingDeclaration() == containingDeclaration;
}
});
}
private static void createAndBindFakeOverrides(
@NotNull ClassDescriptor current,
@NotNull Collection<CallableMemberDescriptor> 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<CallableMemberDescriptor> fromSuperQueue = new LinkedList<CallableMemberDescriptor>(notOverridden);
while (!fromSuperQueue.isEmpty()) {
CallableMemberDescriptor notOverriddenFromSuper = VisibilityUtilKt.findMemberWithMaxVisibility(fromSuperQueue);