KT-1717 Don't make member visibility inherit when it is not declared explicitly

#KT-1717 Fixed
This commit is contained in:
Svetlana Isakova
2012-04-03 19:12:29 +04:00
parent 5df7258708
commit 9b2eeb076e
45 changed files with 115 additions and 159 deletions
@@ -48,8 +48,7 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements
//isStatic - for java only
public ConstructorDescriptorImpl initialize(@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, Visibility visibility, boolean isStatic) {
super.initialize(null, isStatic ? ReceiverDescriptor.NO_RECEIVER : getExpectedThisObject(getContainingDeclaration()), typeParameters, unsubstitutedValueParameters, null, Modality.FINAL);
setVisibility(visibility);
super.initialize(null, isStatic ? ReceiverDescriptor.NO_RECEIVER : getExpectedThisObject(getContainingDeclaration()), typeParameters, unsubstitutedValueParameters, null, Modality.FINAL, visibility);
return this;
}
@@ -78,11 +78,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i
@NotNull List<TypeParameterDescriptor> typeParameters,
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable JetType unsubstitutedReturnType,
@Nullable Modality modality) {
@Nullable Modality modality,
@NotNull Visibility visibility) {
this.typeParameters = typeParameters;
this.unsubstitutedValueParameters = unsubstitutedValueParameters;
this.unsubstitutedReturnType = unsubstitutedReturnType;
this.modality = modality;
this.visibility = visibility;
this.receiver = receiverType == null ? NO_RECEIVER : new ExtensionReceiver(this, receiverType);
this.expectedThisObject = expectedThisObject;
@@ -104,10 +106,6 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i
return this;
}
public void setVisibility(@NotNull Visibility visibility) {
this.visibility = visibility;
}
public void setReturnType(@NotNull JetType unsubstitutedReturnType) {
this.unsubstitutedReturnType = unsubstitutedReturnType;
}
@@ -223,8 +221,9 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i
substitutedTypeParameters,
substitutedValueParameters,
substitutedReturnType,
newModality);
substitutedDescriptor.setVisibility(visibility);
newModality,
visibility
);
if (copyOverrides) {
for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
substitutedDescriptor.addOverriddenDescriptor(overriddenFunction.substitute(substitutor));
@@ -126,8 +126,8 @@ public class FunctionDescriptorUtil {
Collections.<TypeParameterDescriptor>emptyList(),
JetStandardClasses.getValueParameters(functionDescriptor, functionType),
JetStandardClasses.getReturnTypeFromFunctionType(functionType),
Modality.FINAL);
functionDescriptor.setVisibility(Visibilities.LOCAL);
Modality.FINAL,
Visibilities.LOCAL);
}
public static <D extends CallableDescriptor> D alphaConvertTypeParameters(D candidate) {
@@ -67,6 +67,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull List<AnnotationDescriptor> annotations,
@NotNull Modality modality,
@NotNull Visibility visibility,
boolean isVar,
boolean isObject,
@NotNull String name,
@@ -75,6 +76,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
this.isVar = isVar;
this.isObject = isObject;
this.modality = modality;
this.visibility = visibility;
this.original = original == null ? this : original.getOriginal();
this.kind = kind;
}
@@ -83,11 +85,12 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull List<AnnotationDescriptor> annotations,
@NotNull Modality modality,
@NotNull Visibility visibility,
boolean isVar,
boolean isObject,
@NotNull String name,
Kind kind) {
this(null, containingDeclaration, annotations, modality, isVar, isObject, name, kind);
this(null, containingDeclaration, annotations, modality, visibility, isVar, isObject, name, kind);
}
public PropertyDescriptor(
@@ -103,7 +106,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
@NotNull JetType outType,
Kind kind
) {
this(containingDeclaration, annotations, modality, isVar, isObject, name, kind);
this(containingDeclaration, annotations, modality, visibility, isVar, isObject, name, kind);
setType(outType, Collections.<TypeParameterDescriptor>emptyList(), expectedThisObject, receiverType);
}
@@ -128,10 +131,6 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
this.setter = setter;
}
public void setVisibility(@NotNull Visibility visibility) {
this.visibility = visibility;
}
@NotNull
@Override
public List<TypeParameterDescriptor> getTypeParameters() {
@@ -207,16 +206,8 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab
private PropertyDescriptor doSubstitute(TypeSubstitutor originalSubstitutor,
DeclarationDescriptor newOwner, Modality newModality, boolean preserveOriginal, boolean copyOverrides, Kind kind) {
final PropertyDescriptor thisProperty = this;
PropertyDescriptor substitutedDescriptor = new PropertyDescriptor(preserveOriginal ? getOriginal() : this, newOwner,
getAnnotations(), newModality, isVar(), isObjectDeclaration(), getName(), kind) {
@NotNull
@Override
public Visibility getVisibility() {
// visibility of property can be not set yet
return thisProperty.getVisibility();
}
};
getAnnotations(), newModality, getVisibility(), isVar(), isObjectDeclaration(), getName(), kind);
List<TypeParameterDescriptor> substitutedTypeParameters = Lists.newArrayList();
TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(getTypeParameters(), originalSubstitutor, substitutedDescriptor, substitutedTypeParameters);
@@ -59,8 +59,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@Nullable Modality modality,
@NotNull Visibility visibility,
boolean isInline) {
super.initialize(receiverType, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality);
setVisibility(visibility);
super.initialize(receiverType, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility);
this.isInline = isInline;
return this;
}
@@ -125,6 +125,11 @@ public class PositioningStrategies {
result.add(element.getModifierList().getModifierNode(token).getTextRange());
}
}
if (result.isEmpty()) {
if (element.hasModifier(JetTokens.OVERRIDE_KEYWORD)) {
result.add(element.getModifierList().getModifierNode(JetTokens.OVERRIDE_KEYWORD).getTextRange());
}
}
return result;
}
};
@@ -486,12 +486,12 @@ public class DescriptorResolver {
containingDeclaration,
annotationResolver.createAnnotationStubs(modifierList, trace),
Modality.FINAL,
resolveVisibilityFromModifiers(modifierList),
false,
true,
JetPsiUtil.safeName(objectDeclaration.getName()),
CallableMemberDescriptor.Kind.DECLARATION
);
propertyDescriptor.setVisibility(resolveVisibilityFromModifiers(modifierList));
propertyDescriptor.setType(classDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), ReceiverDescriptor.NO_RECEIVER);
propertyDescriptor.initialize(createDefaultGetter(propertyDescriptor), null);
JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration();
@@ -543,12 +543,12 @@ public class DescriptorResolver {
containingDeclaration,
annotationResolver.resolveAnnotations(scope, modifierList, trace),
resolveModalityFromModifiers(property.getModifierList(), defaultModality),
resolveVisibilityFromModifiers(property.getModifierList()),
isVar,
false,
JetPsiUtil.safeName(property.getName()),
CallableMemberDescriptor.Kind.DECLARATION
);
propertyDescriptor.setVisibility(resolveVisibilityFromModifiers(property.getModifierList()));
List<TypeParameterDescriptor> typeParameterDescriptors;
JetScope scopeWithTypeParameters;
@@ -861,12 +861,12 @@ public class DescriptorResolver {
classDescriptor,
annotationResolver.resolveAnnotations(scope, modifierList, trace),
resolveModalityFromModifiers(parameter.getModifierList(), Modality.FINAL),
resolveVisibilityFromModifiers(parameter.getModifierList()),
isMutable,
false,
name == null ? "<no name>" : name,
CallableMemberDescriptor.Kind.DECLARATION
);
propertyDescriptor.setVisibility(resolveVisibilityFromModifiers(parameter.getModifierList()));
propertyDescriptor.setType(type, Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor), ReceiverDescriptor.NO_RECEIVER);
PropertyGetterDescriptor getter = createDefaultGetter(propertyDescriptor);
@@ -69,9 +69,7 @@ public class OverrideResolver {
public void process() {
generateOverrides();
checkOverrides();
//functions and properties visibility can be inherited when overriding, so it can be resolved only after overrides resolve is finished
//also invisible overridden descriptors are removed here
resolveVisibilityForFunctionsAndProperties();
checkVisibilityForOverriddenMembers();
}
/**
@@ -421,69 +419,31 @@ public class OverrideResolver {
return false;
}
private void resolveVisibilityForFunctionsAndProperties() {
private void checkVisibilityForOverriddenMembers() {
for (Map.Entry<JetNamedFunction, SimpleFunctionDescriptor> entry : context.getFunctions().entrySet()) {
JetNamedFunction function = entry.getKey();
SimpleFunctionDescriptor functionDescriptor = entry.getValue();
Visibility visibility = resolveVisibilityForMember(function, functionDescriptor);
((SimpleFunctionDescriptorImpl) functionDescriptor).setVisibility(visibility);
checkVisibilityForMember(functionDescriptor.getVisibility(), function, functionDescriptor.getOverriddenDescriptors());
}
for (Map.Entry<JetProperty, PropertyDescriptor> entry : context.getProperties().entrySet()) {
JetProperty property = entry.getKey();
PropertyDescriptor propertyDescriptor = entry.getValue();
Visibility visibility = resolveVisibilityForMember(property, propertyDescriptor);
propertyDescriptor.setVisibility(visibility);
checkVisibilityForMember(propertyDescriptor.getVisibility(), property, propertyDescriptor.getOverriddenDescriptors());
}
}
private Visibility resolveVisibilityForMember(JetDeclaration member, CallableMemberDescriptor memberDescriptor) {
removeInvisibleOverriddenDescriptors(memberDescriptor);
Visibility defaultVisibility = findMaxVisibility(memberDescriptor.getOverriddenDescriptors());
Visibility visibility = DescriptorResolver.resolveVisibilityFromModifiers(member.getModifierList(), defaultVisibility);
checkMaxVisibility(visibility, member, memberDescriptor.getOverriddenDescriptors());
return visibility;
}
private void removeInvisibleOverriddenDescriptors(@NotNull CallableDescriptor descriptor) {
Set<? extends CallableDescriptor> overriddenDescriptors = descriptor.getOverriddenDescriptors();
for (Iterator<? extends CallableDescriptor> iterator = overriddenDescriptors.iterator(); iterator.hasNext(); ) {
CallableDescriptor superDescriptor = iterator.next();
if (!Visibilities.isVisible(superDescriptor, descriptor)) {
iterator.remove();
}
}
}
private Visibility findMaxVisibility(@NotNull Collection<? extends DeclarationDescriptorWithVisibility> descriptors) {
Visibility maxVisibility = null;
for (DeclarationDescriptorWithVisibility descriptor : descriptors) {
Visibility visibility = descriptor.getVisibility();
if (maxVisibility == null) {
maxVisibility = visibility;
continue;
}
Integer compare = Visibilities.compare(visibility, maxVisibility);
if (compare == null) {
maxVisibility = Visibilities.PUBLIC; //todo error or warning when inference only from incomparable visibilities
continue;
}
if (compare > 0) {
maxVisibility = visibility;
}
}
return maxVisibility != null ? maxVisibility : Visibilities.INTERNAL;
}
private void checkMaxVisibility(@NotNull Visibility visibility, @NotNull JetModifierListOwner modifierListOwner, @NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
private void checkVisibilityForMember(@NotNull Visibility visibility,
@NotNull JetModifierListOwner modifierListOwner,
@NotNull Collection<? extends CallableMemberDescriptor> descriptors) {
for (CallableMemberDescriptor descriptor : descriptors) {
Integer compare = Visibilities.compare(visibility, descriptor.getVisibility());
if (compare == null) {
trace.report(CANNOT_CHANGE_ACCESS_PRIVILEGE.on(modifierListOwner, descriptor.getVisibility(), descriptor, descriptor.getContainingDeclaration()));
return;
}
else if (compare < 0) {
if (compare < 0) {
trace.report(CANNOT_WEAKEN_ACCESS_PRIVILEGE.on(modifierListOwner, descriptor.getVisibility(), descriptor, descriptor.getContainingDeclaration()));
return;
}
@@ -93,6 +93,9 @@ public class OverridingUtil {
@NotNull
public static OverrideCompatibilityInfo isOverridableBy(@NotNull CallableDescriptor superDescriptor, @NotNull CallableDescriptor subDescriptor) {
if (!Visibilities.isVisible(superDescriptor, subDescriptor)) {
return OverrideCompatibilityInfo.invisibleMember();
}
if (superDescriptor instanceof FunctionDescriptor) {
if (subDescriptor instanceof PropertyDescriptor) return OverrideCompatibilityInfo.memberKindMismatch();
}
@@ -318,6 +321,11 @@ public class OverridingUtil {
return new OverrideCompatibilityInfo(Result.INCOMPATIBLE, "varOverriddenByVal"); // TODO
}
@NotNull
public static OverrideCompatibilityInfo invisibleMember() {
return new OverrideCompatibilityInfo(Result.INCOMPATIBLE, "invisibleMember");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private final Result overridable;
@@ -155,8 +155,7 @@ public class JetStandardClasses {
Collections.<AnnotationDescriptor>emptyList(),
true, Variance.OUT_VARIANCE, "T" + (j + 1), j);
parameters.add(typeParameterDescriptor);
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(classDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.FINAL, false, false, "_" + (j + 1), CallableMemberDescriptor.Kind.DECLARATION);
propertyDescriptor.setVisibility(Visibilities.PUBLIC);
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(classDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.FINAL, Visibilities.PUBLIC, false, false, "_" + (j + 1), CallableMemberDescriptor.Kind.DECLARATION);
propertyDescriptor.setType(typeParameterDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), classDescriptor.getImplicitReceiver(), ReceiverDescriptor.NO_RECEIVER);
PropertyGetterDescriptor getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.FINAL, Visibilities.PUBLIC, false, true, CallableMemberDescriptor.Kind.DECLARATION);
getterDescriptor.initialize(typeParameterDescriptor.getDefaultType());