boolean (@NotNull PsiField field, @NotNull PsiReferenceExpression expression, @NotNull PsiElement codeBlock) { PsiClass aClass = field.getContainingClass(); if (aClass == null) return false; boolean isFieldStatic = field.hasModifierProperty(PsiModifier.STATIC); PsiMember enclosingConstructorOrInitializer = PsiUtil.findEnclosingConstructorOrInitializer(expression); if (!isFieldStatic) { // constructor that delegates to another constructor cannot assign final fields if (enclosingConstructorOrInitializer instanceof PsiMethod) { PsiMethodCallExpression chainedCall = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor((PsiMethod)enclosingConstructorOrInitializer); if (JavaPsiConstructorUtil.isChainedConstructorCall(chainedCall)) { return true; } } } // field can get assigned in other field initializers or in class initializers List<PsiMember> members = new ArrayList<>(Arrays.asList(aClass.getFields())); if (enclosingConstructorOrInitializer != null && aClass.getManager().areElementsEquivalent(enclosingConstructorOrInitializer.getContainingClass(), aClass)) { members.addAll(Arrays.asList(aClass.getInitializers())); members.sort(PsiUtil.BY_POSITION); } for (PsiMember member : members) { if (member == field) continue; PsiElement context = member instanceof PsiField ? ((PsiField)member).getInitializer() : ((PsiClassInitializer)member).getBody(); if (context != null && member.hasModifierProperty(PsiModifier.STATIC) == isFieldStatic && !variableDefinitelyNotAssignedIn(field, context)) { return context != codeBlock; } } return false; }