diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index a6f5b03cbc5..eb240ffb124 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -195,7 +195,7 @@ public class ClosureCodegen extends MemberCodegen { erasedInterfaceFunction.getValueParameters(), erasedInterfaceFunction.getReturnType(), Modality.OPEN, erasedInterfaceFunction.getVisibility()); - descriptorForBridges.addOverriddenDescriptor(erasedInterfaceFunction); + DescriptorUtilsKt.setSingleOverridden(descriptorForBridges, erasedInterfaceFunction); functionCodegen.generateBridges(descriptorForBridges); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java index bacca4cfd25..aee4b1a82d3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SamWrapperCodegen.java @@ -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); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt index 77cfb49291e..052271b2120 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tasks/synthesizedInvokes.kt @@ -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): Collect CallableMemberDescriptor.Kind.FAKE_OVERRIDE, true ) - fakeOverride.addOverriddenDescriptor(synthesizedSuperFun) + fakeOverride.setSingleOverridden(synthesizedSuperFun) fakeOverride } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java index 41bf42e8ebe..479072ed692 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java @@ -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, diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableMemberDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableMemberDescriptor.java index 0cc9e42e0d6..999f3e9f5f5 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableMemberDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/CallableMemberDescriptor.java @@ -29,7 +29,7 @@ public interface CallableMemberDescriptor extends CallableDescriptor, MemberDesc @Override CallableMemberDescriptor getOriginal(); - void addOverriddenDescriptor(@NotNull CallableMemberDescriptor overridden); + void setOverriddenDescriptors(@NotNull Collection overriddenDescriptors); enum Kind { DECLARATION, diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java index a89d52fee43..f3ae00f3099 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java @@ -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 overriddenDescriptors) { + assert overriddenDescriptors.isEmpty() : "Constructors cannot override anything"; } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index 5d011bc53cc..e1477f73b39 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -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 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 overriddenFunctions = SmartSet.create(); + private Collection 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 getOverriddenDescriptors() { - return overriddenFunctions; + return overriddenFunctions != null ? overriddenFunctions : Collections.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 overriddenDescriptors) { + //noinspection unchecked + overriddenFunctions = (Collection) 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 substitutedOverridden = SmartSet.create(); + for (FunctionDescriptor overriddenFunction : getOverriddenDescriptors()) { + substitutedOverridden.add(overriddenFunction.substitute(substitutor)); } + substitutedDescriptor.setOverriddenDescriptors(substitutedOverridden); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java index 8ecc910cb79..997536be067 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java @@ -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 overriddenDescriptors) { + assert overriddenDescriptors.isEmpty() : "Overridden accessors should be empty"; } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java index 4231c64a82c..c6792b3c3a7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java @@ -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 overriddenProperties = SmartSet.create(); + private Collection 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 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 overriddenDescriptors) { + //noinspection unchecked + this.overriddenProperties = (Collection) overriddenDescriptors; } @NotNull @Override public Collection getOverriddenDescriptors() { - return overriddenProperties; + return overriddenProperties != null ? overriddenProperties : Collections.emptyList(); } @NotNull diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index d143d6abade..e7a0af2e497 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -230,3 +230,7 @@ fun CallableMemberDescriptor.firstOverridden( } ) } + +fun CallableMemberDescriptor.setSingleOverridden(overridden: CallableMemberDescriptor) { + overriddenDescriptors = listOf(overridden) +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java index 2ca730dbe10..7a8197bf96b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java @@ -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 bound = new ArrayList(descriptorsFromSuper.size()); + Collection 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); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java index 617826b623e..ecf87bd50ee 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java @@ -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 overriddenDescriptors) { // nop } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index e564a962180..84df5327fc4 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -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) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt index 6bf7d31cd3f..f8992803af0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt @@ -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) }