void (@NotNull PsiTryStatement statement) { startElement(statement); PsiResourceList resourceList = statement.getResourceList(); PsiCodeBlock tryBlock = statement.getTryBlock(); PsiCodeBlock finallyBlock = statement.getFinallyBlock(); EnterFinallyTrap finallyDescriptor = finallyBlock != null ? new EnterFinallyTrap(finallyBlock, getStartOffset(finallyBlock)) : null; if (finallyDescriptor != null) { pushTrap(finallyDescriptor); } PsiCatchSection[] sections = statement.getCatchSections(); if (sections.length > 0) { LinkedHashMap<CatchClauseDescriptor, ControlFlowOffset> clauses = new LinkedHashMap<>(); for (PsiCatchSection section : sections) { PsiCodeBlock catchBlock = section.getCatchBlock(); if (catchBlock != null) { clauses.put(new JavaCatchClauseDescriptor(section), getStartOffset(catchBlock)); } } pushTrap(new TryCatchTrap(statement, clauses)); } processTryWithResources(resourceList, tryBlock); InstructionTransfer gotoEnd = createTransfer(statement, tryBlock); FList<Trap> singleFinally = FList.createFromReversed(ContainerUtil.createMaybeSingletonList(finallyDescriptor)); controlTransfer(gotoEnd, singleFinally); if (sections.length > 0) { popTrap(TryCatchTrap.class); } for (PsiCatchSection section : sections) { PsiCodeBlock catchBlock = section.getCatchBlock(); if (catchBlock != null) { visitCodeBlock(catchBlock); } controlTransfer(gotoEnd, singleFinally); } if (finallyBlock != null) { popTrap(EnterFinallyTrap.class); pushTrap(new InsideFinallyTrap(finallyBlock)); finallyBlock.accept(this); controlTransfer(new ExitFinallyTransfer(finallyDescriptor), FList.emptyList()); popTrap(InsideFinallyTrap.class); } finishElement(statement); }