std::unique_ptr<FrontendAction> create() override {
SymbolCollector::Options Opts;
Opts.CountReferences = true;
+ Opts.FileFilter = [&](const SourceManager &SM, FileID FID) {
+ const auto *F = SM.getFileEntryForID(FID);
+ if (!F)
+ return false; // Skip invalid files.
+ auto AbsPath = getCanonicalPath(F, SM);
+ if (!AbsPath)
+ return false; // Skip files without absolute path.
+ std::lock_guard<std::mutex> Lock(FilesMu);
+ return Files.insert(*AbsPath).second; // Skip already processed files.
+ };
return createStaticIndexingAction(
Opts,
[&](SymbolSlab S) {
}
},
[&](RefSlab S) {
- std::lock_guard<std::mutex> Lock(SymbolsMu);
+ std::lock_guard<std::mutex> Lock(RefsMu);
for (const auto &Sym : S) {
// Deduplication happens during insertion.
for (const auto &Ref : Sym.second)
}
},
[&](RelationSlab S) {
- std::lock_guard<std::mutex> Lock(SymbolsMu);
+ std::lock_guard<std::mutex> Lock(RelsMu);
for (const auto &R : S) {
Relations.insert(R);
}
private:
IndexFileIn &Result;
+ std::mutex FilesMu;
+ llvm::StringSet<> Files;
std::mutex SymbolsMu;
SymbolSlab::Builder Symbols;
+ std::mutex RefsMu;
RefSlab::Builder Refs;
+ std::mutex RelsMu;
RelationSlab::Builder Relations;
};