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());
}