xref: /aosp_15_r20/external/clang/tools/libclang/CXTranslationUnit.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- CXTranslationUnit.h - Routines for manipulating CXTranslationUnits -===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file defines routines for manipulating CXTranslationUnits.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXTRANSLATIONUNIT_H
15*67e74705SXin Li #define LLVM_CLANG_TOOLS_LIBCLANG_CXTRANSLATIONUNIT_H
16*67e74705SXin Li 
17*67e74705SXin Li #include "CLog.h"
18*67e74705SXin Li #include "CXString.h"
19*67e74705SXin Li #include "clang-c/Index.h"
20*67e74705SXin Li 
21*67e74705SXin Li namespace clang {
22*67e74705SXin Li   class ASTUnit;
23*67e74705SXin Li   class CIndexer;
24*67e74705SXin Li namespace index {
25*67e74705SXin Li class CommentToXMLConverter;
26*67e74705SXin Li } // namespace index
27*67e74705SXin Li } // namespace clang
28*67e74705SXin Li 
29*67e74705SXin Li struct CXTranslationUnitImpl {
30*67e74705SXin Li   clang::CIndexer *CIdx;
31*67e74705SXin Li   clang::ASTUnit *TheASTUnit;
32*67e74705SXin Li   clang::cxstring::CXStringPool *StringPool;
33*67e74705SXin Li   void *Diagnostics;
34*67e74705SXin Li   void *OverridenCursorsPool;
35*67e74705SXin Li   clang::index::CommentToXMLConverter *CommentToXML;
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li namespace clang {
39*67e74705SXin Li namespace cxtu {
40*67e74705SXin Li 
41*67e74705SXin Li CXTranslationUnitImpl *MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *AU);
42*67e74705SXin Li 
getASTUnit(CXTranslationUnit TU)43*67e74705SXin Li static inline ASTUnit *getASTUnit(CXTranslationUnit TU) {
44*67e74705SXin Li   if (!TU)
45*67e74705SXin Li     return nullptr;
46*67e74705SXin Li   return TU->TheASTUnit;
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li /// \returns true if the ASTUnit has a diagnostic about the AST file being
50*67e74705SXin Li /// corrupted.
51*67e74705SXin Li bool isASTReadError(ASTUnit *AU);
52*67e74705SXin Li 
isNotUsableTU(CXTranslationUnit TU)53*67e74705SXin Li static inline bool isNotUsableTU(CXTranslationUnit TU) {
54*67e74705SXin Li   return !TU;
55*67e74705SXin Li }
56*67e74705SXin Li 
57*67e74705SXin Li #define LOG_BAD_TU(TU)                                  \
58*67e74705SXin Li     do {                                                \
59*67e74705SXin Li       LOG_FUNC_SECTION {                                \
60*67e74705SXin Li         *Log << "called with a bad TU: " << TU;         \
61*67e74705SXin Li       }                                                 \
62*67e74705SXin Li     } while(false)
63*67e74705SXin Li 
64*67e74705SXin Li class CXTUOwner {
65*67e74705SXin Li   CXTranslationUnitImpl *TU;
66*67e74705SXin Li 
67*67e74705SXin Li public:
CXTUOwner(CXTranslationUnitImpl * tu)68*67e74705SXin Li   CXTUOwner(CXTranslationUnitImpl *tu) : TU(tu) { }
69*67e74705SXin Li   ~CXTUOwner();
70*67e74705SXin Li 
getTU()71*67e74705SXin Li   CXTranslationUnitImpl *getTU() const { return TU; }
72*67e74705SXin Li 
takeTU()73*67e74705SXin Li   CXTranslationUnitImpl *takeTU() {
74*67e74705SXin Li     CXTranslationUnitImpl *retTU = TU;
75*67e74705SXin Li     TU = nullptr;
76*67e74705SXin Li     return retTU;
77*67e74705SXin Li   }
78*67e74705SXin Li };
79*67e74705SXin Li 
80*67e74705SXin Li 
81*67e74705SXin Li }} // end namespace clang::cxtu
82*67e74705SXin Li 
83*67e74705SXin Li #endif
84