CIndexer.h revision f962eb4dde12366c8617d0b9958b9ed70a328f21
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- CIndexer.h - Clang-C Source Indexing Library -------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines CIndexer, a subclass of Indexer that provides extra
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// functionality needed by the CIndex library.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_CINDEXER_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_CINDEXER_H
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang-c/Index.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/StringRef.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "llvm/Support/Path.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector>
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace llvm {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class CrashRecoveryContext;
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace clang {
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CIndexer {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool OnlyLocalDecls;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool DisplayDiagnostics;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned Options; // CXGlobalOptFlags.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  llvm::sys::Path ResourcesPath;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string WorkingDir;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CIndexer() : OnlyLocalDecls(false), DisplayDiagnostics(false),
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              Options(CXGlobalOpt_None) { }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /// \brief Whether we only want to see "local" declarations (that did not
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// come from a previous precompiled header). If false, we want to see all
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// declarations.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool getOnlyLocalDecls() const { return OnlyLocalDecls; }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setOnlyLocalDecls(bool Local = true) { OnlyLocalDecls = Local; }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool getDisplayDiagnostics() const { return DisplayDiagnostics; }
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void setDisplayDiagnostics(bool Display = true) {
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DisplayDiagnostics = Display;
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  unsigned getCXGlobalOptFlags() const { return Options; }
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void setCXGlobalOptFlags(unsigned options) { Options = options; }
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool isOptEnabled(CXGlobalOptFlags opt) const {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return Options & opt;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /// \brief Get the path of the clang resource files.
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string getClangResourcesPath();
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string &getWorkingDirectory() const { return WorkingDir; }
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void setWorkingDirectory(const std::string &Dir) { WorkingDir = Dir; }
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /**
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * \brief Given a set of "unsaved" files, create temporary files and
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * construct the clang -cc1 argument list needed to perform the remapping.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   *
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   * \returns true if an error occurred.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RemapFiles(unsigned num_unsaved_files,
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  struct CXUnsavedFile *unsaved_files,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  std::vector<std::string> &RemapArgs,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  std::vector<llvm::sys::Path> &TemporaryFiles);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Return the current size to request for "safety".
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned GetSafetyThreadStackSize();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Set the current size to request for "safety" (or 0, if safety
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// threads should not be used).
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSafetyThreadStackSize(unsigned Value);
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  /// \brief Execution the given code "safely", using crash recovery or safety
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  /// threads when possible.
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ///
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  /// \return False if a crash was detected.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RunSafely(llvm::CrashRecoveryContext &CRC,
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 void (*Fn)(void*), void *UserData, unsigned Size = 0);
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  /// \brief Set the thread priority to background.
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  /// FIXME: Move to llvm/Support.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void setThreadBackgroundPriority();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Print libclang's resource usage to standard error.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintLibclangResourceUsage(CXTranslationUnit TU);
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)