@Override
      public void visitConditionalThrowToInstruction(ConditionalThrowToInstruction instruction, int offset, int nextOffset) {
        if (nextOffset > flow.getSize()) nextOffset = flow.getSize();
        if (offset > endOffset) return;
        int throwToOffset = instruction.offset;
        boolean isNormal;
        //if it is not PsiThrowStatement and the next step is the last step,
        //it is possible to complete it normally.
        if (throwToOffset == nextOffset && nextOffset == endOffset &&
            offset + 1 == nextOffset && !(flow.getElement(offset) instanceof PsiThrowStatement)) {
          isNormal = true;
        }
        else if (throwToOffset == nextOffset) {
          isNormal = throwToOffset <= endOffset && !isLeaf(nextOffset) && canCompleteNormally[nextOffset];
        }
        else {
          //if the next step is the last step, it is certainly completed normally in `not-throw` branch
          //otherwise, take completion from the next offset
          isNormal = nextOffset == endOffset || canCompleteNormally[nextOffset];
        }
        canCompleteNormally[offset] |= isNormal;
      }
@Override
      public void visitConditionalThrowToInstruction(ConditionalThrowToInstruction instruction, int offset, int nextOffset)