boolean (@NotNull PsiVariable variable, @NotNull ControlFlow flow) { class MyVisitor extends InstructionClientVisitor<Boolean> { final PsiManager psiManager = variable.getManager(); // true if from this point below there may be branch with variable assignment private final boolean[] maybeAssigned = new boolean[flow.getSize() + 1]; @Override public void visitWriteVariableInstruction(WriteVariableInstruction instruction, int offset, int nextOffset) { if (nextOffset > flow.getSize()) nextOffset = flow.getSize(); boolean assigned = psiManager.areElementsEquivalent(instruction.variable, variable) || maybeAssigned[nextOffset]; maybeAssigned[offset] |= assigned; } @Override public void visitThrowToInstruction(ThrowToInstruction instruction, int offset, int nextOffset) { if (nextOffset > flow.getSize()) nextOffset = flow.getSize(); boolean assigned = !isLeaf(nextOffset) && maybeAssigned[nextOffset]; maybeAssigned[offset] |= assigned; } @Override public void visitConditionalThrowToInstruction(ConditionalThrowToInstruction instruction, int offset, int nextOffset) { if (nextOffset > flow.getSize()) nextOffset = flow.getSize(); int throwToOffset = instruction.offset; boolean assigned = throwToOffset == nextOffset ? !isLeaf(nextOffset) && maybeAssigned[nextOffset] : maybeAssigned[nextOffset]; maybeAssigned[offset] |= assigned; } @Override public void visitInstruction(Instruction instruction, int offset, int nextOffset) { if (nextOffset > flow.getSize()) nextOffset = flow.getSize(); boolean assigned = maybeAssigned[nextOffset]; maybeAssigned[offset] |= assigned; } @Override @NotNull public Boolean getResult() { return !maybeAssigned[0]; } } MyVisitor visitor = new MyVisitor(); depthFirstSearch(flow, visitor); return visitor.getResult().booleanValue(); }