xref: /llvm-project/clang/tools/libclang/CIndexer.h (revision 55f7e00afc56c68421220d60d29c079b58fe9c79)
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