void (PsiStatement statement, PsiExpression valueExpression, PsiElement exitedStatement) { startElement(statement); generateExpressionInstructions(valueExpression); if (exitedStatement != null) { callFinallyBlocksOnExit(exitedStatement); final Instruction instruction; final PsiElement finallyBlock = findEnclosingFinallyBlockElement(statement, exitedStatement); final int finallyStartOffset = finallyBlock == null ? -1 : myCurrentFlow.getStartOffset(finallyBlock); if (finallyBlock != null && finallyStartOffset != -1) { // go out of finally, use return CallInstruction callInstruction = (CallInstruction)myCurrentFlow.getInstructions().get(finallyStartOffset - 2); instruction = new ReturnInstruction(0, callInstruction); } else { instruction = new GoToInstruction(0, BranchingInstruction.Role.END, PsiTreeUtil.isAncestor(exitedStatement, myCodeFragment, true)); } myCurrentFlow.addInstruction(instruction); // exited statement might be out of control flow analyzed addElementOffsetLater(exitedStatement, false); } finishElement(statement); }