docs: private void computeFullEndPositionList(int position) throws IOException {
      if (ignoreSpans != null && !fullEndPositionList.containsKey(position)) {
        // initial fill
        moveTo(position);
        HashSet<Integer> list = baseEndPositionList.get(position);
        if (list != null && !list.isEmpty()) {
          int maxEndPosition = maxBaseEndPosition.get(position);
          HashSet<Integer> checkList = new HashSet<>();
          HashSet<Integer> subCheckList = new HashSet<>();
          checkList.addAll(list);
          int depth = 1;
          while (!checkList.isEmpty()) {
            if (depth > maximumIgnoreLength) {
              checkList.clear();
              subCheckList.clear();
              throw new IOException("too many successive ignores, maximum is "
                  + maximumIgnoreLength);
            } else {
              for (Integer checkItem : checkList) {
                if (fullEndPositionList.get(checkItem) != null) {
                  list.addAll(fullEndPositionList.get(checkItem));
                  maxEndPosition = Math.max(maxEndPosition,
                      maxFullEndPosition.get(checkItem));
                } else {
                  moveTo(checkItem);
                  if (baseEndPositionList.containsKey(checkItem)) {
                    list.addAll(baseEndPositionList.get(checkItem));
                    maxEndPosition = Math.max(maxEndPosition,
                        maxBaseEndPosition.get(checkItem));
                    subCheckList.addAll(baseEndPositionList.get(checkItem));
                  } else {
                    // ready for checkItem
                  }
                }
              }
              checkList.clear();
              checkList.addAll(subCheckList);
              subCheckList.clear();
              depth++;
            }
          }
          fullEndPositionList.put(position, list);
          maxFullEndPosition.put(position, (maxEndPosition - position));
        } else {
          fullEndPositionList.put(position, null);
          maxFullEndPosition.put(position, 0);
        }
      }
    }