@Nullable private static PsiMethod checkPackageLocalInSuperClass(@NotNull PsiClass aClass) { // super class can have package local abstract methods not accessible for overriding PsiClass superClass = aClass.getSuperClass(); if (superClass == null) return null; if (CommonClassNames.JAVA_LANG_OBJECT.equals(aClass.getQualifiedName())) return null; if (JavaPsiFacade.getInstance(aClass.getProject()).arePackagesTheSame(aClass, superClass)) return null; for (HierarchicalMethodSignature methodSignature : superClass.getVisibleSignatures()) { PsiMethod method = methodSignature.getMethod(); if (method.hasModifierProperty(PsiModifier.ABSTRACT) && method.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) return method; } return null; }
@PsiModifier.ModifierConstant public static String getPossibleVisibility(final PsiMember psiMethod, final PsiElement place) { Project project = psiMethod.getProject(); if (PsiUtil.isAccessible(project, psiMethod, place, null)) return getVisibilityModifier(psiMethod.getModifierList()); if (JavaPsiFacade.getInstance(project).arePackagesTheSame(psiMethod, place)) { return PsiModifier.PACKAGE_LOCAL; } if (InheritanceUtil.isInheritorOrSelf(PsiTreeUtil.getParentOfType(place, PsiClass.class), psiMethod.getContainingClass(), true)) { return PsiModifier.PROTECTED; } return PsiModifier.PUBLIC; }