1 //===- CXTranslationUnit.h - Routines for manipulating CXTranslationUnits -===//
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 routines for manipulating CXTranslationUnits.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXTRANSLATIONUNIT_H
14 #define LLVM_CLANG_TOOLS_LIBCLANG_CXTRANSLATIONUNIT_H
15 
16 #include "CLog.h"
17 #include "CXString.h"
18 #include "clang-c/Index.h"
19 
20 namespace clang {
21   class ASTUnit;
22   class CIndexer;
23 namespace index {
24 class CommentToXMLConverter;
25 } // namespace index
26 } // namespace clang
27 
28 struct CXTranslationUnitImpl {
29   clang::CIndexer *CIdx;
30   clang::ASTUnit *TheASTUnit;
31   clang::cxstring::CXStringPool *StringPool;
32   void *Diagnostics;
33   void *OverridenCursorsPool;
34   clang::index::CommentToXMLConverter *CommentToXML;
35   unsigned ParsingOptions;
36   std::vector<std::string> Arguments;
37 };
38 
39 struct CXTargetInfoImpl {
40   CXTranslationUnit TranslationUnit;
41 };
42 
43 namespace clang {
44 namespace cxtu {
45 
46 CXTranslationUnitImpl *MakeCXTranslationUnit(CIndexer *CIdx,
47                                              std::unique_ptr<ASTUnit> AU);
48 
getASTUnit(CXTranslationUnit TU)49 static inline ASTUnit *getASTUnit(CXTranslationUnit TU) {
50   if (!TU)
51     return nullptr;
52   return TU->TheASTUnit;
53 }
54 
55 /// \returns true if the ASTUnit has a diagnostic about the AST file being
56 /// corrupted.
57 bool isASTReadError(ASTUnit *AU);
58 
isNotUsableTU(CXTranslationUnit TU)59 static inline bool isNotUsableTU(CXTranslationUnit TU) {
60   return !TU;
61 }
62 
63 #define LOG_BAD_TU(TU)                                  \
64     do {                                                \
65       LOG_FUNC_SECTION {                                \
66         *Log << "called with a bad TU: " << TU;         \
67       }                                                 \
68     } while(false)
69 
70 class CXTUOwner {
71   CXTranslationUnitImpl *TU;
72 
73 public:
CXTUOwner(CXTranslationUnitImpl * tu)74   CXTUOwner(CXTranslationUnitImpl *tu) : TU(tu) { }
75   ~CXTUOwner();
76 
getTU()77   CXTranslationUnitImpl *getTU() const { return TU; }
78 
takeTU()79   CXTranslationUnitImpl *takeTU() {
80     CXTranslationUnitImpl *retTU = TU;
81     TU = nullptr;
82     return retTU;
83   }
84 };
85 
86 
87 }} // end namespace clang::cxtu
88 
89 #endif
90