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