Boolean (@NotNull PsiReferenceExpression expression, @NotNull PsiField referencedField, boolean acceptQualified) { PsiClass containingClass = referencedField.getContainingClass(); if (containingClass == null) return null; if (expression.getContainingFile() != referencedField.getContainingFile()) return null; TextRange fieldRange = referencedField.getTextRange(); if (fieldRange == null || expression.getTextRange().getStartOffset() >= fieldRange.getEndOffset()) return null; if (!acceptQualified) { if (containingClass.isEnum()) { if (isLegalForwardReferenceInEnum(expression, referencedField, containingClass)) return null; } // simple reference can be illegal (JLS 8.3.3) else if (expression.getQualifierExpression() != null) return null; } PsiField initField = findEnclosingFieldInitializer(expression); PsiClassInitializer classInitializer = findParentClassInitializer(expression); if (initField == null && classInitializer == null) return null; // instance initializers may access static fields boolean isStaticClassInitializer = classInitializer != null && classInitializer.hasModifierProperty(PsiModifier.STATIC); boolean isStaticInitField = initField != null && initField.hasModifierProperty(PsiModifier.STATIC); boolean inStaticContext = isStaticInitField || isStaticClassInitializer; if (!inStaticContext && referencedField.hasModifierProperty(PsiModifier.STATIC)) return null; if (PsiUtil.isOnAssignmentLeftHand(expression) && !PsiUtil.isAccessedForReading(expression)) return null; if (!containingClass.getManager().areElementsEquivalent(containingClass, PsiTreeUtil.getParentOfType(expression, PsiClass.class))) { return null; } return initField != referencedField; }