10a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//===- CXTranslationUnit.h - Routines for manipulating CXTranslationUnits -===//
20a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//
30a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//                     The LLVM Compiler Infrastructure
40a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//
50a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek// This file is distributed under the University of Illinois Open Source
60a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek// License. See LICENSE.TXT for details.
70a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//
80a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//===----------------------------------------------------------------------===//
90a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//
100a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek// This file defines routines for manipulating CXTranslationUnits.
110a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//
120a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek//===----------------------------------------------------------------------===//
130a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek
140a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek#ifndef LLVM_CLANG_CXTRANSLATIONUNIT_H
150a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek#define LLVM_CLANG_CXTRANSLATIONUNIT_H
160a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "CLog.h"
189c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko#include "CXString.h"
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang-c/Index.h"
205694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko
21e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenkonamespace clang {
22e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  class ASTUnit;
23e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  class CIndexer;
2486cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenkonamespace index {
2586cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenkoclass CommentToXMLConverter;
2686cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko} // namespace index
27e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko} // namespace clang
28e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko
290a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenekstruct CXTranslationUnitImpl {
308c718e7d87018919b5b84b0d545fe477b2d532d1Dmitri Gribenko  clang::CIndexer *CIdx;
31e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  clang::ASTUnit *TheASTUnit;
329c48d16a11872624410ab3a5944edcba0f32818cDmitri Gribenko  clang::cxstring::CXStringPool *StringPool;
33153221717e39ce41323d5bc6b8b8bf130923c1bdTed Kremenek  void *Diagnostics;
34bbf66ca1dad17773cc682d69b8482c4e179aeaebTed Kremenek  void *OverridenCursorsPool;
3586cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko  clang::index::CommentToXMLConverter *CommentToXML;
360a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek};
370a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek
389049cf6cb468c856888e88251dab659955fa767eArgyrios Kyrtzidisnamespace clang {
399049cf6cb468c856888e88251dab659955fa767eArgyrios Kyrtzidisnamespace cxtu {
409049cf6cb468c856888e88251dab659955fa767eArgyrios Kyrtzidis
41e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri GribenkoCXTranslationUnitImpl *MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *AU);
425694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko
435694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenkostatic inline ASTUnit *getASTUnit(CXTranslationUnit TU) {
4484347225fcf5aae5ff982e94f4c95548ae26b846Argyrios Kyrtzidis  if (!TU)
45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return nullptr;
46e42e578ad8a36ad5bd06c8a3110cbd3119aaee36Dmitri Gribenko  return TU->TheASTUnit;
475694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko}
485694feb5ccd6eb862cb600b55753cecc13794471Dmitri Gribenko
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \returns true if the ASTUnit has a diagnostic about the AST file being
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// corrupted.
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool isASTReadError(ASTUnit *AU);
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic inline bool isNotUsableTU(CXTranslationUnit TU) {
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return !TU;
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define LOG_BAD_TU(TU)                                  \
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    do {                                                \
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      LOG_FUNC_SECTION {                                \
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        *Log << "called with a bad TU: " << TU;         \
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }                                                 \
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } while(false)
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisclass CXTUOwner {
654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTranslationUnitImpl *TU;
664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidispublic:
684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTUOwner(CXTranslationUnitImpl *tu) : TU(tu) { }
694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ~CXTUOwner();
704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTranslationUnitImpl *getTU() const { return TU; }
724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTranslationUnitImpl *takeTU() {
744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    CXTranslationUnitImpl *retTU = TU;
75ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    TU = nullptr;
764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return retTU;
774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis};
794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
819049cf6cb468c856888e88251dab659955fa767eArgyrios Kyrtzidis}} // end namespace clang::cxtu
829049cf6cb468c856888e88251dab659955fa767eArgyrios Kyrtzidis
830a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenek#endif
84