void () { final Map<String, Collection<PsiNamedElement>> namedElements = new LinkedHashMap<>(); final List<PyImportedNameDefiner> importedNameDefiners = new ArrayList<>(); final List<Scope> nestedScopes = new ArrayList<>(); final Set<String> globals = new HashSet<>(); final Set<String> nonlocals = new HashSet<>(); final Set<String> augAssignments = new HashSet<>(); final List<PyTargetExpression> targetExpressions = new ArrayList<>(); myFlowOwner.acceptChildren(new PyRecursiveElementVisitor() { @Override public void visitPyTargetExpression(@NotNull PyTargetExpression node) { targetExpressions.add(node); final PsiElement parent = node.getParent(); if (!node.isQualified() && !(parent instanceof PyImportElement)) { super.visitPyTargetExpression(node); } } @Override public void visitPyReferenceExpression(@NotNull PyReferenceExpression node) { if (PyAugAssignmentStatementNavigator.getStatementByTarget(node) != null) { augAssignments.add(node.getName()); } super.visitPyReferenceExpression(node); } @Override public void visitPyGlobalStatement(@NotNull PyGlobalStatement node) { for (PyTargetExpression expression : node.getGlobals()) { final String name = expression.getReferencedName(); globals.add(name); } super.visitPyGlobalStatement(node); } @Override public void visitPyNonlocalStatement(@NotNull PyNonlocalStatement node) { for (PyTargetExpression expression : node.getVariables()) { nonlocals.add(expression.getReferencedName()); } super.visitPyNonlocalStatement(node); } @Override public void visitPyFunction(@NotNull PyFunction node) { for (PyParameter parameter : node.getParameterList().getParameters()) { final PyExpression defaultValue = parameter.getDefaultValue(); if (defaultValue != null) { defaultValue.accept(this); } } visitDecorators(node.getDecoratorList()); super.visitPyFunction(node); } @Override public void visitPyNamedParameter(@NotNull PyNamedParameter node) { processNamedElement(node); } @Override public void visitPyClass(@NotNull PyClass node) { visitDecorators(node.getDecoratorList()); super.visitPyClass(node); } @Override public void visitPyDecoratorList(@NotNull PyDecoratorList node) { } @Override public void visitPyElement(@NotNull PyElement node) { if (node instanceof PsiNamedElement && !(node instanceof PyKeywordArgument)) { processNamedElement((PsiNamedElement)node); } if (node instanceof PyImportedNameDefiner) { importedNameDefiners.add((PyImportedNameDefiner)node); } if (node instanceof ScopeOwner) { final Scope scope = ControlFlowCache.getScope((ScopeOwner)node); nestedScopes.add(scope); } else { super.visitPyElement(node); } } private void visitDecorators(@Nullable PyDecoratorList list) { if (list != null) { for (PyDecorator decorator : list.getDecorators()) { decorator.accept(this); } } } private void processNamedElement(@NotNull PsiNamedElement element) { namedElements.computeIfAbsent(element.getName(), __ -> new LinkedHashSet<>()).add(element); } }); myNamedElements = namedElements; myImportedNameDefiners = importedNameDefiners; myNestedScopes = nestedScopes; myGlobals = globals; myNonlocals = nonlocals; myAugAssignments = augAssignments; myTargetExpressions = targetExpressions; }