public Webpath normalize()

in java/io/bazel/rules/closure/Webpath.java [221:277]


  public Webpath normalize() {
    List<String> parts = new ArrayList<>();
    boolean mutated = false;
    int resultLength = 0;
    int mark = 0;
    int index;
    do {
      index = path.indexOf(SEPARATOR, mark);
      String part = path.substring(mark, index == -1 ? path.length() : index + 1);
      switch (part) {
        case CURRENT_DIR:
        case CURRENT_DIR + SEPARATOR:
          if (!parts.isEmpty()) {
            if (parts.get(parts.size() - 1).equals(CURRENT_DIR + SEPARATOR)) {
              resultLength -= parts.remove(parts.size() - 1).length();
            }
            mutated = true;
            break;
          }
          // fallthrough
        case PARENT_DIR:
        case PARENT_DIR + SEPARATOR:
          if (!parts.isEmpty()) {
            if (parts.size() == 1 && parts.get(0).equals(ROOT)) {
              mutated = true;
              break;
            }
            String last = parts.get(parts.size() - 1);
            if (last.equals(CURRENT_DIR + SEPARATOR)) {
              resultLength -= parts.remove(parts.size() - 1).length();
              mutated = true;
            } else if (!last.equals(PARENT_DIR + SEPARATOR)) {
              resultLength -= parts.remove(parts.size() - 1).length();
              mutated = true;
              break;
            }
          }
          // fallthrough
        default:
          if (index != mark || index == 0) {
            parts.add(part);
            resultLength = part.length();
          } else {
            mutated = true;
          }
      }
      mark = index + 1;
    } while (index != -1);
    if (!mutated) {
      return this;
    }
    StringBuilder result = new StringBuilder(resultLength);
    for (String part : parts) {
      result.append(part);
    }
    return new Webpath(result.toString());
  }