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
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
Set<? extends ValueParameterDescriptor> getOverriddenDescriptors();
|
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.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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+10
-7
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user