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
@Override
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.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;
}
@@ -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));
}
}
@@ -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<ValueParameterDescriptor> overriddenDescriptors = new LinkedHashSet<ValueParameterDescriptor>(); // Linked is essential
public ValueParameterDescriptorImpl(
@NotNull CallableDescriptor containingDeclaration,
@@ -123,11 +123,14 @@ public class ValueParameterDescriptorImpl extends VariableDescriptorImpl impleme
@NotNull
@Override
public Set<? extends ValueParameterDescriptor> getOverriddenDescriptors() {
return Collections.unmodifiableSet(overriddenDescriptors);
}
Set<? extends CallableDescriptor> 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<CallableDescriptor, ValueParameterDescriptor>() {
@Override
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(
@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);
}