Support visibility for protected static members

#KT-2999 Fixed
This commit is contained in:
Natalia.Ukhorskaya
2013-01-24 18:41:26 +04:00
parent f9ae4f58b8
commit e37cb461f6
32 changed files with 401 additions and 12 deletions
@@ -84,11 +84,20 @@ public final class DescriptorResolverUtils {
return Visibilities.INTERNAL;
}
}
return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibilities.PUBLIC :
(modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibilities.PRIVATE :
(modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibilities.PROTECTED :
//Visibilities.PUBLIC));
JavaDescriptorResolver.PACKAGE_VISIBILITY));
if (modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC)) {
return Visibilities.PUBLIC;
}
if (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE)) {
return Visibilities.PRIVATE;
}
if (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED)) {
if (modifierListOwner.hasModifierProperty(PsiModifier.STATIC)) {
return JavaDescriptorResolver.PROTECTED_STATIC_VISIBILITY;
}
return Visibilities.PROTECTED;
}
return JavaDescriptorResolver.PACKAGE_VISIBILITY;
}
@Nullable
@@ -55,6 +55,35 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
}
};
public static final Visibility PROTECTED_STATIC_VISIBILITY = new Visibility("protected_static", false) {
@Override
protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
ClassDescriptor fromClass = DescriptorUtils.getParentOfType(from, ClassDescriptor.class, false);
if (fromClass == null) return false;
ClassDescriptor whatClass;
// protected static class
if (what instanceof ClassDescriptor) {
DeclarationDescriptor containingDeclaration = what.getContainingDeclaration();
assert containingDeclaration instanceof ClassDescriptor : "Only static nested classes can have protected_static visibility";
whatClass = (ClassDescriptor) containingDeclaration;
}
// protected static function or property
else {
DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration();
assert whatDeclarationDescriptor instanceof NamespaceDescriptor : "Only static declarations can have protected_static visibility";
whatClass = DescriptorUtils.getClassForCorrespondingJavaNamespace((NamespaceDescriptor) whatDeclarationDescriptor);
}
assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what;
if (DescriptorUtils.isSubclass(fromClass, whatClass)) {
return true;
}
return isVisible(what, fromClass.getContainingDeclaration());
}
};
private JavaPropertyResolver propertiesResolver;
private JavaClassResolver classResolver;
private JavaConstructorResolver constructorResolver;