void (@NotNull PsiReferenceExpression expression) { if (myBodyContainsForbiddenRefs) return; super.visitReferenceExpression(expression); if (!(expression.getParent() instanceof PsiMethodCallExpression)) { final PsiMember member = PsiTreeUtil.getParentOfType(myAnonymousClass, PsiMember.class); if (member instanceof PsiField || member instanceof PsiClassInitializer) { final PsiElement resolved = expression.resolve(); final PsiClass memberContainingClass = member.getContainingClass(); if (resolved instanceof PsiField && memberContainingClass != null && PsiTreeUtil.isAncestor(((PsiField)resolved).getContainingClass(), memberContainingClass, false) && expression.getQualifierExpression() == null) { final PsiExpression initializer = ((PsiField)resolved).getInitializer(); if (initializer == null || resolved == member || initializer.getTextOffset() > myAnonymousClass.getTextOffset() && ((PsiField)resolved).hasModifierProperty(PsiModifier.STATIC) == member.hasModifierProperty(PsiModifier.STATIC)) { myBodyContainsForbiddenRefs = true; } } } else { final PsiMethod method = PsiTreeUtil.getParentOfType(myAnonymousClass, PsiMethod.class); if (method != null && method.isConstructor()) { final PsiElement resolved = expression.resolve(); if (resolved instanceof PsiField && ((PsiField)resolved).hasModifierProperty(PsiModifier.FINAL) && ((PsiField)resolved).getInitializer() == null && ((PsiField)resolved).getContainingClass() == method.getContainingClass()) { try { final PsiCodeBlock constructorBody = method.getBody(); if (constructorBody != null) { final ControlFlow flow = HighlightControlFlowUtil.getControlFlowNoConstantEvaluate(constructorBody); final int startOffset = flow.getStartOffset(myAnonymousClass); final Collection<PsiVariable> writtenVariables = ControlFlowUtil.getWrittenVariables(flow, 0, startOffset, false); if (!writtenVariables.contains(resolved)) { myBodyContainsForbiddenRefs = true; } } } catch (AnalysisCanceledException e) { myBodyContainsForbiddenRefs = true; } } } } } }