diff options
| author | Nathan Ridge <zeratul976@hotmail.com> | 2019-06-15 02:26:47 +0000 |
|---|---|---|
| committer | Nathan Ridge <zeratul976@hotmail.com> | 2019-06-15 02:26:47 +0000 |
| commit | f1e6f5713caac5da97dcde34a7042061bb0e6afa (patch) | |
| tree | 3749a6a8cc46c27e65c31811fd870f2c3f9056f8 /clang-tools-extra/clangd/index/MemIndex.cpp | |
| parent | 0b1ea8cb2825cb51c1c2f6dfa9bef95f4a450f93 (diff) | |
| download | bcm5719-llvm-f1e6f5713caac5da97dcde34a7042061bb0e6afa.tar.gz bcm5719-llvm-f1e6f5713caac5da97dcde34a7042061bb0e6afa.zip | |
[clangd] Index API and implementations for relations
Summary:
This builds on the relations support added in D59407, D62459,
and D62471 to expose relations in SymbolIndex and its
implementations.
Reviewers: kadircet
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D62839
llvm-svn: 363481
Diffstat (limited to 'clang-tools-extra/clangd/index/MemIndex.cpp')
| -rw-r--r-- | clang-tools-extra/clangd/index/MemIndex.cpp | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/clang-tools-extra/clangd/index/MemIndex.cpp b/clang-tools-extra/clangd/index/MemIndex.cpp index 582091f07ab..2f3ff684531 100644 --- a/clang-tools-extra/clangd/index/MemIndex.cpp +++ b/clang-tools-extra/clangd/index/MemIndex.cpp @@ -16,12 +16,13 @@ namespace clang { namespace clangd { -std::unique_ptr<SymbolIndex> MemIndex::build(SymbolSlab Slab, RefSlab Refs) { +std::unique_ptr<SymbolIndex> MemIndex::build(SymbolSlab Slab, RefSlab Refs, + RelationSlab Relations) { // Store Slab size before it is moved. const auto BackingDataSize = Slab.bytes() + Refs.bytes(); auto Data = std::make_pair(std::move(Slab), std::move(Refs)); - return llvm::make_unique<MemIndex>(Data.first, Data.second, std::move(Data), - BackingDataSize); + return llvm::make_unique<MemIndex>(Data.first, Data.second, Relations, + std::move(Data), BackingDataSize); } bool MemIndex::fuzzyFind( @@ -84,8 +85,29 @@ void MemIndex::refs(const RefsRequest &Req, } } +void MemIndex::relations( + const RelationsRequest &Req, + llvm::function_ref<void(const SymbolID &, const Symbol &)> Callback) const { + uint32_t Remaining = + Req.Limit.getValueOr(std::numeric_limits<uint32_t>::max()); + for (const SymbolID &Subject : Req.Subjects) { + LookupRequest LookupReq; + auto It = Relations.find(std::make_pair(Subject, Req.Predicate)); + if (It != Relations.end()) { + for (const auto &Obj : It->second) { + if (Remaining > 0) { + --Remaining; + LookupReq.IDs.insert(Obj); + } + } + } + lookup(LookupReq, [&](const Symbol &Object) { Callback(Subject, Object); }); + } +} + size_t MemIndex::estimateMemoryUsage() const { - return Index.getMemorySize() + Refs.getMemorySize() + BackingDataSize; + return Index.getMemorySize() + Refs.getMemorySize() + + Relations.getMemorySize() + BackingDataSize; } } // namespace clangd |

