List<DfaInstructionState> (@NotNull DfaMemoryState state, @NotNull DataFlowInterpreter interpreter, DfaControlTransferValue.@NotNull TransferTarget target, @NotNull FList<Trap> nextTraps) { if (!(target instanceof ExceptionTransfer)) { return DfaControlTransferValue.dispatch(state, interpreter, target, nextTraps); } state.emptyStack(); TypeConstraint throwableType = ((ExceptionTransfer)target).getThrowable(); List<DfaInstructionState> result = new ArrayList<>(); for (var entry : myClauses.entrySet()) { ControlFlow.ControlFlowOffset jumpOffset = entry.getValue(); CatchClauseDescriptor catchSection = entry.getKey(); for (TypeConstraint caughtType : catchSection.constraints()) { TypeConstraint caught = Objects.requireNonNull(throwableType).meet(caughtType); if (caught != TypeConstraints.BOTTOM) { result.add(new DfaInstructionState(interpreter.getInstruction(jumpOffset.getInstructionOffset()), stateForCatchClause(state, interpreter, catchSection.parameter(), caught))); } TypeConstraint negated = caughtType.tryNegate(); if (negated != null) { throwableType = throwableType.meet(negated); if (throwableType == TypeConstraints.BOTTOM) return result; } } } return ContainerUtil.concat(result, DfaControlTransferValue.dispatch(state, interpreter, new ExceptionTransfer(throwableType), nextTraps)); }