From 194ef38ba36db555203597c28718f1f84d9c7531 Mon Sep 17 00:00:00 2001 From: Kirill Berezin Date: Tue, 11 Sep 2012 10:20:50 +0400 Subject: [PATCH] KT-2477 fake overrides now get INHERITED visibility in order to maximize visibility according to inherited traits\classes --- .../resolve/java/JavaDescriptorResolver.java | 7 +++--- .../descriptors/CallableMemberDescriptor.java | 2 +- .../ConstructorDescriptorImpl.java | 2 +- .../lang/descriptors/FunctionDescriptor.java | 2 +- .../PropertyAccessorDescriptor.java | 2 +- .../lang/descriptors/PropertyDescriptor.java | 20 ++++++++++++----- .../descriptors/ScriptCodeDescriptor.java | 2 +- .../lang/descriptors/ScriptDescriptor.java | 2 +- .../descriptors/SimpleFunctionDescriptor.java | 2 +- .../SimpleFunctionDescriptorImpl.java | 4 ++-- .../jet/lang/resolve/DelegationResolver.java | 2 +- .../jet/lang/resolve/OverrideResolver.java | 11 ++++++++-- .../calls/ExpressionAsFunctionDescriptor.java | 7 ++---- .../resolve/lazy/LazyClassMemberScope.java | 2 +- .../ErrorSimpleFunctionDescriptorImpl.java | 2 +- .../testData/codegen/regressions/kt2477.kt | 22 +++++++++++++++++++ .../jetbrains/jet/codegen/ClassGenTest.java | 5 +++++ 17 files changed, 69 insertions(+), 27 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2477.kt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 6b9fa859607..370bc7b8727 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1344,7 +1344,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes Set propertiesFromSupertypes = getPropertiesFromSupertypes(scopeData, propertyName); - final Set properties = Sets.newHashSet(); + final Set properties = Sets.newHashSet(); if (owner instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) owner; @@ -1363,9 +1363,10 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes }); } + OverrideResolver.resolveUnknownVisibilities(properties, trace); properties.addAll(propertiesFromCurrent); - namedMembers.propertyDescriptors = properties; + namedMembers.propertyDescriptors = Sets.newHashSet(properties); } @NotNull @@ -1429,9 +1430,9 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes // nop } }); - } + OverrideResolver.resolveUnknownVisibilities(functions, trace); functions.addAll(functionsFromCurrent); if (DescriptorUtils.isEnumClassObject(owner)) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java index bd952a8445b..64e5f6d46bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableMemberDescriptor.java @@ -52,5 +52,5 @@ public interface CallableMemberDescriptor extends CallableDescriptor, MemberDesc Kind getKind(); @NotNull - CallableMemberDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides); + CallableMemberDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java index ecdea5bfaae..74554713586 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java @@ -108,7 +108,7 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements @NotNull @Override - public ConstructorDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides) { + public ConstructorDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) { throw new UnsupportedOperationException("Constructors should not be copied for overriding"); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java index f6d5ca7fa35..09f79993c63 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java @@ -42,5 +42,5 @@ public interface FunctionDescriptor extends CallableMemberDescriptor { @NotNull @Override - FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides); + FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java index 1bf2a15486e..b8003cbb8e8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java @@ -121,7 +121,7 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorNo @NotNull @Override - public PropertyAccessorDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides) { + public PropertyAccessorDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) { throw new UnsupportedOperationException("Accessors must be copied by the corresponding property"); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java index 098fde046fc..59fd7fd85c9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java @@ -234,15 +234,15 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab PropertyGetterDescriptor newGetter = getter == null ? null : new PropertyGetterDescriptor( substitutedDescriptor, Lists.newArrayList(getter.getAnnotations()), - DescriptorUtils.convertModality(getter.getModality(), false), getter.getVisibility(), + DescriptorUtils.convertModality(getter.getModality(), false), convertVisibility(getter.getVisibility(), newVisibility), getter.hasBody(), getter.isDefault(), kind, getter.getOriginal()); if (newGetter != null) { JetType returnType = getter.getReturnType(); newGetter.initialize(returnType != null ? substitutor.substitute(returnType, Variance.OUT_VARIANCE) : null); } PropertySetterDescriptor newSetter = setter == null ? null : new PropertySetterDescriptor( - substitutedDescriptor, Lists.newArrayList(setter.getAnnotations()), DescriptorUtils.convertModality(setter.getModality(), false), setter.getVisibility(), - setter.hasBody(), setter.isDefault(), kind, setter.getOriginal()); + substitutedDescriptor, Lists.newArrayList(setter.getAnnotations()), DescriptorUtils.convertModality(setter.getModality(), false), + convertVisibility(setter.getVisibility(), newVisibility), setter.hasBody(), setter.isDefault(), kind, setter.getOriginal()); if (newSetter != null) { List substitutedValueParameters = FunctionDescriptorUtil.getSubstitutedValueParameters(newSetter, setter, substitutor); if (substitutedValueParameters == null) { @@ -265,6 +265,16 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab return substitutedDescriptor; } + @NotNull + private static Visibility convertVisibility(Visibility orig, Visibility candidate) { + if (candidate == Visibilities.INHERITED) { + return candidate; + } + + Integer result = Visibilities.compare(orig, candidate); + return result != null && result < 0 ? candidate : orig; + } + @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitPropertyDescriptor(this, data); @@ -294,7 +304,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab @NotNull @Override - public PropertyDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides) { - return doSubstitute(TypeSubstitutor.EMPTY, newOwner, modality, makeInvisible ? Visibilities.INVISIBLE_FAKE : visibility, false, copyOverrides, kind); + public PropertyDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) { + return doSubstitute(TypeSubstitutor.EMPTY, newOwner, modality, visibility, false, copyOverrides, kind); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptCodeDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptCodeDescriptor.java index 4653d3b3dcd..f5bd9a5f637 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptCodeDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptCodeDescriptor.java @@ -49,7 +49,7 @@ public class ScriptCodeDescriptor extends FunctionDescriptorImpl { @NotNull @Override - public FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides) { + public FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) { throw new IllegalStateException("no need to copy script code descriptor"); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java index cf66e6565f4..0689aa0ee15 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java @@ -109,7 +109,7 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl { SimpleFunctionDescriptor descriptor = bindingContext.get(BindingContext.FUNCTION, jetDeclaration); assert descriptor != null; SimpleFunctionDescriptor copy = - descriptor.copy(classDescriptor, descriptor.getModality(), false, CallableMemberDescriptor.Kind.DECLARATION, false); + descriptor.copy(classDescriptor, descriptor.getModality(), descriptor.getVisibility(), CallableMemberDescriptor.Kind.DECLARATION, false); classScope.addFunctionDescriptor(copy); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java index ff5fc691ee2..f7fac634ac0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java @@ -27,7 +27,7 @@ public interface SimpleFunctionDescriptor extends FunctionDescriptor { @NotNull @Override - SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides); + SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides); @NotNull @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java index 22966e75344..2772ee08caf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java @@ -93,8 +93,8 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme @NotNull @Override - public SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides) { - SimpleFunctionDescriptorImpl copy = (SimpleFunctionDescriptorImpl)doSubstitute(TypeSubstitutor.EMPTY, newOwner, modality, makeInvisible ? Visibilities.INVISIBLE_FAKE : visibility, false, copyOverrides, kind); + public SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) { + SimpleFunctionDescriptorImpl copy = (SimpleFunctionDescriptorImpl)doSubstitute(TypeSubstitutor.EMPTY, newOwner, modality, visibility, false, copyOverrides, kind); copy.isInline = isInline; return copy; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java index 2eeb5679187..d036f449ffa 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java @@ -124,7 +124,7 @@ public class DelegationResolver { if (memberDescriptor.getModality().isOverridable()) { Modality modality = DescriptorUtils.convertModality(memberDescriptor.getModality(), true); CallableMemberDescriptor copy = - memberDescriptor.copy(newOwner, modality, false, CallableMemberDescriptor.Kind.DELEGATION, false); + memberDescriptor.copy(newOwner, modality, memberDescriptor.getVisibility(), CallableMemberDescriptor.Kind.DELEGATION, false); result.add(copy); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 866eeff1f06..a8574ae7f30 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -159,7 +159,13 @@ public class OverrideResolver { } }); } - for (CallableMemberDescriptor memberDescriptor : classDescriptor.getAllCallableMembers()) { + resolveUnknownVisibilities(classDescriptor.getAllCallableMembers(), trace); + } + + public static void resolveUnknownVisibilities( + @NotNull Collection descriptors, + @NotNull BindingTrace trace) { + for (CallableMemberDescriptor memberDescriptor : descriptors) { JetDeclaration declaration = null; if (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), memberDescriptor); @@ -250,8 +256,9 @@ public class OverrideResolver { Modality modality = getMinimalModality(visibleOverridables); boolean allInvisible = visibleOverridables.isEmpty(); Collection effectiveOverridden = allInvisible ? overridables : visibleOverridables; + Visibility visibility = allInvisible ? Visibilities.INVISIBLE_FAKE : Visibilities.INHERITED; CallableMemberDescriptor fakeOverride = - notOverriddenFromSuper.copy(current, modality, allInvisible, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false); + notOverriddenFromSuper.copy(current, modality, visibility, CallableMemberDescriptor.Kind.FAKE_OVERRIDE, false); for (CallableMemberDescriptor descriptor : effectiveOverridden) { OverridingUtil.bindOverride(fakeOverride, descriptor); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java index c4e89a099dc..d3ddc01b6dc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java @@ -17,10 +17,7 @@ package org.jetbrains.jet.lang.resolve.calls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptorImpl; -import org.jetbrains.jet.lang.descriptors.Modality; +import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.name.Name; @@ -41,7 +38,7 @@ public class ExpressionAsFunctionDescriptor extends FunctionDescriptorImpl { @NotNull @Override - public FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides) { + public FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) { throw new IllegalStateException(); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java index 8ed2b0d14a5..c27ca9a52e0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/LazyClassMemberScope.java @@ -121,7 +121,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope