fun validatePackageName()

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
  }