From d328727cea3e68bba5038e6c60f67aaf4199aaef Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 6 Aug 2015 04:05:35 +0300 Subject: [PATCH] Don't store overridden descriptors in ValueParameterDescriptor Compute it on each access instead, because it's too costly and not really needed to store a LinkedHashSet for each parameter. Also inline 'bindFakeOverride' --- .../descriptors/ValueParameterDescriptor.java | 2 -- .../impl/FunctionDescriptorImpl.java | 5 +++-- .../impl/PropertyDescriptorImpl.java | 3 +-- .../impl/ValueParameterDescriptorImpl.java | 17 ++++++++++------- .../kotlin/resolve/OverridingUtil.java | 15 ++------------- 5 files changed, 16 insertions(+), 26 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.java index f9afa4f7a20..b2cbbfc1d62 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ValueParameterDescriptor.java @@ -59,6 +59,4 @@ public interface ValueParameterDescriptor extends VariableDescriptor, ParameterD @NotNull @Override Set getOverriddenDescriptors(); - - void addOverriddenDescriptor(@NotNull ValueParameterDescriptor overridden); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index aa5d32855c5..641c1a59142 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.DescriptorFactory; -import org.jetbrains.kotlin.resolve.OverridingUtil; import org.jetbrains.kotlin.types.DescriptorSubstitutor; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.TypeSubstitutor; @@ -278,11 +277,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo newModality, newVisibility ); + if (copyOverrides) { for (FunctionDescriptor overriddenFunction : overriddenFunctions) { - OverridingUtil.bindOverride(substitutedDescriptor, overriddenFunction.substitute(substitutor)); + substitutedDescriptor.addOverriddenDescriptor(overriddenFunction.substitute(substitutor)); } } + return substitutedDescriptor; } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java index 05641bac688..859767d77e4 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.DescriptorFactory; -import org.jetbrains.kotlin.resolve.OverridingUtil; import org.jetbrains.kotlin.types.DescriptorSubstitutor; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.TypeSubstitutor; @@ -273,7 +272,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp if (copyOverrides) { for (PropertyDescriptor propertyDescriptor : overriddenProperties) { - OverridingUtil.bindOverride(substitutedDescriptor, propertyDescriptor.substitute(substitutor)); + substitutedDescriptor.addOverriddenDescriptor(propertyDescriptor.substitute(substitutor)); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.java index 940a9642afb..92c37a58c7f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ValueParameterDescriptorImpl.java @@ -16,6 +16,8 @@ package org.jetbrains.kotlin.descriptors.impl; +import kotlin.KotlinPackage; +import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; @@ -26,7 +28,6 @@ import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.TypeSubstitutor; import java.util.Collections; -import java.util.LinkedHashSet; import java.util.Set; public class ValueParameterDescriptorImpl extends VariableDescriptorImpl implements ValueParameterDescriptor { @@ -34,7 +35,6 @@ public class ValueParameterDescriptorImpl extends VariableDescriptorImpl impleme private final JetType varargElementType; private final int index; private final ValueParameterDescriptor original; - private final Set overriddenDescriptors = new LinkedHashSet(); // Linked is essential public ValueParameterDescriptorImpl( @NotNull CallableDescriptor containingDeclaration, @@ -123,11 +123,14 @@ public class ValueParameterDescriptorImpl extends VariableDescriptorImpl impleme @NotNull @Override public Set getOverriddenDescriptors() { - return Collections.unmodifiableSet(overriddenDescriptors); - } + Set overriddenFunctions = getContainingDeclaration().getOverriddenDescriptors(); + if (overriddenFunctions.isEmpty()) return Collections.emptySet(); - @Override - public void addOverriddenDescriptor(@NotNull ValueParameterDescriptor overridden) { - overriddenDescriptors.add(overridden); + return KotlinPackage.toSet(KotlinPackage.map(overriddenFunctions, new Function1() { + @Override + public ValueParameterDescriptor invoke(CallableDescriptor descriptor) { + return descriptor.getValueParameters().get(getIndex()); + } + })); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java index ab6175cb5ad..f8b9ee6d296 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java @@ -230,17 +230,6 @@ public class OverridingUtil { } } - public static void bindOverride(CallableMemberDescriptor fromCurrent, CallableMemberDescriptor fromSupertype) { - fromCurrent.addOverriddenDescriptor(fromSupertype); - - for (ValueParameterDescriptor parameterFromCurrent : fromCurrent.getValueParameters()) { - assert parameterFromCurrent.getIndex() < fromSupertype.getValueParameters().size() - : "An override relation between functions implies that they have the same number of value parameters"; - ValueParameterDescriptor parameterFromSupertype = fromSupertype.getValueParameters().get(parameterFromCurrent.getIndex()); - parameterFromCurrent.addOverriddenDescriptor(parameterFromSupertype); - } - } - public static void generateOverridesInFunctionGroup( @SuppressWarnings("UnusedParameters") @NotNull Name name, //DO NOT DELETE THIS PARAMETER: needed to make sure all descriptors have the same name @@ -274,7 +263,7 @@ public class OverridingUtil { switch (result) { case OVERRIDABLE: if (isVisible) { - bindOverride(fromCurrent, fromSupertype); + fromCurrent.addOverriddenDescriptor(fromSupertype); } bound.add(fromSupertype); break; @@ -354,7 +343,7 @@ public class OverridingUtil { CallableMemberDescriptor fakeOverride = mostSpecific.copy(current, modality, visibility, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false); for (CallableMemberDescriptor descriptor : effectiveOverridden) { - bindOverride(fakeOverride, descriptor); + fakeOverride.addOverriddenDescriptor(descriptor); } sink.addFakeOverride(fakeOverride); }