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'
This commit is contained in:
Alexander Udalov
2015-08-06 04:05:35 +03:00
parent 5aad063076
commit d328727cea
5 changed files with 16 additions and 26 deletions
@@ -59,6 +59,4 @@ public interface ValueParameterDescriptor extends VariableDescriptor, ParameterD
@NotNull @NotNull
@Override @Override
Set<? extends ValueParameterDescriptor> getOverriddenDescriptors(); Set<? extends ValueParameterDescriptor> getOverriddenDescriptors();
void addOverriddenDescriptor(@NotNull ValueParameterDescriptor overridden);
} }
@@ -22,7 +22,6 @@ import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.DescriptorFactory; import org.jetbrains.kotlin.resolve.DescriptorFactory;
import org.jetbrains.kotlin.resolve.OverridingUtil;
import org.jetbrains.kotlin.types.DescriptorSubstitutor; import org.jetbrains.kotlin.types.DescriptorSubstitutor;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.TypeSubstitutor; import org.jetbrains.kotlin.types.TypeSubstitutor;
@@ -278,11 +277,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
newModality, newModality,
newVisibility newVisibility
); );
if (copyOverrides) { if (copyOverrides) {
for (FunctionDescriptor overriddenFunction : overriddenFunctions) { for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
OverridingUtil.bindOverride(substitutedDescriptor, overriddenFunction.substitute(substitutor)); substitutedDescriptor.addOverriddenDescriptor(overriddenFunction.substitute(substitutor));
} }
} }
return substitutedDescriptor; return substitutedDescriptor;
} }
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.resolve.DescriptorFactory; import org.jetbrains.kotlin.resolve.DescriptorFactory;
import org.jetbrains.kotlin.resolve.OverridingUtil;
import org.jetbrains.kotlin.types.DescriptorSubstitutor; import org.jetbrains.kotlin.types.DescriptorSubstitutor;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.TypeSubstitutor; import org.jetbrains.kotlin.types.TypeSubstitutor;
@@ -273,7 +272,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
if (copyOverrides) { if (copyOverrides) {
for (PropertyDescriptor propertyDescriptor : overriddenProperties) { for (PropertyDescriptor propertyDescriptor : overriddenProperties) {
OverridingUtil.bindOverride(substitutedDescriptor, propertyDescriptor.substitute(substitutor)); substitutedDescriptor.addOverriddenDescriptor(propertyDescriptor.substitute(substitutor));
} }
} }
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.descriptors.impl; package org.jetbrains.kotlin.descriptors.impl;
import kotlin.KotlinPackage;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
@@ -26,7 +28,6 @@ import org.jetbrains.kotlin.types.JetType;
import org.jetbrains.kotlin.types.TypeSubstitutor; import org.jetbrains.kotlin.types.TypeSubstitutor;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set; import java.util.Set;
public class ValueParameterDescriptorImpl extends VariableDescriptorImpl implements ValueParameterDescriptor { public class ValueParameterDescriptorImpl extends VariableDescriptorImpl implements ValueParameterDescriptor {
@@ -34,7 +35,6 @@ public class ValueParameterDescriptorImpl extends VariableDescriptorImpl impleme
private final JetType varargElementType; private final JetType varargElementType;
private final int index; private final int index;
private final ValueParameterDescriptor original; private final ValueParameterDescriptor original;
private final Set<ValueParameterDescriptor> overriddenDescriptors = new LinkedHashSet<ValueParameterDescriptor>(); // Linked is essential
public ValueParameterDescriptorImpl( public ValueParameterDescriptorImpl(
@NotNull CallableDescriptor containingDeclaration, @NotNull CallableDescriptor containingDeclaration,
@@ -123,11 +123,14 @@ public class ValueParameterDescriptorImpl extends VariableDescriptorImpl impleme
@NotNull @NotNull
@Override @Override
public Set<? extends ValueParameterDescriptor> getOverriddenDescriptors() { public Set<? extends ValueParameterDescriptor> getOverriddenDescriptors() {
return Collections.unmodifiableSet(overriddenDescriptors); Set<? extends CallableDescriptor> overriddenFunctions = getContainingDeclaration().getOverriddenDescriptors();
} if (overriddenFunctions.isEmpty()) return Collections.emptySet();
@Override return KotlinPackage.toSet(KotlinPackage.map(overriddenFunctions, new Function1<CallableDescriptor, ValueParameterDescriptor>() {
public void addOverriddenDescriptor(@NotNull ValueParameterDescriptor overridden) { @Override
overriddenDescriptors.add(overridden); public ValueParameterDescriptor invoke(CallableDescriptor descriptor) {
return descriptor.getValueParameters().get(getIndex());
}
}));
} }
} }
@@ -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( public static void generateOverridesInFunctionGroup(
@SuppressWarnings("UnusedParameters") @SuppressWarnings("UnusedParameters")
@NotNull Name name, //DO NOT DELETE THIS PARAMETER: needed to make sure all descriptors have the same name @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) { switch (result) {
case OVERRIDABLE: case OVERRIDABLE:
if (isVisible) { if (isVisible) {
bindOverride(fromCurrent, fromSupertype); fromCurrent.addOverriddenDescriptor(fromSupertype);
} }
bound.add(fromSupertype); bound.add(fromSupertype);
break; break;
@@ -354,7 +343,7 @@ public class OverridingUtil {
CallableMemberDescriptor fakeOverride = CallableMemberDescriptor fakeOverride =
mostSpecific.copy(current, modality, visibility, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false); mostSpecific.copy(current, modality, visibility, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false);
for (CallableMemberDescriptor descriptor : effectiveOverridden) { for (CallableMemberDescriptor descriptor : effectiveOverridden) {
bindOverride(fakeOverride, descriptor); fakeOverride.addOverriddenDescriptor(descriptor);
} }
sink.addFakeOverride(fakeOverride); sink.addFakeOverride(fakeOverride);
} }