boolean (@NotNull final PsiScopeProcessor processor, @NotNull ResolveState resolveState, PsiElement lastParent, @NotNull PsiElement place) { final List<String> dunderAll = getDunderAll(); final List<String> remainingDunderAll = dunderAll == null ? null : new ArrayList<>(dunderAll); PsiScopeProcessor wrapper = new DelegatingScopeProcessor(processor) { @Override public boolean execute(@NotNull PsiElement element, @NotNull ResolveState state) { if (!super.execute(element, state)) return false; if (remainingDunderAll != null && element instanceof PyElement) { remainingDunderAll.remove(((PyElement)element).getName()); } return true; } }; Set<PyFile> pyFiles = resolveState.get(PROCESSED_FILES); if (pyFiles == null) { pyFiles = new HashSet<>(); resolveState = resolveState.put(PROCESSED_FILES, pyFiles); } if (pyFiles.contains(this)) return true; pyFiles.add(this); for (PyClass c : getTopLevelClasses()) { if (c == lastParent) continue; if (!wrapper.execute(c, resolveState)) return false; } for (PyFunction f : getTopLevelFunctions()) { if (f == lastParent) continue; if (!wrapper.execute(f, resolveState)) return false; } for (PyTargetExpression e : getTopLevelAttributes()) { if (e == lastParent) continue; if (!wrapper.execute(e, resolveState)) return false; } for (PyImportElement e : getImportTargets()) { if (e == lastParent) continue; if (!wrapper.execute(e, resolveState)) return false; } for (PyFromImportStatement e : getFromImports()) { if (e == lastParent) continue; if (!e.processDeclarations(wrapper, resolveState, null, this)) return false; } if (remainingDunderAll != null) { for (String s : remainingDunderAll) { if (!PyNames.isIdentifier(s)) { continue; } if (!processor.execute(new LightNamedElement(myManager, PythonLanguage.getInstance(), s), resolveState)) return false; } } return true; }