boolean (@NotNull final PsiElement searched, @NotNull final PsiElement target) { ScopeOwner scopeOwner = ScopeUtil.getScopeOwner(searched); Ref<Boolean> definedBefore = Ref.create(false); if (scopeOwner != null && scopeOwner == ScopeUtil.getScopeOwner(target)) { Instruction[] instructions = ControlFlowCache.getControlFlow(scopeOwner).getInstructions(); int index = ControlFlowUtil.findInstructionNumberByElement(instructions, target); if (index >= 0) { ControlFlowUtil.iteratePrev(index, instructions, instruction -> { if (instruction.getElement() == searched) { boolean isImport = searched instanceof PyImportedNameDefiner; boolean isWriteAccess = instruction instanceof ReadWriteInstruction && ((ReadWriteInstruction)instruction).getAccess().isWriteAccess(); if (isImport || isWriteAccess) { definedBefore.set(true); return ControlFlowUtil.Operation.BREAK; } } return ControlFlowUtil.Operation.NEXT; }); } } return definedBefore.get(); }