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