| 1 | //===--- Merge.h -------------------------------------------------*- C++-*-===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_MERGE_H |
| 10 | #define |
| 11 | |
| 12 | #include "index/Index.h" |
| 13 | |
| 14 | namespace clang { |
| 15 | namespace clangd { |
| 16 | |
| 17 | // Merge symbols L and R, preferring data from L in case of conflict. |
| 18 | // The two symbols must have the same ID. |
| 19 | // Returned symbol may contain data owned by either source. |
| 20 | Symbol mergeSymbol(const Symbol &L, const Symbol &R); |
| 21 | |
| 22 | // MergedIndex is a composite index based on two provided Indexes: |
| 23 | // - the Dynamic index covers few files, but is relatively up-to-date. |
| 24 | // - the Static index covers a bigger set of files, but is relatively stale. |
| 25 | // The returned index attempts to combine results, and avoid duplicates. |
| 26 | class MergedIndex : public SymbolIndex { |
| 27 | const SymbolIndex *Dynamic, *Static; |
| 28 | |
| 29 | public: |
| 30 | // The constructor does not access the symbols. |
| 31 | // It's safe to inherit from this class and pass pointers to derived members. |
| 32 | MergedIndex(const SymbolIndex *Dynamic, const SymbolIndex *Static) |
| 33 | : Dynamic(Dynamic), Static(Static) {} |
| 34 | |
| 35 | bool fuzzyFind(const FuzzyFindRequest &, |
| 36 | llvm::function_ref<void(const Symbol &)>) const override; |
| 37 | void lookup(const LookupRequest &, |
| 38 | llvm::function_ref<void(const Symbol &)>) const override; |
| 39 | bool refs(const RefsRequest &, |
| 40 | llvm::function_ref<void(const Ref &)>) const override; |
| 41 | bool containedRefs( |
| 42 | const ContainedRefsRequest &, |
| 43 | llvm::function_ref<void(const ContainedRefsResult &)>) const override; |
| 44 | void relations(const RelationsRequest &, |
| 45 | llvm::function_ref<void(const SymbolID &, const Symbol &)>) |
| 46 | const override; |
| 47 | llvm::unique_function<IndexContents(llvm::StringRef) const> |
| 48 | indexedFiles() const override; |
| 49 | size_t estimateMemoryUsage() const override { |
| 50 | return Dynamic->estimateMemoryUsage() + Static->estimateMemoryUsage(); |
| 51 | } |
| 52 | }; |
| 53 | |
| 54 | } // namespace clangd |
| 55 | } // namespace clang |
| 56 | |
| 57 | #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_MERGE_H |
| 58 | |