CIndexer.h revision e722ed6f5464232e23be52f4976312ef526fae99
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- CIndexer.h - Clang-C Source Indexing Library -------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines CIndexer, a subclass of Indexer that provides extra
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functionality needed by the CIndex library.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef LLVM_CLANG_CINDEXER_H
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define LLVM_CLANG_CINDEXER_H
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang-c/Index.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "llvm/ADT/StringRef.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "llvm/Support/Path.h"
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <vector>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  class CrashRecoveryContext;
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class ASTUnit;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass CIndexer {
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool OnlyLocalDecls;
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool DisplayDiagnostics;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned Options; // CXGlobalOptFlags.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::sys::Path ResourcesPath;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string WorkingDir;
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false),
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              Options(CXGlobalOpt_None) { }
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Whether we only want to see "local" declarations (that did not
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  /// come from a previous precompiled header). If false, we want to see all
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// declarations.
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool getOnlyLocalDecls() const { return OnlyLocalDecls; }
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void setOnlyLocalDecls(bool Local = true) { OnlyLocalDecls = Local; }
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool getDisplayDiagnostics() const { return DisplayDiagnostics; }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setDisplayDiagnostics(bool Display = true) {
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DisplayDiagnostics = Display;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  unsigned getCXGlobalOptFlags() const { return Options; }
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void setCXGlobalOptFlags(unsigned options) { Options = options; }
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool isOptEnabled(CXGlobalOptFlags opt) const {
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return Options & opt;
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Get the path of the clang resource files.
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string getClangResourcesPath();
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string &getWorkingDirectory() const { return WorkingDir; }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setWorkingDirectory(const std::string &Dir) { WorkingDir = Dir; }
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /**
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * \brief Given a set of "unsaved" files, create temporary files and
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * construct the clang -cc1 argument list needed to perform the remapping.
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch   *
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch   * \returns true if an error occurred.
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   */
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RemapFiles(unsigned num_unsaved_files,
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                  struct CXUnsavedFile *unsaved_files,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  std::vector<std::string> &RemapArgs,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  std::vector<llvm::sys::Path> &TemporaryFiles);
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Return the current size to request for "safety".
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  unsigned GetSafetyThreadStackSize();
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  /// \brief Set the current size to request for "safety" (or 0, if safety
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  /// threads should not be used).
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SetSafetyThreadStackSize(unsigned Value);
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /// \brief Execution the given code "safely", using crash recovery or safety
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /// threads when possible.
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ///
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  /// \return False if a crash was detected.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RunSafely(llvm::CrashRecoveryContext &CRC,
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                 void (*Fn)(void*), void *UserData, unsigned Size = 0);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  /// \brief Set the thread priority to background.
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /// FIXME: Move to llvm/Support.
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void setThreadBackgroundPriority();
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  /// \brief Print libclang's resource usage to standard error.
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void PrintLibclangResourceUsage(CXTranslationUnit TU);
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  namespace cxindex {
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    void printDiagsToStderr(ASTUnit *Unit);
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)