//===--- Symbol.h ------------------------------------------------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_SYMBOL_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_SYMBOL_H #include "index/SymbolID.h" #include "index/SymbolLocation.h" #include "index/SymbolOrigin.h" #include "clang/Index/IndexSymbol.h" #include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/StringSaver.h" namespace clang { namespace clangd { LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(…); /// The class presents a C++ symbol, e.g. class, function. /// /// WARNING: Symbols do not own much of their underlying data - typically /// strings are owned by a SymbolSlab. They should be treated as non-owning /// references. Copies are shallow. /// /// When adding new unowned data fields to Symbol, remember to update: /// - SymbolSlab::Builder in Index.cpp, to copy them to the slab's storage. /// - mergeSymbol in Merge.cpp, to properly combine two Symbols. /// /// A fully documented symbol can be split as: /// size_type std::map<k, t>::count(const K& key) const /// | Return | Scope |Name| Signature | /// We split up these components to allow display flexibility later. struct Symbol { … }; inline Symbol::SymbolFlag operator|(Symbol::SymbolFlag A, Symbol::SymbolFlag B) { … } inline Symbol::SymbolFlag &operator|=(Symbol::SymbolFlag &A, Symbol::SymbolFlag B) { … } llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Symbol &S); llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, Symbol::SymbolFlag); /// Invokes Callback with each StringRef& contained in the Symbol. /// Useful for deduplicating backing strings. template <typename Callback> void visitStrings(Symbol &S, const Callback &CB) { … } /// Computes query-independent quality score for a Symbol. /// This currently falls in the range [1, ln(#indexed documents)]. /// FIXME: this should probably be split into symbol -> signals /// and signals -> score, so it can be reused for Sema completions. float quality(const Symbol &S); /// An immutable symbol container that stores a set of symbols. /// The container will maintain the lifetime of the symbols. class SymbolSlab { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SymbolSlab &Slab); } // namespace clangd } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_SYMBOL_H