Collection<String> (@Nullable final PsiElement scope) { if (!(scope instanceof PyClass) && !(scope instanceof PyFile) && !(scope instanceof PyFunction)) { return Collections.emptyList(); } final Set<String> variables = new HashSet<>() { @Override public boolean add(String s) { return s != null && super.add(s); } }; scope.acceptChildren(new PyRecursiveElementVisitor() { @Override public void visitPyTargetExpression(@NotNull final PyTargetExpression node) { variables.add(node.getName()); } @Override public void visitPyNamedParameter(@NotNull final PyNamedParameter node) { variables.add(node.getName()); } @Override public void visitPyReferenceExpression(@NotNull PyReferenceExpression node) { if (!node.isQualified()) { variables.add(node.getReferencedName()); } else { super.visitPyReferenceExpression(node); } } @Override public void visitPyFunction(@NotNull final PyFunction node) { variables.add(node.getName()); } @Override public void visitPyClass(@NotNull final PyClass node) { variables.add(node.getName()); } }); return variables; }