void (@NotNull PsiElement statement) { BranchingInstruction instruction; final PsiElement finallyBlock = findEnclosingFinallyBlockElement(statement, null); final int finallyStartOffset = finallyBlock == null ? -1 : myCurrentFlow.getStartOffset(finallyBlock); if (finallyBlock != null && finallyStartOffset != -1) { // go out of finally, go to 2nd return after finally block // second return is for return statement called completion instruction = new GoToInstruction(1, BranchingInstruction.Role.END, true); myCurrentFlow.addInstruction(instruction); addElementOffsetLater(finallyBlock, false); } else { instruction = new GoToInstruction(0, BranchingInstruction.Role.END, true); myCurrentFlow.addInstruction(instruction); if (myFinallyBlocks.isEmpty()) { addElementOffsetLater(myCodeFragment, false); } else { instruction.offset = -4; // -4 for return addElementOffsetLater(myFinallyBlocks.peek().getElement(), true); } } }