boolean (@NotNull ControlFlow flow, @Nullable PsiElement startElement, @NotNull PsiElement enclosingCodeFragment, @NotNull PsiVariable variable) { PsiManager psiManager = variable.getManager(); for (PsiElement element = startElement; element != null && element != enclosingCodeFragment; element = element.getParent()) { if (element instanceof PsiCodeBlock) { final PsiElement parent = element.getParent(); if (parent instanceof PsiTryStatement) { final PsiTryStatement tryStatement = (PsiTryStatement)parent; if (tryStatement.getTryBlock() == element) { final PsiCodeBlock finallyBlock = tryStatement.getFinallyBlock(); if (finallyBlock != null) { final List<Instruction> instructions = flow.getInstructions(); final int startOffset = flow.getStartOffset(finallyBlock); final int endOffset = flow.getEndOffset(finallyBlock); LOG.assertTrue(startOffset >= 0, "flow start"); LOG.assertTrue(endOffset <= instructions.size(), "flow end"); for (int i = startOffset; i < endOffset; i++) { final Instruction instruction = instructions.get(i); if (instruction instanceof ReadVariableInstruction && psiManager.areElementsEquivalent(((ReadVariableInstruction)instruction).variable, variable)) { return true; } } } } } } } return false; }