KT-2477 fake overrides now get INHERITED visibility in order to maximize visibility according to inherited traits\classes
This commit is contained in:
committed by
Andrey Breslav
parent
2d911f216a
commit
194ef38ba3
+4
-3
@@ -1344,7 +1344,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
||||
|
||||
Set<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(scopeData, propertyName);
|
||||
|
||||
final Set<VariableDescriptor> properties = Sets.newHashSet();
|
||||
final Set<PropertyDescriptor> 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.<VariableDescriptor>newHashSet(properties);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -1429,9 +1430,9 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
||||
// nop
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
OverrideResolver.resolveUnknownVisibilities(functions, trace);
|
||||
functions.addAll(functionsFromCurrent);
|
||||
|
||||
if (DescriptorUtils.isEnumClassObject(owner)) {
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
+1
-1
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
+1
-1
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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<ValueParameterDescriptor> 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, D> R accept(DeclarationDescriptorVisitor<R, D> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,7 +159,13 @@ public class OverrideResolver {
|
||||
}
|
||||
});
|
||||
}
|
||||
for (CallableMemberDescriptor memberDescriptor : classDescriptor.getAllCallableMembers()) {
|
||||
resolveUnknownVisibilities(classDescriptor.getAllCallableMembers(), trace);
|
||||
}
|
||||
|
||||
public static void resolveUnknownVisibilities(
|
||||
@NotNull Collection<? extends CallableMemberDescriptor> 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<CallableMemberDescriptor> 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);
|
||||
}
|
||||
|
||||
+2
-5
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
OverrideResolver.resolveUnknownVisibilities(result, resolveSession.getTrace());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+1
-1
@@ -45,7 +45,7 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, boolean makeInvisible, Kind kind, boolean copyOverrides) {
|
||||
public SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) {
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package test
|
||||
|
||||
trait A {
|
||||
public val c: String
|
||||
get() = "OK"
|
||||
}
|
||||
|
||||
trait B {
|
||||
protected val c: String
|
||||
}
|
||||
|
||||
open class C {
|
||||
private val c: String = "FAIL"
|
||||
}
|
||||
|
||||
open class D: C(), A, B {
|
||||
val b = c
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
return D().c
|
||||
}
|
||||
@@ -545,6 +545,11 @@ public class ClassGenTest extends CodegenTestCase {
|
||||
blackBoxMultiFile("regressions/kt2566_2.kt");
|
||||
}
|
||||
|
||||
public void testKt2477() {
|
||||
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY);
|
||||
blackBoxFile("regressions/kt2477.kt");
|
||||
}
|
||||
|
||||
public void testKt2485() {
|
||||
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY);
|
||||
blackBoxMultiFile("regressions/kt2485.kt");
|
||||
|
||||
Reference in New Issue
Block a user