void (ScopeOwner owner) { final Instruction[] instructions = ControlFlowCache.getControlFlow(owner).getInstructions(); for (Instruction instruction : instructions) { final PsiElement element = instruction.getElement(); if (element instanceof PyFunction && owner instanceof PyFunction) { if (PyKnownDecoratorUtil.hasUnknownDecorator((PyFunction)element, myTypeEvalContext)) { continue; } if (!myUsedElements.contains(element)) { myUnusedElements.add(element); } } else if (instruction instanceof ReadWriteInstruction readWriteInstruction) { final ReadWriteInstruction.ACCESS access = readWriteInstruction.getAccess(); if (!access.isWriteAccess()) { continue; } final String name = readWriteInstruction.getName(); // Ignore empty, wildcards, global and nonlocal names final Scope scope = ControlFlowCache.getScope(owner); if (name == null || PyNames.UNDERSCORE.equals(name) || scope.isGlobal(name) || scope.isNonlocal(name)) { continue; } if (element instanceof PyTargetExpression && ((PyTargetExpression)element).isQualified()) { continue; } // Ignore underscore-prefixed parameters if (name.startsWith(PyNames.UNDERSCORE) && element instanceof PyParameter) { continue; } // Ignore elements out of scope if (element == null || !PsiTreeUtil.isAncestor(owner, element, false)) { continue; } // Ignore arguments of import statement if (PyImportStatementNavigator.getImportStatementByElement(element) != null) { continue; } if (PyAugAssignmentStatementNavigator.getStatementByTarget(element) != null) { continue; } if (parameterInMethodWithFixedSignature(owner, element)) { continue; } if (PyTypeDeclarationStatementNavigator.isTypeDeclarationTarget(element)) { continue; } if (!myUsedElements.contains(element)) { myUnusedElements.add(element); } } } }