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 LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_MERGE_H 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