private Nullness calcInherentNullability() { PsiModifierListOwner var = getPsiVariable(); Nullness nullability = DfaPsiUtil.getElementNullability(getVariableType(), var); if (nullability != Nullness.UNKNOWN) { return nullability; } Nullness defaultNullability = myFactory.isUnknownMembersAreNullable() && MEMBER_OR_METHOD_PARAMETER.accepts(var) ? Nullness.NULLABLE : Nullness.UNKNOWN; if (var instanceof PsiParameter && var.getParent() instanceof PsiForeachStatement) { PsiExpression iteratedValue = ((PsiForeachStatement) var.getParent()).getIteratedValue(); if (iteratedValue != null) { PsiType itemType = JavaGenericsUtil.getCollectionItemType(iteratedValue); if (itemType != null) { return DfaPsiUtil.getElementNullability(itemType, var); } } } if (var instanceof PsiField && DfaPsiUtil.isFinalField((PsiVariable) var) && myFactory.isHonorFieldInitializers()) { List<PsiExpression> initializers = DfaPsiUtil.findAllConstructorInitializers((PsiField) var); if (initializers.isEmpty()) { return defaultNullability; } boolean hasUnknowns = false; for (PsiExpression expression : initializers) { Nullness nullness = getFieldInitializerNullness(expression); if (nullness == Nullness.NULLABLE) { return Nullness.NULLABLE; } if (nullness == Nullness.UNKNOWN) { hasUnknowns = true; } } if (hasUnknowns) { if (DfaPsiUtil.isInitializedNotNull((PsiField) var)) { return Nullness.NOT_NULL; } return defaultNullability; } return Nullness.NOT_NULL; } return defaultNullability; }
@Override public String getAccessModifier(PsiModifierListOwner psiElement) { if (psiElement instanceof PsiParameter) return PsiModifier.PACKAGE_LOCAL; PsiModifierList list = psiElement.getModifierList(); String result = PsiModifier.PACKAGE_LOCAL; if (list != null) { if (list.hasModifierProperty(PsiModifier.PRIVATE)) { result = PsiModifier.PRIVATE; } else if (list.hasModifierProperty(PsiModifier.PROTECTED)) { result = PsiModifier.PROTECTED; } else if (list.hasModifierProperty(PsiModifier.PUBLIC)) { result = PsiModifier.PUBLIC; } else if (psiElement.getParent() instanceof PsiClass) { PsiClass ownerClass = (PsiClass) psiElement.getParent(); if (ownerClass.isInterface()) { result = PsiModifier.PUBLIC; } } } return result; }
@Nullable private static PsiAnnotation findContainerAnnotation( PsiModifierListOwner owner, String annotationFQN) { PsiElement element = owner.getParent(); while (element != null) { if (element instanceof PsiModifierListOwner) { PsiAnnotation annotation = AnnotationUtil.findAnnotation((PsiModifierListOwner) element, annotationFQN); if (annotation != null) { return annotation; } } if (element instanceof PsiClassOwner) { String packageName = ((PsiClassOwner) element).getPackageName(); PsiPackage psiPackage = JavaPsiFacade.getInstance(element.getProject()).findPackage(packageName); return AnnotationUtil.findAnnotation(psiPackage, annotationFQN); } element = element.getContext(); } return null; }