//===--- Headers.h - Include headers -----------------------------*- 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_HEADERS_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_HEADERS_H #include "Protocol.h" #include "SourceCode.h" #include "index/Symbol.h" #include "support/Path.h" #include "clang/Basic/FileEntry.h" #include "clang/Basic/TokenKinds.h" #include "clang/Format/Format.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/Preprocessor.h" #include "clang/Tooling/Inclusions/HeaderIncludes.h" #include "clang/Tooling/Inclusions/StandardLibrary.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSet.h" #include "llvm/Support/Error.h" #include "llvm/Support/FileSystem/UniqueID.h" #include <optional> #include <string> namespace clang { namespace clangd { /// Returns true if \p Include is literal include like "path" or <path>. bool isLiteralInclude(llvm::StringRef Include); /// Represents a header file to be #include'd. struct HeaderFile { … }; /// A header and directives as stored in a Symbol. struct SymbolInclude { … }; /// Creates a `HeaderFile` from \p Header which can be either a URI or a literal /// include. llvm::Expected<HeaderFile> toHeaderFile(llvm::StringRef Header, llvm::StringRef HintPath); // Returns include headers for \p Sym sorted by popularity. If two headers are // equally popular, prefer the shorter one. llvm::SmallVector<SymbolInclude, 1> getRankedIncludes(const Symbol &Sym); // An #include directive that we found in the main file. struct Inclusion { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Inclusion &); bool operator==(const Inclusion &LHS, const Inclusion &RHS); // Contains information about one file in the build graph and its direct // dependencies. Doesn't own the strings it references (IncludeGraph is // self-contained). struct IncludeGraphNode { … }; // FileURI and FileInclusions are references to keys of the map containing // them. // Important: The graph generated by those callbacks might contain cycles, self // edges and multi edges. IncludeGraph; inline IncludeGraphNode::SourceFlag operator|(IncludeGraphNode::SourceFlag A, IncludeGraphNode::SourceFlag B) { … } inline bool operator&(IncludeGraphNode::SourceFlag A, IncludeGraphNode::SourceFlag B) { … } inline IncludeGraphNode::SourceFlag & operator|=(IncludeGraphNode::SourceFlag &A, IncludeGraphNode::SourceFlag B) { … } // Information captured about the inclusion graph in a translation unit. // This includes detailed information about the direct #includes, and summary // information about all transitive includes. // // It should be built incrementally with collectIncludeStructureCallback(). // When we build the preamble, we capture and store its include structure along // with the preamble data. When we use the preamble, we can copy its // IncludeStructure and use another collectIncludeStructureCallback() to fill // in any non-preamble inclusions. class IncludeStructure { … }; // Calculates insertion edit for including a new header in a file. class IncludeInserter { … }; } // namespace clangd } // namespace clang namespace llvm { // Support HeaderIDs as DenseMap keys. template <> struct DenseMapInfo<clang::clangd::IncludeStructure::HeaderID> { … }; } // namespace llvm #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_HEADERS_H