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
20namespace clang {
21 class ASTUnit;
22 class CIndexer;
23namespace index {
24class CommentToXMLConverter;
25} // namespace index
26} // namespace clang
27
28struct 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
39struct CXTargetInfoImpl {
40 CXTranslationUnit TranslationUnit;
41};
42
43namespace clang {
44namespace cxtu {
45
46CXTranslationUnitImpl *MakeCXTranslationUnit(CIndexer *CIdx,
47 std::unique_ptr<ASTUnit> AU);
48
49static 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.
57bool isASTReadError(ASTUnit *AU);
58
59static 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
70class CXTUOwner {
71 CXTranslationUnitImpl *TU;
72
73public:
74 CXTUOwner(CXTranslationUnitImpl *tu) : TU(tu) { }
75 ~CXTUOwner();
76
77 CXTranslationUnitImpl *getTU() const { return TU; }
78
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