//===--- XRefs.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 // //===----------------------------------------------------------------------===// // // Features that traverse references between symbols. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_XREFS_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_XREFS_H #include "FormattedString.h" #include "Path.h" #include "Protocol.h" #include "index/Index.h" #include "index/SymbolLocation.h" #include "clang/AST/Type.h" #include "clang/Format/Format.h" #include "clang/Index/IndexSymbol.h" #include "llvm/ADT/Optional.h" #include "llvm/Support/raw_ostream.h" #include namespace clang { namespace clangd { class ParsedAST; // Describes where a symbol is declared and defined (as far as clangd knows). // There are three cases: // - a declaration only, no definition is known (e.g. only header seen) // - a declaration and a distinct definition (e.g. function declared in header) // - a declaration and an equal definition (e.g. inline function, or class) // For some types of symbol, e.g. macros, definition == declaration always. struct LocatedSymbol { // The (unqualified) name of the symbol. std::string Name; // The canonical or best declaration: where most users find its interface. Location PreferredDeclaration; // Where the symbol is defined, if known. May equal PreferredDeclaration. llvm::Optional Definition; }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, const LocatedSymbol &); /// Get definition of symbol at a specified \p Pos. /// Multiple locations may be returned, corresponding to distinct symbols. std::vector locateSymbolAt(ParsedAST &AST, Position Pos, const SymbolIndex *Index = nullptr); /// Returns highlights for all usages of a symbol at \p Pos. std::vector findDocumentHighlights(ParsedAST &AST, Position Pos); /// Contains detailed information about a Symbol. Especially useful when /// generating hover responses. It can be rendered as a hover panel, or /// embedding clients can use the structured information to provide their own /// UI. struct HoverInfo { /// Represents parameters of a function, a template or a macro. /// For example: /// - void foo(ParamType Name = DefaultValue) /// - #define FOO(Name) /// - template class Foo {}; struct Param { /// The pretty-printed parameter type, e.g. "int", or "typename" (in /// TemplateParameters) llvm::Optional Type; /// None for unnamed parameters. llvm::Optional Name; /// None if no default is provided. llvm::Optional Default; }; /// For a variable named Bar, declared in clang::clangd::Foo::getFoo the /// following fields will hold: /// - NamespaceScope: clang::clangd:: /// - LocalScope: Foo::getFoo:: /// - Name: Bar /// Scopes might be None in cases where they don't make sense, e.g. macros and /// auto/decltype. /// Contains all of the enclosing namespaces, empty string means global /// namespace. llvm::Optional NamespaceScope; /// Remaining named contexts in symbol's qualified name, empty string means /// symbol is not local. std::string LocalScope; /// Name of the symbol, does not contain any "::". std::string Name; llvm::Optional SymRange; /// Scope containing the symbol. e.g, "global namespace", "function x::Y" /// - None for deduced types, e.g "auto", "decltype" keywords. SymbolKind Kind; std::string Documentation; /// Source code containing the definition of the symbol. std::string Definition; /// Pretty-printed variable type. /// Set only for variables. llvm::Optional Type; /// Set for functions and lambadas. llvm::Optional ReturnType; /// Set for functions, lambdas and macros with parameters. llvm::Optional> Parameters; /// Set for all templates(function, class, variable). llvm::Optional> TemplateParameters; /// Contains the evaluated value of the symbol if available. llvm::Optional Value; /// Produce a user-readable information. FormattedString present() const; }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, const HoverInfo::Param &); inline bool operator==(const HoverInfo::Param &LHS, const HoverInfo::Param &RHS) { return std::tie(LHS.Type, LHS.Name, LHS.Default) == std::tie(RHS.Type, RHS.Name, RHS.Default); } /// Get the hover information when hovering at \p Pos. llvm::Optional getHover(ParsedAST &AST, Position Pos, format::FormatStyle Style, const SymbolIndex *Index); /// Returns reference locations of the symbol at a specified \p Pos. /// \p Limit limits the number of results returned (0 means no limit). std::vector findReferences(ParsedAST &AST, Position Pos, uint32_t Limit, const SymbolIndex *Index = nullptr); /// Get info about symbols at \p Pos. std::vector getSymbolInfo(ParsedAST &AST, Position Pos); /// Find the record type references at \p Pos. const CXXRecordDecl *findRecordTypeAt(ParsedAST &AST, Position Pos); /// Given a record type declaration, find its base (parent) types. std::vector typeParents(const CXXRecordDecl *CXXRD); /// Get type hierarchy information at \p Pos. llvm::Optional getTypeHierarchy( ParsedAST &AST, Position Pos, int Resolve, TypeHierarchyDirection Direction, const SymbolIndex *Index = nullptr, PathRef TUPath = PathRef{}); void resolveTypeHierarchy(TypeHierarchyItem &Item, int ResolveLevels, TypeHierarchyDirection Direction, const SymbolIndex *Index); /// Retrieves the deduced type at a given location (auto, decltype). /// Retuns None unless SourceLocationBeg starts an auto/decltype token. /// It will return the underlying type. llvm::Optional getDeducedType(ParsedAST &AST, SourceLocation SourceLocationBeg); /// Check if there is a deduced type at a given location (auto, decltype). /// SourceLocationBeg must point to the first character of the token bool hasDeducedType(ParsedAST &AST, SourceLocation SourceLocationBeg); /// Returns all decls that are referenced in the \p FD except local symbols. llvm::DenseSet getNonLocalDeclRefs(ParsedAST &AST, const FunctionDecl *FD); } // namespace clangd } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_XREFS_H