Set<PsiVariable> (@NotNull List<? extends PsiExpression> occurrences) { Set<PsiVariable> variables = new HashSet<>(); Ref<Boolean> refFailed = new Ref<>(Boolean.FALSE); JavaRecursiveElementWalkingVisitor visitor = new JavaRecursiveElementWalkingVisitor() { @Override public void visitReferenceElement(@NotNull PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); PsiElement resolved = reference.resolve(); if (PsiUtil.isJvmLocalVariable(resolved)) { variables.add((PsiVariable)resolved); } else if (resolved instanceof PsiVariable && !((PsiVariable)resolved).hasModifierProperty(PsiModifier.FINAL)) { refFailed.set(Boolean.TRUE); stopWalking(); } } }; for (PsiExpression occurrence : occurrences) { occurrence.accept(visitor); if (refFailed.get()) { return null; } } return variables; }