Replace 'addOverriddenDescriptor' with 'setOverriddenDescriptors'

It helps to get rid of redundant SmartSets (e.g. for top-level functions)
This commit is contained in:
Denis Zharkov
2016-02-08 11:38:46 +03:00
parent c1f57b743b
commit fae6de9acd
14 changed files with 56 additions and 43 deletions
@@ -195,7 +195,7 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(),
Modality.OPEN, erasedInterfaceFunction.getVisibility());
descriptorForBridges.addOverriddenDescriptor(erasedInterfaceFunction);
DescriptorUtilsKt.setSingleOverridden(descriptorForBridges, erasedInterfaceFunction);
functionCodegen.generateBridges(descriptorForBridges);
}
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt;
import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.util.OperatorNameConventions;
@@ -165,7 +166,7 @@ public class SamWrapperCodegen {
originalInterfaceErased.getValueParameters(), originalInterfaceErased.getReturnType(),
Modality.OPEN, originalInterfaceErased.getVisibility());
descriptorForBridges.addOverriddenDescriptor(originalInterfaceErased);
DescriptorUtilsKt.setSingleOverridden(descriptorForBridges, originalInterfaceErased);
codegen.generateBridges(descriptorForBridges);
}
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.util.OperatorNameConventions
import java.util.*
@@ -48,7 +49,7 @@ fun createSynthesizedInvokes(functions: Collection<FunctionDescriptor>): Collect
CallableMemberDescriptor.Kind.FAKE_OVERRIDE,
true
)
fakeOverride.addOverriddenDescriptor(synthesizedSuperFun)
fakeOverride.setSingleOverridden(synthesizedSuperFun)
fakeOverride
}
@@ -97,9 +97,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
enhanced.setCompileTimeInitializer(compileTimeInitializer);
}
for (PropertyDescriptor descriptor : getOverriddenDescriptors()) {
enhanced.addOverriddenDescriptor(descriptor);
}
enhanced.setOverriddenDescriptors(getOverriddenDescriptors());
enhanced.setType(
enhancedReturnType,
@@ -29,7 +29,7 @@ public interface CallableMemberDescriptor extends CallableDescriptor, MemberDesc
@Override
CallableMemberDescriptor getOriginal();
void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overridden);
void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors);
enum Kind {
DECLARATION,
@@ -123,8 +123,8 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements
}
@Override
public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overriddenFunction) {
throw new UnsupportedOperationException("Constructors cannot override anything");
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
assert overriddenDescriptors.isEmpty() : "Constructors cannot override anything";
}
@NotNull
@@ -29,10 +29,7 @@ import org.jetbrains.kotlin.types.Variance;
import org.jetbrains.kotlin.utils.CollectionsKt;
import org.jetbrains.kotlin.utils.SmartSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.*;
public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRootImpl implements FunctionDescriptor {
private List<TypeParameterDescriptor> typeParameters;
@@ -50,7 +47,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private boolean isHidden = false;
private boolean hasStableParameterNames = true;
private boolean hasSynthesizedParameterNames = false;
private final Set<FunctionDescriptor> overriddenFunctions = SmartSet.create();
private Collection<? extends FunctionDescriptor> overriddenFunctions = null;
private final FunctionDescriptor original;
private final Kind kind;
@Nullable
@@ -165,7 +162,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
@NotNull
@Override
public Collection<? extends FunctionDescriptor> getOverriddenDescriptors() {
return overriddenFunctions;
return overriddenFunctions != null ? overriddenFunctions : Collections.<FunctionDescriptor>emptyList();
}
@NotNull
@@ -184,7 +181,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
public boolean isOperator() {
if (isOperator) return true;
for (FunctionDescriptor descriptor : overriddenFunctions) {
for (FunctionDescriptor descriptor : getOverriddenDescriptors()) {
if (descriptor.isOperator()) return true;
}
@@ -195,7 +192,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
public boolean isInfix() {
if (isInfix) return true;
for (FunctionDescriptor descriptor : overriddenFunctions) {
for (FunctionDescriptor descriptor : getOverriddenDescriptors()) {
if (descriptor.isInfix()) return true;
}
@@ -223,8 +220,9 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
}
@Override
public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overriddenFunction) {
overriddenFunctions.add((FunctionDescriptor) overriddenFunction);
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
//noinspection unchecked
overriddenFunctions = (Collection<? extends FunctionDescriptor>) overriddenDescriptors;
}
@Override
@@ -522,14 +520,16 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
substitutedDescriptor.setInitialSignatureDescriptor(initialSignatureSubstituted);
}
if (configuration.copyOverrides) {
for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
if (configuration.originalSubstitutor.isEmpty()) {
substitutedDescriptor.addOverriddenDescriptor(overriddenFunction);
}
else {
substitutedDescriptor.addOverriddenDescriptor(overriddenFunction.substitute(substitutor));
if (configuration.copyOverrides && !getOverriddenDescriptors().isEmpty()) {
if (configuration.originalSubstitutor.isEmpty()) {
substitutedDescriptor.setOverriddenDescriptors(getOverriddenDescriptors());
}
else {
Collection<CallableMemberDescriptor> substitutedOverridden = SmartSet.create();
for (FunctionDescriptor overriddenFunction : getOverriddenDescriptors()) {
substitutedOverridden.add(overriddenFunction.substitute(substitutor));
}
substitutedDescriptor.setOverriddenDescriptors(substitutedOverridden);
}
}
@@ -184,8 +184,8 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
}
@Override
public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overridden) {
throw new IllegalStateException();
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
assert overriddenDescriptors.isEmpty() : "Overridden accessors should be empty";
}
@NotNull
@@ -36,7 +36,7 @@ import static org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getB
public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImpl implements PropertyDescriptor {
private final Modality modality;
private Visibility visibility;
private final Set<PropertyDescriptor> overriddenProperties = SmartSet.create();
private Collection<? extends PropertyDescriptor> overriddenProperties = null;
private final PropertyDescriptor original;
private final Kind kind;
private final boolean lateInit;
@@ -295,9 +295,11 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
substitutedDescriptor.initialize(newGetter, newSetter);
if (copyOverrides) {
for (PropertyDescriptor propertyDescriptor : overriddenProperties) {
substitutedDescriptor.addOverriddenDescriptor(propertyDescriptor.substitute(substitutor));
Collection<CallableMemberDescriptor> overridden = SmartSet.create();
for (PropertyDescriptor propertyDescriptor : getOverriddenDescriptors()) {
overridden.add(propertyDescriptor.substitute(substitutor));
}
substitutedDescriptor.setOverriddenDescriptors(overridden);
}
return substitutedDescriptor;
@@ -353,14 +355,15 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
}
@Override
public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overridden) {
overriddenProperties.add((PropertyDescriptorImpl) overridden);
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
//noinspection unchecked
this.overriddenProperties = (Collection<? extends PropertyDescriptor>) overriddenDescriptors;
}
@NotNull
@Override
public Collection<? extends PropertyDescriptor> getOverriddenDescriptors() {
return overriddenProperties;
return overriddenProperties != null ? overriddenProperties : Collections.<PropertyDescriptor>emptyList();
}
@NotNull
@@ -230,3 +230,7 @@ fun CallableMemberDescriptor.firstOverridden(
}
)
}
fun CallableMemberDescriptor.setSingleOverridden(overridden: CallableMemberDescriptor) {
overriddenDescriptors = listOf(overridden)
}
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.types.FlexibleTypesKt;
import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.TypeConstructor;
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker;
import org.jetbrains.kotlin.utils.SmartSet;
import java.util.*;
@@ -293,6 +294,7 @@ public class OverridingUtil {
@NotNull DescriptorSink sink
) {
Collection<CallableMemberDescriptor> bound = new ArrayList<CallableMemberDescriptor>(descriptorsFromSuper.size());
Collection<CallableMemberDescriptor> overridden = SmartSet.create();
for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) {
OverrideCompatibilityInfo.Result result = DEFAULT.isOverridableBy(fromSupertype, fromCurrent, current).getResult();
@@ -300,7 +302,7 @@ public class OverridingUtil {
switch (result) {
case OVERRIDABLE:
if (isVisible) {
fromCurrent.addOverriddenDescriptor(fromSupertype);
overridden.add(fromSupertype);
}
bound.add(fromSupertype);
break;
@@ -314,6 +316,9 @@ public class OverridingUtil {
break;
}
}
fromCurrent.setOverriddenDescriptors(overridden);
return bound;
}
@@ -496,9 +501,7 @@ public class OverridingUtil {
});
CallableMemberDescriptor fakeOverride =
mostSpecific.copy(current, modality, visibility, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false);
for (CallableMemberDescriptor descriptor : effectiveOverridden) {
fakeOverride.addOverriddenDescriptor(descriptor);
}
fakeOverride.setOverriddenDescriptors(effectiveOverridden);
sink.addFakeOverride(fakeOverride);
}
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.types.ErrorUtils;
import java.util.Collection;
import java.util.List;
public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorImpl {
@@ -80,7 +81,7 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
}
@Override
public void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overriddenFunction) {
public void setOverriddenDescriptors(@NotNull Collection<? extends CallableMemberDescriptor> overriddenDescriptors) {
// nop
}
}
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.core.util.DescriptorMemberChooserObject
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.renderer.*
import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden
interface OverrideMemberChooserObject : ClassMember {
enum class BodyType {
@@ -108,7 +109,7 @@ private val OVERRIDE_RENDERER = DescriptorRenderer.withOptions {
private fun generateProperty(project: Project, descriptor: PropertyDescriptor, bodyType: OverrideMemberChooserObject.BodyType): KtProperty {
val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility,
descriptor.kind, /* copyOverrides = */ true) as PropertyDescriptor
newDescriptor.addOverriddenDescriptor(descriptor)
newDescriptor.setSingleOverridden(descriptor)
val body = buildString {
append("\nget()")
@@ -124,14 +125,14 @@ private fun generateProperty(project: Project, descriptor: PropertyDescriptor, b
private fun generateConstructorParameter(project: Project, descriptor: PropertyDescriptor): KtParameter {
val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility,
descriptor.kind, /* copyOverrides = */ true) as PropertyDescriptor
newDescriptor.addOverriddenDescriptor(descriptor)
newDescriptor.setSingleOverridden(descriptor)
return KtPsiFactory(project).createParameter(OVERRIDE_RENDERER.render(newDescriptor))
}
private fun generateFunction(project: Project, descriptor: FunctionDescriptor, bodyType: OverrideMemberChooserObject.BodyType): KtNamedFunction {
val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility,
descriptor.kind, /* copyOverrides = */ true)
newDescriptor.addOverriddenDescriptor(descriptor)
newDescriptor.setSingleOverridden(descriptor)
val returnType = descriptor.returnType
val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType)
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.NameShortness
import org.jetbrains.kotlin.resolve.FunctionDescriptorUtil
import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden
import org.jetbrains.kotlin.resolve.findMemberWithMaxVisibility
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.typeUtil.supertypes
@@ -129,7 +130,7 @@ class ChangeMemberFunctionSignatureFix private constructor(
CallableMemberDescriptor.Kind.DELEGATION,
/* copyOverrides = */ true),
newParameters)
newFunction.addOverriddenDescriptor(superFunction)
newFunction.setSingleOverridden(superFunction)
return Signature(newFunction)
}