diff --git a/clang-tools-extra/clangd/index/Ref.cpp b/clang-tools-extra/clangd/index/Ref.cpp index 3f0fea5602a1..2b21f3cbca56 100644 --- a/clang-tools-extra/clangd/index/Ref.cpp +++ b/clang-tools-extra/clangd/index/Ref.cpp @@ -33,9 +33,12 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Ref &R) { void RefSlab::Builder::insert(const SymbolID &ID, const Ref &S) { auto &M = Refs[ID]; - M.push_back(S); - M.back().Location.FileURI = - UniqueStrings.save(M.back().Location.FileURI).data(); + if (M.count(S)) + return; + Ref R = S; + R.Location.FileURI = + UniqueStrings.save(R.Location.FileURI).data(); + M.insert(std::move(R)); } RefSlab RefSlab::Builder::build() && { @@ -45,11 +48,7 @@ RefSlab RefSlab::Builder::build() && { Result.reserve(Refs.size()); size_t NumRefs = 0; for (auto &Sym : Refs) { - auto &SymRefs = Sym.second; - llvm::sort(SymRefs); - // FIXME: do we really need to dedup? - SymRefs.erase(std::unique(SymRefs.begin(), SymRefs.end()), SymRefs.end()); - + std::vector SymRefs(Sym.second.begin(), Sym.second.end()); NumRefs += SymRefs.size(); Result.emplace_back(Sym.first, llvm::ArrayRef(SymRefs).copy(Arena)); } diff --git a/clang-tools-extra/clangd/index/Ref.h b/clang-tools-extra/clangd/index/Ref.h index 738be7b92e1e..389e276b382e 100644 --- a/clang-tools-extra/clangd/index/Ref.h +++ b/clang-tools-extra/clangd/index/Ref.h @@ -16,6 +16,7 @@ #include "llvm/Support/StringSaver.h" #include "llvm/Support/raw_ostream.h" #include +#include #include namespace clang { @@ -67,6 +68,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Ref &); /// Filenames are deduplicated. class RefSlab { public: + // Refs are stored in order. using value_type = std::pair>; using const_iterator = std::vector::const_iterator; using iterator = const_iterator; @@ -99,7 +101,7 @@ public: private: llvm::BumpPtrAllocator Arena; llvm::UniqueStringSaver UniqueStrings; // Contents on the arena. - llvm::DenseMap> Refs; + llvm::DenseMap> Refs; }; private: diff --git a/clang-tools-extra/clangd/indexer/IndexerMain.cpp b/clang-tools-extra/clangd/indexer/IndexerMain.cpp index 2ad9867705e9..d012825101bf 100644 --- a/clang-tools-extra/clangd/indexer/IndexerMain.cpp +++ b/clang-tools-extra/clangd/indexer/IndexerMain.cpp @@ -56,7 +56,7 @@ public: [&](RefSlab S) { std::lock_guard Lock(SymbolsMu); for (const auto &Sym : S) { - // No need to merge as currently all Refs are from main file. + // Deduplication happens during insertion. for (const auto &Ref : Sym.second) Refs.insert(Sym.first, Ref); }