1 //===- CIndexer.h - Clang-C Source Indexing Library -------------*- 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 // This file defines CIndexer, a subclass of Indexer that provides extra 10 // functionality needed by the CIndex library. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CINDEXER_H 15 #define LLVM_CLANG_TOOLS_LIBCLANG_CINDEXER_H 16 17 #include "clang-c/Index.h" 18 #include "clang/Frontend/PCHContainerOperations.h" 19 #include "llvm/ADT/STLExtras.h" 20 #include <utility> 21 22 namespace llvm { 23 class CrashRecoveryContext; 24 } 25 26 namespace clang { 27 class ASTUnit; 28 class MacroInfo; 29 class MacroDefinitionRecord; 30 class SourceLocation; 31 class Token; 32 class IdentifierInfo; 33 34 class CIndexer { 35 bool OnlyLocalDecls; 36 bool DisplayDiagnostics; 37 bool StorePreamblesInMemory = false; 38 unsigned Options; // CXGlobalOptFlags. 39 40 std::string ResourcesPath; 41 std::shared_ptr<PCHContainerOperations> PCHContainerOps; 42 43 std::string ToolchainPath; 44 45 std::string PreambleStoragePath; 46 std::string InvocationEmissionPath; 47 48 public: 49 CIndexer(std::shared_ptr<PCHContainerOperations> PCHContainerOps = 50 std::make_shared<PCHContainerOperations>()) OnlyLocalDecls(false)51 : OnlyLocalDecls(false), DisplayDiagnostics(false), 52 Options(CXGlobalOpt_None), PCHContainerOps(std::move(PCHContainerOps)) { 53 } 54 55 /// Whether we only want to see "local" declarations (that did not 56 /// come from a previous precompiled header). If false, we want to see all 57 /// declarations. getOnlyLocalDecls()58 bool getOnlyLocalDecls() const { return OnlyLocalDecls; } 59 void setOnlyLocalDecls(bool Local = true) { OnlyLocalDecls = Local; } 60 getDisplayDiagnostics()61 bool getDisplayDiagnostics() const { return DisplayDiagnostics; } 62 void setDisplayDiagnostics(bool Display = true) { 63 DisplayDiagnostics = Display; 64 } 65 getPCHContainerOperations()66 std::shared_ptr<PCHContainerOperations> getPCHContainerOperations() const { 67 return PCHContainerOps; 68 } 69 getCXGlobalOptFlags()70 unsigned getCXGlobalOptFlags() const { return Options; } setCXGlobalOptFlags(unsigned options)71 void setCXGlobalOptFlags(unsigned options) { Options = options; } 72 isOptEnabled(CXGlobalOptFlags opt)73 bool isOptEnabled(CXGlobalOptFlags opt) const { 74 return Options & opt; 75 } 76 77 /// Get the path of the clang resource files. 78 const std::string &getClangResourcesPath(); 79 80 StringRef getClangToolchainPath(); 81 setStorePreamblesInMemory(bool StoreInMemory)82 void setStorePreamblesInMemory(bool StoreInMemory) { 83 StorePreamblesInMemory = StoreInMemory; 84 } getStorePreamblesInMemory()85 bool getStorePreamblesInMemory() const { return StorePreamblesInMemory; } 86 setPreambleStoragePath(StringRef Str)87 void setPreambleStoragePath(StringRef Str) { 88 PreambleStoragePath = Str.str(); 89 } 90 getPreambleStoragePath()91 StringRef getPreambleStoragePath() const { return PreambleStoragePath; } 92 setInvocationEmissionPath(StringRef Str)93 void setInvocationEmissionPath(StringRef Str) { 94 InvocationEmissionPath = std::string(Str); 95 } 96 getInvocationEmissionPath()97 StringRef getInvocationEmissionPath() const { return InvocationEmissionPath; } 98 }; 99 100 /// Logs information about a particular libclang operation like parsing to 101 /// a new file in the invocation emission path. 102 class LibclangInvocationReporter { 103 public: 104 enum class OperationKind { ParseOperation, CompletionOperation }; 105 106 LibclangInvocationReporter(CIndexer &Idx, OperationKind Op, 107 unsigned ParseOptions, 108 llvm::ArrayRef<const char *> Args, 109 llvm::ArrayRef<std::string> InvocationArgs, 110 llvm::ArrayRef<CXUnsavedFile> UnsavedFiles); 111 ~LibclangInvocationReporter(); 112 113 private: 114 std::string File; 115 }; 116 117 /// Return the current size to request for "safety". 118 unsigned GetSafetyThreadStackSize(); 119 120 /// Set the current size to request for "safety" (or 0, if safety 121 /// threads should not be used). 122 void SetSafetyThreadStackSize(unsigned Value); 123 124 /// Execution the given code "safely", using crash recovery or safety 125 /// threads when possible. 126 /// 127 /// \return False if a crash was detected. 128 bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn, 129 unsigned Size = 0); 130 131 /// Set the thread priority to background. 132 /// FIXME: Move to llvm/Support. 133 void setThreadBackgroundPriority(); 134 135 /// Print libclang's resource usage to standard error. 136 void PrintLibclangResourceUsage(CXTranslationUnit TU); 137 138 namespace cxindex { 139 void printDiagsToStderr(ASTUnit *Unit); 140 141 /// If \c MacroDefLoc points at a macro definition with \c II as 142 /// its name, this retrieves its MacroInfo. 143 MacroInfo *getMacroInfo(const IdentifierInfo &II, 144 SourceLocation MacroDefLoc, CXTranslationUnit TU); 145 146 /// Retrieves the corresponding MacroInfo of a MacroDefinitionRecord. 147 const MacroInfo *getMacroInfo(const MacroDefinitionRecord *MacroDef, 148 CXTranslationUnit TU); 149 150 /// If \c Loc resides inside the definition of \c MI and it points at 151 /// an identifier that has ever been a macro name, this returns the latest 152 /// MacroDefinitionRecord for that name, otherwise it returns NULL. 153 MacroDefinitionRecord *checkForMacroInMacroDefinition(const MacroInfo *MI, 154 SourceLocation Loc, 155 CXTranslationUnit TU); 156 157 /// If \c Tok resides inside the definition of \c MI and it points at 158 /// an identifier that has ever been a macro name, this returns the latest 159 /// MacroDefinitionRecord for that name, otherwise it returns NULL. 160 MacroDefinitionRecord *checkForMacroInMacroDefinition(const MacroInfo *MI, 161 const Token &Tok, 162 CXTranslationUnit TU); 163 } 164 } 165 166 #endif 167