private static boolean collectSlashSeparated(@NotNull String str, int startIncl, int endExcl, @NotNull IdConsumer partsConsumer) {
    int partStartIncl = startIncl;
    while (partStartIncl < endExcl) {
      int indexOfSlash = indexOfSlash(str, partStartIncl, endExcl);
      if (indexOfSlash == -1) {
        break;
      }
      if (partStartIncl == indexOfSlash) {
        return false;
      }
      if (!StringUtil.isJavaIdentifier(str, partStartIncl, indexOfSlash)) {
        return false;
      }
      partsConsumer.accept(str, partStartIncl, indexOfSlash);
      partStartIncl = indexOfSlash + 1;
      if (partStartIncl == endExcl) { // '/' is at the end
        return false;
      }
    }
    // handling rest
    if (partStartIncl == 0) {
      if (!StringUtil.isJavaIdentifier(str, 0, str.length())) {
        return false;
      }
      partsConsumer.accept(str, partStartIncl, endExcl);
    } else {
      if (!StringUtil.isJavaIdentifier(str, partStartIncl, endExcl)) {
        return false;
      }
      partsConsumer.accept(str, partStartIncl, endExcl);
    }
    return true;
  }
private static boolean collectSlashSeparated(@NotNull String str, int startIncl, int endExcl, @NotNull IdConsumer partsConsumer)