Implement package protected visibility

This commit is contained in:
Natalia.Ukhorskaya
2013-02-06 14:13:17 +04:00
parent 88e3b9e190
commit 11273f3035
23 changed files with 202 additions and 9 deletions
@@ -95,7 +95,7 @@ public final class DescriptorResolverUtils {
if (modifierListOwner.hasModifierProperty(PsiModifier.STATIC)) {
return JavaDescriptorResolver.PROTECTED_STATIC_VISIBILITY;
}
return Visibilities.PROTECTED;
return JavaDescriptorResolver.PROTECTED_AND_PACKAGE;
}
return JavaDescriptorResolver.PACKAGE_VISIBILITY;
}
@@ -121,7 +121,7 @@ public final class DescriptorResolverUtils {
public static Visibility getConstructorVisibility(ClassDescriptor classDescriptor) {
Visibility containingClassVisibility = classDescriptor.getVisibility();
if (containingClassVisibility == JavaDescriptorResolver.PROTECTED_STATIC_VISIBILITY) {
return Visibilities.PROTECTED;
return JavaDescriptorResolver.PROTECTED_AND_PACKAGE;
}
return containingClassVisibility;
}
@@ -41,10 +41,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
public static Visibility PACKAGE_VISIBILITY = new Visibility("package", false) {
@Override
protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
NamespaceDescriptor parentPackage = DescriptorUtils.getParentOfType(what, NamespaceDescriptor.class);
NamespaceDescriptor fromPackage = DescriptorUtils.getParentOfType(from, NamespaceDescriptor.class, false);
assert parentPackage != null;
return parentPackage.equals(fromPackage);
return DescriptorUtils.isInSameNamespace(what, from);
}
@Override
@@ -84,6 +81,34 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
}
};
public static final Visibility PROTECTED_AND_PACKAGE = new Visibility("protected_and_package", false) {
@Override
protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
if (DescriptorUtils.isInSameNamespace(what, from)) {
return true;
}
ClassDescriptor whatClass = DescriptorUtils.getParentOfType(what, ClassDescriptor.class, false);
if (whatClass == null) return false;
ClassDescriptor fromClass = DescriptorUtils.getParentOfType(from, ClassDescriptor.class, false);
if (fromClass == null) return false;
if (DescriptorUtils.isSubclass(fromClass, whatClass)) {
return true;
}
return isVisible(what, fromClass.getContainingDeclaration());
}
@Override
protected Integer compareTo(@NotNull Visibility visibility) {
if (this == visibility) return 0;
if (visibility == Visibilities.INTERNAL) return null;
if (visibility == Visibilities.PRIVATE) return 1;
return -1;
}
};
private JavaPropertyResolver propertiesResolver;
private JavaClassResolver classResolver;
private JavaConstructorResolver constructorResolver;