Fact locatorOf()

in glean/lang/clang/index.cpp [420:448]


  Fact<Buck::Locator> locatorOf(const SourceFile& source) {
    // Parsing source.target as cell//path:name
    const auto slashes = source.target.find("//");
    const size_t cell_len = (slashes == std::string::npos) ? 0 : slashes;
    const size_t path_start = (slashes == std::string::npos) ? 0 : slashes+2;

    const auto colon = source.target.find(':', path_start);
    const size_t path_len = (colon == std::string::npos)
      ? source.target.size() - path_start
      : colon - path_start;
    const size_t name_start = (colon == std::string::npos)
      ? source.target.size()  // substr will return empty string for name
      : colon+1;

    folly::Optional<std::string> cell = (0 < cell_len)
      ? folly::Optional<std::string>(source.target.substr(0, cell_len))
      : folly::none;

    // Enforce policy that buck.Locator{subdir=nothing} means blank_cell_name
    if (cell == blank_cell_name) {
      cell = folly::none;
    }

    return batch.fact<Buck::Locator>(
      maybe(cell),
      source.target.substr(path_start, path_len),
      source.target.substr(name_start)
    );
  }