in commons/src/main/kotlin/org/jetbrains/bazel/commons/PackagePathValidator.kt [49:91]
fun validatePackageName(packageName: String): String? {
val len = packageName.length
if (len == 0) {
// Empty package name (//:foo).
return null
}
if (packageName.get(0) == '/') {
return wrapError(packageName, "package names may not start with '/'")
}
if (!ALLOWED_CHARACTERS_IN_PACKAGE_NAME.matchesAllOf(packageName)) {
return wrapError(packageName, PACKAGE_NAME_ERROR)
}
if (packageName.get(len - 1) == '/') {
return wrapError(packageName, "package names may not end with '/'")
}
// Check for empty or dot-only package segment
var nonDot = false
var lastSlash = true
// Going backward and marking the last character as being a / so we detect
// '.' only package segment.
for (i in len - 1 downTo -1) {
val c = if (i >= 0) packageName.get(i) else '/'
if (c == '/') {
if (lastSlash) {
return wrapError(packageName, "package names may not contain '//' path separators")
}
if (!nonDot) {
return wrapError(packageName, PACKAGE_NAME_DOT_ERROR)
}
nonDot = false
lastSlash = true
} else {
if (c != '.') {
nonDot = true
}
lastSlash = false
}
}
return null
}