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:
@@ -59,6 +59,4 @@ public interface ValueParameterDescriptor extends VariableDescriptor, ParameterD
|
||||
@NotNull
|
||||
@Override
|
||||
Set<? extends ValueParameterDescriptor> getOverriddenDescriptors();
|
||||
|
||||
void addOverriddenDescriptor(@NotNull ValueParameterDescriptor overridden);
|
||||
}
|
||||
|
||||
+3
-2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-7
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user