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 | void relations(const RelationsRequest &, |
42 | llvm::function_ref<void(const SymbolID &, const Symbol &)>) |
43 | const override; |
44 | llvm::unique_function<IndexContents(llvm::StringRef) const> |
45 | indexedFiles() const override; |
46 | size_t estimateMemoryUsage() const override { |
47 | return Dynamic->estimateMemoryUsage() + Static->estimateMemoryUsage(); |
48 | } |
49 | }; |
50 | |
51 | } // namespace clangd |
52 | } // namespace clang |
53 | |
54 | #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_MERGE_H |
55 | |