public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { if (!(file instanceof PsiJavaFile)) return false; if (myUnresolvedReference.isQualified()) return false; final String referenceName = myUnresolvedReference.getReferenceName(); if (referenceName == null) return false; PsiManager manager = file.getManager(); if (!myUnresolvedReference.isValid() || !manager.isInProject(myUnresolvedReference)) return false; PsiElement container = PsiTreeUtil.getParentOfType(myUnresolvedReference, PsiCodeBlock.class, PsiClass.class); if (!(container instanceof PsiCodeBlock)) return false; myOutOfScopeVariable = null; while (container.getParent() instanceof PsiStatement || container.getParent() instanceof PsiCatchSection) container = container.getParent(); container.accept( new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceExpression(PsiReferenceExpression expression) {} @Override public void visitExpression(PsiExpression expression) { // Don't look inside expressions } @Override public void visitLocalVariable(PsiLocalVariable variable) { if (referenceName.equals(variable.getName())) { if (myOutOfScopeVariable == null) { myOutOfScopeVariable = variable; } else { myOutOfScopeVariable = null; // 2 conflict variables } } } }); return myOutOfScopeVariable != null; }