xref: /llvm-project/clang/tools/libclang/CXTranslationUnit.h (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
17df92ae9STed Kremenek //===- CXTranslationUnit.h - Routines for manipulating CXTranslationUnits -===//
27df92ae9STed Kremenek //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67df92ae9STed Kremenek //
77df92ae9STed Kremenek //===----------------------------------------------------------------------===//
87df92ae9STed Kremenek //
97df92ae9STed Kremenek // This file defines routines for manipulating CXTranslationUnits.
107df92ae9STed Kremenek //
117df92ae9STed Kremenek //===----------------------------------------------------------------------===//
127df92ae9STed Kremenek 
132f5db8b3SBenjamin Kramer #ifndef LLVM_CLANG_TOOLS_LIBCLANG_CXTRANSLATIONUNIT_H
142f5db8b3SBenjamin Kramer #define LLVM_CLANG_TOOLS_LIBCLANG_CXTRANSLATIONUNIT_H
157df92ae9STed Kremenek 
16256454fdSDmitri Gribenko #include "CLog.h"
17757fcd6dSChandler Carruth #include "CXString.h"
185553d0d4SChandler Carruth #include "clang-c/Index.h"
19c22ea1ceSDmitri Gribenko 
20d36209e3SDmitri Gribenko namespace clang {
21d36209e3SDmitri Gribenko   class ASTUnit;
22d36209e3SDmitri Gribenko   class CIndexer;
239e605113SDmitri Gribenko namespace index {
249e605113SDmitri Gribenko class CommentToXMLConverter;
259e605113SDmitri Gribenko } // namespace index
26d36209e3SDmitri Gribenko } // namespace clang
27d36209e3SDmitri Gribenko 
287df92ae9STed Kremenek struct CXTranslationUnitImpl {
29183436e5SDmitri Gribenko   clang::CIndexer *CIdx;
30d36209e3SDmitri Gribenko   clang::ASTUnit *TheASTUnit;
31b95b3f12SDmitri Gribenko   clang::cxstring::CXStringPool *StringPool;
32d010ba47STed Kremenek   void *Diagnostics;
33d77f6219STed Kremenek   void *OverridenCursorsPool;
349e605113SDmitri Gribenko   clang::index::CommentToXMLConverter *CommentToXML;
35690f0e2fSAlex Lorenz   unsigned ParsingOptions;
36690f0e2fSAlex Lorenz   std::vector<std::string> Arguments;
377df92ae9STed Kremenek };
387df92ae9STed Kremenek 
39485ad425SEmilio Cobos Alvarez struct CXTargetInfoImpl {
40485ad425SEmilio Cobos Alvarez   CXTranslationUnit TranslationUnit;
41485ad425SEmilio Cobos Alvarez };
42485ad425SEmilio Cobos Alvarez 
43769c7bcdSArgyrios Kyrtzidis namespace clang {
44769c7bcdSArgyrios Kyrtzidis namespace cxtu {
45769c7bcdSArgyrios Kyrtzidis 
46ea4395ebSDavid Blaikie CXTranslationUnitImpl *MakeCXTranslationUnit(CIndexer *CIdx,
47ea4395ebSDavid Blaikie                                              std::unique_ptr<ASTUnit> AU);
48769c7bcdSArgyrios Kyrtzidis 
getASTUnit(CXTranslationUnit TU)49c22ea1ceSDmitri Gribenko static inline ASTUnit *getASTUnit(CXTranslationUnit TU) {
502bee6665SArgyrios Kyrtzidis   if (!TU)
5169186e73SCraig Topper     return nullptr;
52d36209e3SDmitri Gribenko   return TU->TheASTUnit;
53c22ea1ceSDmitri Gribenko }
54c22ea1ceSDmitri Gribenko 
55ea4d1c32SDmitri Gribenko /// \returns true if the ASTUnit has a diagnostic about the AST file being
56ea4d1c32SDmitri Gribenko /// corrupted.
57ea4d1c32SDmitri Gribenko bool isASTReadError(ASTUnit *AU);
58ea4d1c32SDmitri Gribenko 
isNotUsableTU(CXTranslationUnit TU)59852d622eSDmitri Gribenko static inline bool isNotUsableTU(CXTranslationUnit TU) {
60256454fdSDmitri Gribenko   return !TU;
61256454fdSDmitri Gribenko }
62256454fdSDmitri Gribenko 
63256454fdSDmitri Gribenko #define LOG_BAD_TU(TU)                                  \
64256454fdSDmitri Gribenko     do {                                                \
65256454fdSDmitri Gribenko       LOG_FUNC_SECTION {                                \
66256454fdSDmitri Gribenko         *Log << "called with a bad TU: " << TU;         \
67256454fdSDmitri Gribenko       }                                                 \
68256454fdSDmitri Gribenko     } while(false)
69256454fdSDmitri Gribenko 
70dc199a31SArgyrios Kyrtzidis class CXTUOwner {
71dc199a31SArgyrios Kyrtzidis   CXTranslationUnitImpl *TU;
72dc199a31SArgyrios Kyrtzidis 
73dc199a31SArgyrios Kyrtzidis public:
CXTUOwner(CXTranslationUnitImpl * tu)74dc199a31SArgyrios Kyrtzidis   CXTUOwner(CXTranslationUnitImpl *tu) : TU(tu) { }
75dc199a31SArgyrios Kyrtzidis   ~CXTUOwner();
76dc199a31SArgyrios Kyrtzidis 
getTU()77dc199a31SArgyrios Kyrtzidis   CXTranslationUnitImpl *getTU() const { return TU; }
78dc199a31SArgyrios Kyrtzidis 
takeTU()79dc199a31SArgyrios Kyrtzidis   CXTranslationUnitImpl *takeTU() {
80dc199a31SArgyrios Kyrtzidis     CXTranslationUnitImpl *retTU = TU;
8169186e73SCraig Topper     TU = nullptr;
82dc199a31SArgyrios Kyrtzidis     return retTU;
83dc199a31SArgyrios Kyrtzidis   }
84dc199a31SArgyrios Kyrtzidis };
85dc199a31SArgyrios Kyrtzidis 
86dc199a31SArgyrios Kyrtzidis 
87ab9db510SAlexander Kornienko }} // end namespace clang::cxtu
88769c7bcdSArgyrios Kyrtzidis 
897df92ae9STed Kremenek #endif
90