void (@NotNull PsiField field, @NotNull ProblemsHolder holder) { if (field.hasModifierProperty(PsiModifier.FINAL)) return; final PsiClass psiClass = field.getContainingClass(); if (psiClass == null) return; final PsiClassInitializer[] classInitializers = psiClass.getInitializers(); final boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC); final PsiMethod[] constructors = !isStatic ? psiClass.getConstructors() : PsiMethod.EMPTY_ARRAY; final boolean fieldHasInitializer = field.hasInitializer() && PsiAugmentProvider.canTrustFieldInitializer(field); final int maxPossibleWritesCount = classInitializers.length + (constructors.length != 0 ? 1 : 0) + (fieldHasInitializer ? 1 : 0); if (maxPossibleWritesCount <= 1) return; final PsiClassInitializer initializerBeforeField = PsiTreeUtil.getPrevSiblingOfType(field, PsiClassInitializer.class); final List<FieldWrite> fieldWrites = new ArrayList<>(); // class initializers and field initializer in the program order if (fieldHasInitializer && initializerBeforeField == null) { fieldWrites.add(FieldWrite.createInitializer()); } for (PsiClassInitializer classInitializer : classInitializers) { if (classInitializer.hasModifierProperty(PsiModifier.STATIC) == isStatic) { final List<PsiAssignmentExpression> assignments = collectAssignments(field, classInitializer); if (!assignments.isEmpty()) { boolean isDefinitely = HighlightControlFlowUtil.variableDefinitelyAssignedIn(field, classInitializer.getBody()); if (isDefinitely) { try { ControlFlow flow = HighlightControlFlowUtil.getControlFlowNoConstantEvaluate(classInitializer.getBody()); if (ContainerUtil.exists(ControlFlowUtil.getReadBeforeWrite(flow), read -> (isStatic || ExpressionUtil.isEffectivelyUnqualified(read)) && read.isReferenceTo(field))) { isDefinitely = false; } } catch (AnalysisCanceledException e) { // ignore } } fieldWrites.add(FieldWrite.createAssignments(isDefinitely, assignments)); } } if (fieldHasInitializer && initializerBeforeField == classInitializer) { fieldWrites.add(FieldWrite.createInitializer()); } } Collections.reverse(fieldWrites); boolean wasDefinitelyAssigned = isAssignedInAllConstructors(field, constructors); for (final FieldWrite fieldWrite : fieldWrites) { if (wasDefinitelyAssigned) { if (fieldWrite.isInitializer()) { if (REPORT_REDUNDANT_INITIALIZER) { reportInitializerProblem(field, holder); } } else { for (PsiAssignmentExpression assignment : fieldWrite.getAssignments()) { reportAssignmentProblem(assignment, holder); } } } else if (fieldWrite.isDefinitely()) { wasDefinitelyAssigned = true; } } }